4. diel - Layouty v Jave (druhýkrát)
Vitajte v pokračovaní minulého dielu, ktorý opisoval prvé 4 layouty (FlowLayout, BoxLayout, BorderLayout a CardLayout). Dnes sa pozrieme ako fungujú zvyšné layouty a ukážeme si ich využitie.
GridBagLayout
Tento layout je jedným z najviac zložitých layoutov, ktoré Java poskytuje. Nebudeme sa preto učiť všetky nastavenia, ktoré tento layout má, ale len tá základná, ktoré nám budú bohato stačiť.
Tento layout používa tzv. Bunky (cells), ktoré majú vlastné rovnakú výšku i šírku. konštruktor:
Container pane = this.getContentPane(); pane.setLayout(new GridBagLayout()); GridBagConstraints g = new GridBagConstraints();
metódy:
- gridx - určuje v koľkom stĺpci sa má prvok vyskytnúť
- gridy - určuje v koľkom riadku sa má prvok vyskytnúť
- gridwidth - určuje cez koľko stĺpcov sa má komponent roztiahnuť
- gridheight - určuje cez koľko riadkov sa má komponent roztiahnuť
- fill - určuje výplň priestoru. Má 4 parametre (NONE - predvolené, HORIZONTAL - vytvorí komponenty dostatočne široký na pokrytie plochy a nemení jeho výšku, VERTICAL - vytvorí komponenty dostatočne vysoké a nezmení jeho šírku, BOTH - celkom vyplní svoju plochu)
- anchor - definuje, na ktorom mieste sa má komponent zobraziť. Ako parametre môžete uviesť nasledujúce možnosti:
- ipadx - určuje vnitří odsadenie (výplň). Napr. ak bude mať komponent šírku 30px a nastavíme ipadx = 10, pridá sa výplň na oboch bočných stranách 10px, takže celkový priestor bude činiť 50px.
- iPad - pracuje rovnako ako ipadx, akurát vertikálne.
- weightx, weight - nastavuje priestor medzi komponentom a okrajom kontajnera, v ktorom je komponent (určujú sa čísla z rozsahu 0,0 až 1,0)
- insets - padding. Celým zápisom - insets (Botton, left, right, top);
1 príklad (falošná klávesnica):
trieda MyFrame:
import javax.swing.*; import javax.swing.border.*; // importotváno kvůli rámu import java.awt.*; import java.awt.event.*; // importováno kvůli nastavení událostí public class MyFrame extends JFrame { JButton c,v,b,n,m,alt,mezernik,enter; public MyFrame() { this.setTitle("cardLayout"); this.setSize(400, 200); this.setKomponents(); } public void setKomponents(){ Container pane = this.getContentPane(); pane.setLayout(new GridBagLayout()); GridBagConstraints g = new GridBagConstraints(); c = new JButton("c"); g.fill = GridBagConstraints.HORIZONTAL; g.gridx = 0; g.gridy = 0; pane.add(c, g); v = new JButton("v"); g.fill = GridBagConstraints.HORIZONTAL; g.gridx = 1; g.gridy = 0; pane.add(v, g); b = new JButton("b"); g.fill = GridBagConstraints.HORIZONTAL; g.gridx = 2; g.gridy = 0; pane.add(b, g); n = new JButton("n"); g.fill = GridBagConstraints.HORIZONTAL; g.gridx = 3; g.gridy = 0; pane.add(n, g); m = new JButton("m"); g.fill = GridBagConstraints.HORIZONTAL; g.gridx = 4; g.gridy = 0; pane.add(m, g); enter = new JButton("ENTER"); g.fill = GridBagConstraints.HORIZONTAL; g.gridx = 5; g.gridy = 0; g.gridwidth = 2; g.gridheight = 2; g.ipadx = 30; g.ipady = 30; g.insets = new Insets(0,20,0,0); pane.add(enter, g); alt = new JButton("alt"); g.fill = GridBagConstraints.HORIZONTAL; g.gridx = 0; g.gridy = 1; g.insets = new Insets(0,0,0,0); g.gridheight = 1; g.gridwidth = 1; g.ipadx = 0; g.ipady = 0; pane.add(alt, g); mezernik = new JButton("mezernik"); g.fill = GridBagConstraints.HORIZONTAL; g.gridx = 1; g.gridy = 1; g.gridwidth = 5; pane.add(mezernik, g); } public static Frame nastav(){ MyFrame i = new MyFrame(); i.setVisible(true); i.setLocationRelativeTo(null); i.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); return i; } }
trieda Štart:
public class Start { public static void main(String args[]) { MyFrame.nastav(); } }
Ešte jedna poznámka: Ak nastavíte nejaké komponente nejakú vlastnosť (napr. G.gridwidth = 5), musíte u ďalšie komponenty túto vlastnosť zase zrušiť (pokiaľ teda chcete) g.gridwidth = 5. Inak by sa všetky komponenty roztiahli cez 5 stĺpcov.
Tak to by bolo k tomuto ťažkému layoutu všetko. Myslím, že ste radi. Naučiť sa tento layout dá veľa zabrať, ale ak s ním viete, dokážete perfektne umiestniť svoje komponenty.
GridLayout
Vďaka tomuto layoutu rozdelíme panel na niekoľko vždy rovnako veľkých častí, ktoré dostanú maximálnu možnú veľkosť. Jednoducho veľkosť okna sa vydelí počtom buniek, ktoré vytvoríme. Rozhodne je tento layout jednoduchý a príjemný na použitie.
konštruktor:
Container pane = this.getContentPane(); pane.setLayout(new GridLayout(řádky, sloupce));
Jednoduchý príklad:
Container pane = this.getContentPane(); pane.setLayout(new GridLayout(2, 2)); JButton a = new JButton("a"); JButton b = new JButton("b"); JButton c = new JButton("c"); JButton d = new JButton("d"); pane.add(a); pane.add(b); pane.add(c); pane.add(d);
GroupLayout
Tento layout pracuje oddelene s vertikálnym a horizontálnym rozloženie. Je definovaný pre každú dimenziu samostatne. To znamená, že každá komponenta musí byť definovaná 2x.
Ďalej tento layout používa dva parametre: sequential (sekvenčné) - komponenty sú usporiadané jedna po druhej. Poloha jednotlivých komponentov je definovaná ako relatívna vzhľadom k predchádzajúcej komponente. parallel (paralelný) - komponenty sú usporiadané pod seba v rovnakom priestore. Môže nadobúdať hodnú:
- baseline: predvolené
- top: od zhora
- bottom: od zdola
Pozdĺž vodorovnej osi môžu byť zarovnané:
- left: vľavo
- right: vpravo
- centier: na stred
Gaps (medzery) - Pomocou medzier možno riadiť vzdialenosť medzi jednotlivými komponentmi. Môžeme nastaviť aj automatické medzery. Veľkosti týchto medzier sa vypočítajú dynamicky na základe celkovej veľkosti. Slúži na to nasledujúce príkazy:
- layout.setAutoCreateGaps (true);
- layout.setAutoCreateContainerGaps (true);
Tieto metódy musíte vždy zavolať, aby ste mohli nastaviť nasledujúce funkcie: addPreferredGap (LayoutStyle.ComponentPlacement.param); param:
- RELATED - použitie pri vodorovnom nastavení
- UNRELATED - vzdialenosť je o niečo málo větčí než u RELATED
- Indent - používa sa u horizontálneho nastavenia, kedy je buď horné alebo spodné komponenta umiestnená s odsadením.
Zarovnanie - slúži na to príkaz Alignment.param:
- LEADING - hore
- Trailing - dole
- CENTER - doprostred
- BASELINE - základné nastavenie
Pre úplnosť a ľahké pochopenie prikladám jednoduchý príklad is menovkami.
trieda MyFrame:
import java.awt.*; import javax.swing.*; public class MyFrame extends JFrame { JButton a,s,d,f,g,h; public MyFrame() { this.setSize(400,400); this.setTitle("GroupLayout"); this.setKomponents(); } public void setKomponents(){ /** * nastavení tlačítek */ a = new JButton("a"); s = new JButton("s"); d = new JButton("d"); f = new JButton("f"); g = new JButton("g"); h = new JButton("h"); /** * konstruktor GroupLayoutu */ Container layout = this.getContentPane(); GroupLayout gl = new GroupLayout (layout); layout.setLayout(gl); /** * nastavení automatických mezer */ gl.setAutoCreateGaps(true); gl.setAutoCreateContainerGaps(true); /** * rozvržení komponent */ gl.setHorizontalGroup( // horizontální nastavení gl.createSequentialGroup() // vytvorení sekvenční skupiny, kterou jmse si již popsali .addComponent(a) .addComponent(s) .addComponent(d) .addGroup(gl.createParallelGroup(GroupLayout.Alignment.LEADING)) // přidání paralelních skupin, o kterýcg jsme si již také říkali .addComponent(f) .addComponent(g) .addGroup(gl.createParallelGroup(GroupLayout.Alignment.TRAILING)) .addComponent(h) ); gl.setVerticalGroup( // vertikální nastavení gl.createSequentialGroup() .addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(a) .addComponent(s) .addComponent(d)) .addGroup(gl.createParallelGroup(GroupLayout.Alignment.BASELINE) .addComponent(f) .addComponent(g)) .addComponent(h) ); } public static Frame nastav(){ MyFrame m = new MyFrame(); m.setLocationRelativeTo(null); m.setVisible(true); return m; } }
Všetko spustíme cez triedu Štart:
public class Start { public static void main(String args[]){ MyFrame.nastav(); } }
Ako sa teda tento layout tvorí máte popísané. Ešte uvediem celý príkaz, ktorým môžeme komponenty pridať. Vyzerá takto:
addComponent (Component comp, int min, int pref, int max);
Nakoniec len uvediem metódy ktoré nám vráti nastavenej veľkosti:
- getMinimumSize () - vráti minimálna veľkosť komponenty
- getPreferredSize () - vráti preferovanú veľkosť komponenty
- getMaximumSize () - vráti maximálna veľkosť komponenty