Layouty v Java Swing
V dnešnom tutoriále si popíšeme prácu s tzv. Layouty. Java má pre lepšiu prácu s komponentmi k dispozícii 8 layoutov. Každý má svoj vlastný účel a hodí sa na niečo iné. Ich zoznam je nasledovné:
- FlowLayout
- BoxLayout
- BorderLayout
- CardLayout
- GridBagLayout
- GridLayout
- GroupLayout
- SpringLayout
Všetky vyššie spomínané layouty si postupne popíšeme a pokúsim sa spomenúť hlavne ich výhody.
FlowLayout
Tento layout stavia komponenty vedľa seba na riadok. Ak šírka komponentov presiahne šírku okna, riadok sa zalomia a komponenty sa začnú radiť na ďalšom riadku.
konštruktor:
FlowLayout fl = new FlowLayout(); // základní nastavení komponenty centruje na střed FlowLayout fl = new FlowLayout(argument); //druhá verze konstruktoru
Argument môže nadobúdať nasledujúcich hodnôt:
- FlowLayout.LEFT = komponenty sa radí od ľavej strany.
- FlowLayout.RIGHT = komponenty sa radí na pravú stranu.
- FlowLayout.CENTER = komponenty sa radí na stred. (Základné nastavenie)
Existujú ešte argumenty (FlowLayout.LEADING - radenie od hornej strany a FlowLayout.TRAILING - radenie od dolnej strany).
FlowLayout fl = new FlowLayout(argument, int horizontal, int vertical); // tretí verze konstruktoru.
- horizontal = vodorovná medzera medzi jednotlivými komponentmi a medzera medzi komponentmi a postranným rámom kontajnera.
- vertical = zvislá medzera medzi komponentmi a horným rámom kontajnera.
BoxLayout
Tento layout rovná komponenty vedľa seba, alebo za sebou podľa nastavenia.
konštruktor:
Container pane = this.getContentPane(); pane.setLayout(new BoxLayout(pane, args));
args = rozloženie komponentov. Môže nadobúdať nasledujúcich hodnôt:
- BoxLayout.PAGE_AXIS - zoradia komponenty od zhora nadol.
- BoxLayout.LINE_AXIS - zoradia komponenty vedľa seba.
vlastnosti:
rigid area = pevná plocha - použijeme, ak chceme zaplniť veľkosť medzi dvoma komponentmi. Slúži na to príkaz: Box.createRigidArea (new Dimension (x, y)); Skúsme si nasledujúci príklad:
Container pane = this.getContentPane(); pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS)); JButton prvni = new JButton("prvni"); JButton druhy = new JButton("druhy"); pane.add(prvni); pane.add(Box.createRigidArea(new Dimension(5,10))); pane.add(druhy);
glue - Použijeme, keď chceme komponenty od seba roztiahnuť. Každú komponent na inú stranu. Slúži na to dva príkazy:
- Box.createHorizontalGlue (); // vodorovné odsadenie
- Box.createVerticalGlue (); // zvislé odsadenie
Opäť uvediem príklad:
Container pane = this.getContentPane(); pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS)); JButton prvni = new JButton("prvni"); JButton druhy = new JButton("druhy"); pane.add(prvni); pane.add(Box.createVerticalGlue()); pane.add(druhy);
custom Box.Filler - nastavuje sa tu minimálna, preferovaná a maximálna veľkosť. napr:
Container pane = this.getContentPane(); pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS)); pane.add(prvni); Dimension min = new Dimension(5, 5O); Dimension pref = new Dimension(5, 100); Dimension max = new Dimension(20, 100); pane.add(new Box.Filler(min, pref, max)); pane.add(druhy);
BorderLayout
BorderLayout je rozdelený na 5 častí (tzv. Oblasti), do ktorých môžeme pridávať komponenty a to nasledujúce:
- PAGE_START
- LINE_START
- CENTRUM
- LINE_END
- PAGE_END
Pre lepšiu predstavu vám prikladám obrázok, ktorý vystihuje rozloženie všetkých piatich častí BorderLayoutu.
Tento layout funguje tak, že oblasť CENTRUM sa roztiahne toľko, koľko jej je dovolené a ostatné oblasti sa roztiahnu len natoľko, koľko je potrebné. Ukážeme si ako to vyzerá v praxi.
Container pane = this.getContentPane(); pane.setLayout(new BorderLayout()); JButton prvni = new JButton("prvni"); JButton druhy = new JButton("druhy"); JButton treti = new JButton("treti"); pane.add(prvni, BorderLayout.PAGE_START); pane.add(druhy, BorderLayout.CENTER); pane.add(treti, BorderLayout.LINE_END);
Tenhto layout je veľa používaný, pretože do jednotlivých častí môžeme pridať iné layouty. Napr do časti LINE_END môžeme pridať BoxLayout. Do časti PAGE_START môžeme pridať CardLayout atď.
CardLayout
Tento layout slúži na prepínanie komponentov, ktoré zdieľa v jednom programe rovnaký priestor. Vidieť je len jeden panel. Pokiaľ si do panelu s cardLayoutem uložíme treba 10 panelov, ktoré budú obsahovať rozdielne komponenty, môžeme prepínať, ale viditeľný bude vždy len jeden.
Tentoraz uvediem trochu rozsiahlejšie príklad. Dúfam, že to z neho pochopíte. Najskôr si napíšeme triedu MyFrame, v ktorej si zadefinujeme náš formulár.
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 { JPanel card; JPanel hlavniPanel; JPanel panel1, panel3; JPanel panel2; CardLayout cards; JButton dalsi,predchozi; JLabel a; JButton o, but; public MyFrame() { this.setTitle("cardLayout"); this.setSize(500, 300); this.setKomponents(); this.setListeners(); } public void setKomponents(){ Container pane = this.getContentPane(); pane.setLayout(new BorderLayout()); Border outline = BorderFactory.createLineBorder(Color.black); // nastavení borderu this.hlavniPanel = new JPanel(); this.hlavniPanel.setBorder(outline); this.dalsi = new JButton(">>"); this.predchozi = new JButton("<<"); this.hlavniPanel.add(this.predchozi); this.hlavniPanel.add(this.dalsi); pane.add(this.hlavniPanel, BorderLayout.PAGE_START); cards = new CardLayout(); card = new JPanel(); card.setLayout(cards); cards.show(card, "Vybíráme"); /** * definice panelů a komponentů uvnitř CardLayoutu */ panel1 = new JPanel(); panel1.setBackground(Color.YELLOW); this.a = new JLabel("blablabla"); this.a.setBackground(Color.GREEN); panel1.add(this.a); panel2 = new JPanel(); panel2.setBackground(Color.RED); this.o = new JButton("pokus"); panel2.add(this.o); panel3 = new JPanel(); panel3.setBackground(Color.BLUE); this.but = new JButton("pokusU2"); panel3.add(this.but); /** * přidání panelů */ card.add(panel1, "první"); card.add(panel2, "druhý"); card.add(panel3, "třetí"); pane.add(card, BorderLayout.CENTER); } public void setListeners(){ this.dalsi.addActionListener( new ActionListener() { public void actionPerformed(ActionEvent e){ cards.next(card); } }); this.predchozi.addActionListener( new ActionListener(){ public void actionPerformed(ActionEvent e){ cards.previous(card); } }); } public static Frame nastav(){ MyFrame i = new MyFrame(); i.setLocationRelativeTo(null); i.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); i.setVisible(true); return i; } }
Potom spustíme program cez triedu Štart, ktorú si teraz nastavíme:
public class Start { public static void main(String args[]){ MyFrame.nastav(); } }
Môžeme si samozrejme nastaviť viac druhov ovládanie. Prepínať panely po jednom, alebo dokonca na začiatok a na koniec. To sa môže hodiť, ak by náš Cardlayout obsahoval väčšie množstvo panelov. Pre prehľadnosť vypíšem všetky funkcie:
- first () - prepne na prvý panel
- previous () - prepne na predchádzajúcu panel
- next () - prepne na nasledujúce panel
- last () - prepne na posledný panel
- show () - môžeme volať konkrétny panel pomocou príkazov show (param); param = názov panelu, ktorý sa má zobraziť.
Všetky obrázky ktoré som použil (okrem obrázku BorderLayoutu), pochádza zo stránky http://docs.oracle.com/.../visual.html
Ostatní layouty si ukážeme v ďalšom diele. pre úplnosť prikladám zdrojový kód k poslednej ukážke práce s CardLayoutem.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 345x (5.13 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java