IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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

FlowLayout v Jave - Java Swing bez grafického návrhára

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

BoxLayout v Jave - Java Swing bez grafického návrhára

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.createRigi­dArea (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.createHori­zontalGlue (); // vodorovné odsadenie
  • Box.createVer­ticalGlue (); // 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.

BorderLayout v Jave - Java Swing bez grafického návrhára

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

CardLayout v Jave - Java Swing bez grafického návrhára

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é 339x (5.13 kB)
Aplikácia je vrátane zdrojových kódov v jazyku Java

 

Predchádzajúci článok
Java GUI - udalosť
Všetky články v sekcii
Java Swing bez grafického návrhára
Preskočiť článok
(neodporúčame)
Layouty v Jave (druhýkrát)
Článok pre vás napísal Milan Gallas
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Autor se věnuje programování, hardwaru a počítačovým sítím.
Aktivity