GUI v Javě
Z MiS
				
				
				(Rozdíly mezi verzemi)
				
																
				
				
								
				|  (→Třída JLabel:  Zjednodušení popisu JLabel) | |||
| (Není zobrazeno 26 mezilehlých verzí od 1 uživatele.) | |||
| Řádka 1: | Řádka 1: | ||
| − | [[Category:VSE]] | + | [[Category:VSE]][[Category:Škola]][[Category:Informatika]][[Category:Programování]][[Category:Java]][[Category:GUI]] | 
| − | [[Category:Informatika]] | + | |
| − | [[Category:Programování]] | + | |
| − | [[Category:Java]] | + | |
| − | + | Následující poznámky jsou jen velmi stručnou osnovou. Možností při vytváření grafického rozhraní je mnohem více. Pokud chcete více než jen minimalistický návod, doporučuji: | |
| + | [http://download.oracle.com/javase/tutorial/uiswing/ tutoriál ze stránek Oracle.com] | ||
| − | |||
| − | |||
| − | Vlastnosti okna | + | |
| + | |||
| + | == Okno aplikace: <tt>JFrame</tt> == | ||
| + | |||
| + | * Pro vytvoření okna aplikace používáme třídu <code>JFrame</code>. Okno má titulní pruh s nadpisem a tlačítka pro minimalizaci, maximalizaci a zavření. | ||
| + | * Vytvoříme si vlastní třídu <code>PrvniOkno</code>, která bude potomkem třídy <tt>JFrame</tt> (<code>extends JFrame</code>). | ||
| + | * Ve třídě <code>PrvniOkno</code> nastavíme popis a velikost okna. Později přidáme tlačítka, textová pole a další komponenty, které budou v okně obsaženy. | ||
| + | |||
| + | <div class="Priklad"> | ||
| + | ; Příklad 1) | ||
| + | * Vytvoř aplikaci s oknem, které půjde přesunovat, minimalizovat a při jehož zavření se aplikace ukončí. | ||
| + | * V titulním pruhu bude zobrazen text ''„První aplikace!“''. | ||
| + | |||
| + | ; Okno.java | ||
| + |  public class PrvniOkno extends JFrame { | ||
| + |     public Okno() { | ||
| + |        this.initComponents(); | ||
| + |     } | ||
| + |     public void initComponents() { | ||
| + |        this.setTitle("První aplikace!"); | ||
| + |        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||
| + |        this.setSize(300, 200); | ||
| + |     } | ||
| + |  } | ||
| + | ; Main.java | ||
| + |  public static void main(String[] args) { | ||
| + |     Okno okno = new Okno(); | ||
| + |     okno.setVisible(true); | ||
| + |  } | ||
| + | </div> | ||
| + | |||
| + | ; Vlastnosti okna | ||
| * <code>setTitle(String ''titulek'')</code> | * <code>setTitle(String ''titulek'')</code> | ||
| − | **  | + | ** nastaví titulek okna (text v titulním pruhu). | 
| * <code>setDefaultCloseOperation(int akce)</code> | * <code>setDefaultCloseOperation(int akce)</code> | ||
| − | **  | + | ** reakce na zavírací tlačítko. | 
| − | **  | + | ** v jednoduchých příkladech obvykle chceme při stisknutí zavíracího tlačítka zavřít celou aplikaci: | 
| − | + |  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | |
| − | Velikost okna | + | ; Velikost okna | 
| * <code>pack()</code> | * <code>pack()</code> | ||
| ** zmenší velikost okna tak, aby se do něj vlezly komponenty, které jsou aktuálně v okně. | ** zmenší velikost okna tak, aby se do něj vlezly komponenty, které jsou aktuálně v okně. | ||
| + | * <code>setSize(sirka, vyska)</code> | ||
| + | ** Nastaví velikost okna na stanovený rozměr. | ||
| + | * <code>setBounds(poziceX, poziceY, sirka, vyska)</code> | ||
| + | ** Umístí okno levým horním rohem na souřadnice <code>poziceX, poziceY</code> a nastaví jeho rozměry. | ||
| − | Zobrazení okna | + | ; Zobrazení okna | 
| * <code>setVisible(boolean maBytViditelne)</code> | * <code>setVisible(boolean maBytViditelne)</code> | ||
| ** Zobrazí nebo zneviditelní okno. | ** Zobrazí nebo zneviditelní okno. | ||
| − | + | ; Metoda <tt>initComponents()</tt> | |
| + | * Je zvykem v konstruktoru okna zavolat soukromou (<code>private</code>) metodu <tt>initComponents()</tt>. | ||
| + | * V rámci této metody připravíme všechny komponenty, které mají být součástí okna. | ||
| − | * Okno  | + | <div class="Ukol"> | 
| − | *  | + | ; Úkol 1) | 
| + | * Vytvořte aplikaci s oknem velikosti 400×200 pixelů. Okno půjde přesunovat, minimalizovat. Při zavření okna se aplikace ukončí. | ||
| + | * V titulním pruhu bude zobrazen text ''„Hello world!“''. | ||
| − | + | [[#Příklad 1|Řešení viz dále]] | |
| − | + | </div> | |
| − | + | ||
| − | ===  | + | == Základní komponenty == | 
| − | + | ||
| − | + | ||
| − | + | * Do okna vkládáme grafické prvky — komponenty. Nejběžnější komponenty jsou tlačítka (<code>JButton</code>), textová pole (<code>JTextField</code>) a popisky (<code>JLabel</code>). | |
| + | * Je-li komponent v okně mnoho, můžeme je [[Layout v Javě|uspořádat]]. K tomu slouží panely (<code>JPanel</code>) a případně správci rozložení (<code>LayoutManager</code>). | ||
| + | * My budeme rozložení komponent řešit pomocí vizuálního návrháře v IntelliJ IDEA. Nezapomeň hlavní panel formuláře pojmenovat a vložit ho do okna pomocí: | ||
| + |  setContentPane(mainPanel); | ||
| − | + | === Tlačítko <code>JButton</code> === | |
| + | * Tlačítka realizuje třída <code>JButton(String popisTlacitka)</code> | ||
| + | * Text na tlačítku zadáme jako parametr konstruktoru: | ||
| + |  JButton tlStart = new JButton("Start"); | ||
| + | * Tlačítku nastavíme ''listener''. Ten v reakci na stisk tlačítka provede akci: | ||
| + |  tlStart.addActionListener(e -> provedAkci()); | ||
| − | + | <div class="Priklad"> | |
| − | + | Připravte okno s jedním tlačítkem. Po stisknutí tlačítka objeví vyskakovací okno s pozdravem: | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + |  import javax.swing.*; | |
| − | + | ||
| + |  public class Pozdrav extends JFrame { | ||
| + |     private JPanel mainPanel; | ||
| + |     private JButton btPozdrav; | ||
| + |     public Pozdrav() { | ||
| + |         initComponents(); | ||
| + |     } | ||
| + |     private void initComponents() { | ||
| + |         setContentPane(mainPanel); | ||
| + |         setTitle("Pozdrav!"); | ||
| + |         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||
| + |         setSize(400, 300); | ||
| + |         btPozdrav.addActionListener(e -> pozdrav()); | ||
| + |     } | ||
| + |     private void pozdrav() { | ||
| + |         JOptionPane.showMessageDialog(this, "Ahoj světe!"); | ||
| + |     } | ||
| + |  } | ||
| + | </div> | ||
| − | Příklad | + | ; Další metody tlačítka: | 
| + | * <code>String getText()</code>, <code>setText(String novy)</code> | ||
| + | ** vrací/nastavuje popis tlačítka. | ||
| + | * <code>setIcon(ImageIcon obr)</code> | ||
| + | ** Nastavení obrázku místo textu. | ||
| + | <div class="Priklad"> | ||
| + |  ImageIcon obr; | ||
| + |  obr = new ImageIcon("res/krizek.png"); | ||
| + |  JButton tlacitko = ... | ||
| + |  ... | ||
| + |  tlacitko.setIcon(obr); | ||
| + | </div> | ||
| + | |||
| + | === Popisky <code>JLabel</code> === | ||
| + | * Informativní text můžeme zobrazit pomocí třídy <code>JLabel(String textPopisu)</code>. | ||
| + | * Text popisky zadáme jako parametr konstruktoru | ||
| + |  JLabel lCisloA = new JLabel("Zadejte číslo A:"); | ||
| + | |||
| + | === Třída <code>JTextField</code> === | ||
| + | * <code>JTextField(int pocetZnaku)</code> | ||
| + | ** volitelným parametrem konstruktoru je délka pole, vyjádřená početem znaků, které do pole vlezou. | ||
| + | * <code>String getText()</code> | ||
| + | ** vrací aktuální text v textovém poli | ||
| + | * <code>setText(String text)</code> | ||
| + | ** nastaví do textového pole zadaný text | ||
| + | * <code>setEditable(boolean lzeUpravovat)</code> | ||
| + | ** nastaví, zda do textového pole lze psát, nebo zda je šedivé a úpravy jsou zakázány. | ||
| + | ; Další nastavení | ||
| + | * <code>setFont(new java.awt.Font("Lucida Sans", 0, 24))</code> | ||
| + | ** Nastavení fontu. | ||
| + | * <code>setHorizontalAlignment(javax.swing.JTextField.RIGHT)</code> | ||
| + | ** nastaví zarovnání vpravo. | ||
| + | * Ve vývojovém prostředí je určitě pohodlnější nastavit vše přes grafický nástroj Properties. | ||
| + | |||
| + | Pokud potřebujete z textového pole načíst číslo, můžete použít následující metodu: | ||
| + | <code> | ||
| + |     /** | ||
| + |      * Získá číslo z textového pole | ||
| + |      * | ||
| + |      * @param textovePole Textové pole, jehož hodnota se má převést na číslo | ||
| + |      * @return Vrátí hodnotu čísla, zapsaného v textovém poli. | ||
| + |      *     Pokud text v poli nelze převést na číslo (pole je prázdné apod.), | ||
| + |      *      vrátí 0 | ||
| + |      *      a navíc do textového pole zapíše výzvu k vložení čísla.     */ | ||
| + |     private int ziskejCislo(JTextField textovePole) { | ||
| + |         int vysledek; | ||
| + |         try { | ||
| + |             vysledek = Integer.parseInt(textovePole.getText()); | ||
| + |         } catch (NumberFormatException e) { | ||
| + |             textovePole.setText("Nastavte platné číslo!"); | ||
| + |             vysledek = 0; | ||
| + |         } | ||
| + |         return vysledek; | ||
| + |     } | ||
| + | </code>  | ||
| + | |||
| + | === Vkládání komponent do okna === | ||
| + | * Abychom komponentu zobrazili, musíme ji umístit do některého okna. | ||
| + | * Seskládání okna obvykle provádíme v soukromé metodě <code>initComponents()</code> okna, kterou pro tento účel vytvoříme. | ||
| + | * Pokud chceme mít komponent v okně více, je třeba je uspořádat pomocí [[Layout v Javě | „layout manageru“]]. | ||
| + | |||
| + | === Třída <code>JFrame</code> === | ||
| + | * <code>getContentPane().add(Component komponentaVOkne)</code> | ||
| + | ** vloží do okna komponentu.  | ||
| + | |||
| + | === Příklad === | ||
| * Vytvořte okno s jediným tlačítkem. | * Vytvořte okno s jediným tlačítkem. | ||
| * Na tlačítku bude text „Superokno!“ | * Na tlačítku bude text „Superokno!“ | ||
| + | |||
| + | <div class="Poznamka"> | ||
| + | Všechny komponenty jsou potomky třídy <code>JComponent</code>, ale o to se nemusíme starat. To nás bude zajímat až v okamžiku, kdy budeme chtít vytvořit vlastní komponenty. | ||
| + | </div> | ||
| == Zpracování událostí, posluchač == | == Zpracování událostí, posluchač == | ||
| + | * Pro zpracování událostí prvků GUI (tlačítek, textových polí,...) používá Java [[Návrhový vzor Pozorovatel | návrhový vzor Pozorovatel (Observer)]]. | ||
| + | |||
| + | === Postup zpracování události tlačítka === | ||
| + | # uživatel klikne na tlačítko | ||
| + | # objekt reprezentující tlačítko ''vygeneruje událost'' (event) | ||
| + | #: prakticky vytvoří novou instanci třídy <code>ActionEvent</code>), která nese podrobnější informace (které tlačítko myši bylo stisknuto, na jakých souřadnicích,... | ||
| + | # objekt reprezentující tlačítko událost pošle všem svým „posluchačům“ (posluchači jsou objekty, které splňují rozhraní (interface) <code>ActionListener</code>) | ||
| + | #: prakticky se „poslání události“ realizuje tak, že tlačítko zavolá metodu <code>actionPerformed(ActionEvent e)</code>, kterou předepisuje rozhraní <code>ActionListener</code>. Jako parametr metody se předá objekt události | ||
| + | # posluchač provede akci, která se má provést | ||
| + | #: programátor tedy akci popíše v kódu metody <code>actionPerformed(ActionEvent e)</code> v posluchači | ||
| + | |||
| + | === Aby bylo možné na stisk tlačítka reagovat, musíme: === | ||
| + | # mít třídu posluchače (interface <code>ActionListener</code>) | ||
| + | # vytvořit instanci třídy posluchače | ||
| + | # zaregistrovat instanci třídy posluchače u tlačítka. | ||
| + | |||
| + | === <code>class ActionEvent</code> === | ||
| + | * <code>public Object getSource()</code> | ||
| + | ** vrací objekt, který událost vyvolal. V našem případě instanci třídy <code>JButton</code>, reprezentující tlačítko, které bylo stisknuto. | ||
| + | ** je potřeba provést [[Java: Abstraktní třídy, dědičnost a rozhraní#Přetypování | přetypování]] z <code>Object</code> na <code>JButton</code>. | ||
| + | |||
| + | === <code>interface ActionListener</code> === | ||
| + | * <code>public void actionPerformed(ActionEvent e)</code> | ||
| + | ** v této metodě popíšeme, co se má stát při stisku tlačítka | ||
| + | |||
| + | === Ukázka kódu === | ||
| + | |||
| + | * V metodě <code>initComponents</code> nebo obdobné: | ||
| + |  JButton tlacitko = new JButton("Popis"); | ||
| + |  tlacitko.addActionListener(event -> metodaPoStisknuti(event)); | ||
| + | |||
| + | * Dále přidejte metodu: | ||
| + |  private void metodaPoStisknuti(ActionEvent event) { | ||
| + |      // ... co se má stát po stisku tlačítka | ||
| + |  } | ||
| + | |||
| + | * Parametr <code>event</code> můžete vynechat, pokud nepotřebujete získávat informace o tlačítku, které událost vyvolalo. | ||
| + | |||
| + | |||
| + | === Příklad === | ||
| + | * Přidejte k tlačítku z příkladu v předchozím odstavci reakci.  | ||
| + | * Při stisku tlačítka se do textového výstupu programu opíše text z popisu tlačítka. | ||
| + | |||
| + | <div class="Priklad"> | ||
| + | Příklad | ||
| + | * Přidejte k předchozímu příkladu dvě textová pole s popiskami (label) „Originál“ a „Kopie“. | ||
| + | * Textové okno s popisem „Kopie“ nebude editovatelné. | ||
| + | * Tlačítko upravte tak, že na něm bude popis „Kopíruj“. | ||
| + | * Při stisknutí tlačítka se text z pole „Originál“ zkopíruje do pole „Kopie“. | ||
| + | * Při stisku tlačítka se do textového výstupu programu opíše text z popisu tlačítka. | ||
| + | </div> | ||
| + | |||
| + | |||
| + | == Rozšíření == | ||
| + | |||
| + | === Umístění okna na střed obrazovky === | ||
| + | |||
| + |     private static void setToTheMiddle(JFrame frame) { | ||
| + |         GraphicsConfiguration gc = frame.getGraphicsConfiguration(); | ||
| + |         Rectangle bounds = gc.getBounds(); | ||
| + |         Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc); | ||
| + |         Rectangle effectiveScreenArea = new Rectangle(); | ||
| + | |||
| + |         effectiveScreenArea.x = bounds.x + screenInsets.left; | ||
| + |         effectiveScreenArea.y = bounds.y + screenInsets.top; | ||
| + |         effectiveScreenArea.height = bounds.height - screenInsets.top - screenInsets.bottom; | ||
| + |         effectiveScreenArea.width = bounds.width - screenInsets.left - screenInsets.right; | ||
| + | |||
| + |         // Umístění doprostřed: | ||
| + |         int middleX = effectiveScreenArea.x + (effectiveScreenArea.width - frame.getWidth()) / 2; | ||
| + |         int middleY = effectiveScreenArea.y + (effectiveScreenArea.height - frame.getHeight()) / 2; | ||
| + |         frame.setLocation(middleX, middleY); | ||
| + |     } | ||
| + | |||
| + | |||
| + | == Související stránky == | ||
| + | * [[Layout v Javě]], [[Dialogy a vyskakovací okna]], [[Menu v Javě]], [[Tabulky v Javě]] | ||
| + | |||
| + | == Další zdroje == | ||
| + | * [https://www.youtube.com/watch?v=vuQdLKq2LaY Youtube.com > First Java Swing GUI Application with IntelliJ IDEA IDE (2022)] | ||
| + | |||
| − | ==  | + | == Řešení příkladů == | 
| + | === Příklad 1 === | ||
| + | ; Okno.java | ||
| + |  public class Okno extends JFrame { | ||
| + |     public Okno() { | ||
| + |        this.initComponents(); | ||
| + |     } | ||
| + |     public void initComponents() { | ||
| + |        this.setTitle("Hello world!"); | ||
| + |        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); | ||
| + |        this.pack(); | ||
| + |     } | ||
| + |  } | ||
| + | ; Main.java | ||
| + |  public static void main(String[] args) { | ||
| + |     Okno okno = new Okno(); | ||
| + |     okno.setVisible(true); | ||
| + |  } | ||
Aktuální verze z 27. 1. 2025, 07:47
Následující poznámky jsou jen velmi stručnou osnovou. Možností při vytváření grafického rozhraní je mnohem více. Pokud chcete více než jen minimalistický návod, doporučuji:
tutoriál ze stránek Oracle.com
| Obsah | 
Okno aplikace: JFrame
-  Pro vytvoření okna aplikace používáme třídu JFrame. Okno má titulní pruh s nadpisem a tlačítka pro minimalizaci, maximalizaci a zavření.
-  Vytvoříme si vlastní třídu PrvniOkno, která bude potomkem třídy JFrame (extends JFrame).
-  Ve třídě PrvniOknonastavíme popis a velikost okna. Později přidáme tlačítka, textová pole a další komponenty, které budou v okně obsaženy.
- Příklad 1)
- Vytvoř aplikaci s oknem, které půjde přesunovat, minimalizovat a při jehož zavření se aplikace ukončí.
- V titulním pruhu bude zobrazen text „První aplikace!“.
- Okno.java
public class PrvniOkno extends JFrame {
   public Okno() {
      this.initComponents();
   }
   public void initComponents() {
      this.setTitle("První aplikace!");
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setSize(300, 200);
   }
}
- Main.java
public static void main(String[] args) {
   Okno okno = new Okno();
   okno.setVisible(true);
}
- Vlastnosti okna
-  setTitle(String titulek)- nastaví titulek okna (text v titulním pruhu).
 
-  setDefaultCloseOperation(int akce)- reakce na zavírací tlačítko.
- v jednoduchých příkladech obvykle chceme při stisknutí zavíracího tlačítka zavřít celou aplikaci:
 
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- Velikost okna
-  pack()- zmenší velikost okna tak, aby se do něj vlezly komponenty, které jsou aktuálně v okně.
 
-  setSize(sirka, vyska)- Nastaví velikost okna na stanovený rozměr.
 
-  setBounds(poziceX, poziceY, sirka, vyska)-  Umístí okno levým horním rohem na souřadnice poziceX, poziceYa nastaví jeho rozměry.
 
-  Umístí okno levým horním rohem na souřadnice 
- Zobrazení okna
-  setVisible(boolean maBytViditelne)- Zobrazí nebo zneviditelní okno.
 
- Metoda initComponents()
-  Je zvykem v konstruktoru okna zavolat soukromou (private) metodu initComponents().
- V rámci této metody připravíme všechny komponenty, které mají být součástí okna.
- Úkol 1)
- Vytvořte aplikaci s oknem velikosti 400×200 pixelů. Okno půjde přesunovat, minimalizovat. Při zavření okna se aplikace ukončí.
- V titulním pruhu bude zobrazen text „Hello world!“.
Základní komponenty
-  Do okna vkládáme grafické prvky — komponenty. Nejběžnější komponenty jsou tlačítka (JButton), textová pole (JTextField) a popisky (JLabel).
-  Je-li komponent v okně mnoho, můžeme je uspořádat. K tomu slouží panely (JPanel) a případně správci rozložení (LayoutManager).
- My budeme rozložení komponent řešit pomocí vizuálního návrháře v IntelliJ IDEA. Nezapomeň hlavní panel formuláře pojmenovat a vložit ho do okna pomocí:
setContentPane(mainPanel);
  Tlačítko JButton 
-  Tlačítka realizuje třída JButton(String popisTlacitka)
- Text na tlačítku zadáme jako parametr konstruktoru:
JButton tlStart = new JButton("Start");
- Tlačítku nastavíme listener. Ten v reakci na stisk tlačítka provede akci:
tlStart.addActionListener(e -> provedAkci());
Připravte okno s jedním tlačítkem. Po stisknutí tlačítka objeví vyskakovací okno s pozdravem:
import javax.swing.*;
public class Pozdrav extends JFrame {
   private JPanel mainPanel;
   private JButton btPozdrav;
   public Pozdrav() {
       initComponents();
   }
   private void initComponents() {
       setContentPane(mainPanel);
       setTitle("Pozdrav!");
       setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       setSize(400, 300);
       btPozdrav.addActionListener(e -> pozdrav());
   }
   private void pozdrav() {
       JOptionPane.showMessageDialog(this, "Ahoj světe!");
   }
}
- Další metody tlačítka
-  String getText(),setText(String novy)- vrací/nastavuje popis tlačítka.
 
-  setIcon(ImageIcon obr)- Nastavení obrázku místo textu.
 
ImageIcon obr;
obr = new ImageIcon("res/krizek.png");
JButton tlacitko = ...
...
tlacitko.setIcon(obr);
  Popisky JLabel 
-  Informativní text můžeme zobrazit pomocí třídy JLabel(String textPopisu).
- Text popisky zadáme jako parametr konstruktoru
JLabel lCisloA = new JLabel("Zadejte číslo A:");
  Třída JTextField 
-  JTextField(int pocetZnaku)- volitelným parametrem konstruktoru je délka pole, vyjádřená početem znaků, které do pole vlezou.
 
-  String getText()- vrací aktuální text v textovém poli
 
-  setText(String text)- nastaví do textového pole zadaný text
 
-  setEditable(boolean lzeUpravovat)- nastaví, zda do textového pole lze psát, nebo zda je šedivé a úpravy jsou zakázány.
 
- Další nastavení
-  setFont(new java.awt.Font("Lucida Sans", 0, 24))- Nastavení fontu.
 
-  setHorizontalAlignment(javax.swing.JTextField.RIGHT)- nastaví zarovnání vpravo.
 
- Ve vývojovém prostředí je určitě pohodlnější nastavit vše přes grafický nástroj Properties.
Pokud potřebujete z textového pole načíst číslo, můžete použít následující metodu:
   /**
    * Získá číslo z textového pole
    *
    * @param textovePole Textové pole, jehož hodnota se má převést na číslo
    * @return Vrátí hodnotu čísla, zapsaného v textovém poli.
    *     Pokud text v poli nelze převést na číslo (pole je prázdné apod.),
    *      vrátí 0
    *      a navíc do textového pole zapíše výzvu k vložení čísla.     */
   private int ziskejCislo(JTextField textovePole) {
       int vysledek;
       try {
           vysledek = Integer.parseInt(textovePole.getText());
       } catch (NumberFormatException e) {
           textovePole.setText("Nastavte platné číslo!");
           vysledek = 0;
       }
       return vysledek;
   }
Vkládání komponent do okna
- Abychom komponentu zobrazili, musíme ji umístit do některého okna.
-  Seskládání okna obvykle provádíme v soukromé metodě initComponents()okna, kterou pro tento účel vytvoříme.
- Pokud chceme mít komponent v okně více, je třeba je uspořádat pomocí „layout manageru“.
  Třída JFrame 
-  getContentPane().add(Component komponentaVOkne)- vloží do okna komponentu.
 
Příklad
- Vytvořte okno s jediným tlačítkem.
- Na tlačítku bude text „Superokno!“
Všechny komponenty jsou potomky třídy JComponent, ale o to se nemusíme starat. To nás bude zajímat až v okamžiku, kdy budeme chtít vytvořit vlastní komponenty.
Zpracování událostí, posluchač
- Pro zpracování událostí prvků GUI (tlačítek, textových polí,...) používá Java návrhový vzor Pozorovatel (Observer).
Postup zpracování události tlačítka
- uživatel klikne na tlačítko
-  objekt reprezentující tlačítko vygeneruje událost (event)
-  prakticky vytvoří novou instanci třídy ActionEvent), která nese podrobnější informace (které tlačítko myši bylo stisknuto, na jakých souřadnicích,...
 
-  prakticky vytvoří novou instanci třídy 
-  objekt reprezentující tlačítko událost pošle všem svým „posluchačům“ (posluchači jsou objekty, které splňují rozhraní (interface) ActionListener)-  prakticky se „poslání události“ realizuje tak, že tlačítko zavolá metodu actionPerformed(ActionEvent e), kterou předepisuje rozhraníActionListener. Jako parametr metody se předá objekt události
 
-  prakticky se „poslání události“ realizuje tak, že tlačítko zavolá metodu 
-  posluchač provede akci, která se má provést
-  programátor tedy akci popíše v kódu metody actionPerformed(ActionEvent e)v posluchači
 
-  programátor tedy akci popíše v kódu metody 
Aby bylo možné na stisk tlačítka reagovat, musíme:
-  mít třídu posluchače (interface ActionListener)
- vytvořit instanci třídy posluchače
- zaregistrovat instanci třídy posluchače u tlačítka.
  class ActionEvent 
-  public Object getSource()-  vrací objekt, který událost vyvolal. V našem případě instanci třídy JButton, reprezentující tlačítko, které bylo stisknuto.
-  je potřeba provést  přetypování z ObjectnaJButton.
 
-  vrací objekt, který událost vyvolal. V našem případě instanci třídy 
  interface ActionListener 
-  public void actionPerformed(ActionEvent e)- v této metodě popíšeme, co se má stát při stisku tlačítka
 
Ukázka kódu
-  V metodě initComponentsnebo obdobné:
JButton tlacitko = new JButton("Popis");
tlacitko.addActionListener(event -> metodaPoStisknuti(event));
- Dále přidejte metodu:
private void metodaPoStisknuti(ActionEvent event) {
    // ... co se má stát po stisku tlačítka
}
-  Parametr eventmůžete vynechat, pokud nepotřebujete získávat informace o tlačítku, které událost vyvolalo.
Příklad
- Přidejte k tlačítku z příkladu v předchozím odstavci reakci.
- Při stisku tlačítka se do textového výstupu programu opíše text z popisu tlačítka.
Příklad
- Přidejte k předchozímu příkladu dvě textová pole s popiskami (label) „Originál“ a „Kopie“.
- Textové okno s popisem „Kopie“ nebude editovatelné.
- Tlačítko upravte tak, že na něm bude popis „Kopíruj“.
- Při stisknutí tlačítka se text z pole „Originál“ zkopíruje do pole „Kopie“.
- Při stisku tlačítka se do textového výstupu programu opíše text z popisu tlačítka.
Rozšíření
Umístění okna na střed obrazovky
   private static void setToTheMiddle(JFrame frame) {
       GraphicsConfiguration gc = frame.getGraphicsConfiguration();
       Rectangle bounds = gc.getBounds();
       Insets screenInsets = Toolkit.getDefaultToolkit().getScreenInsets(gc);
       Rectangle effectiveScreenArea = new Rectangle();
       effectiveScreenArea.x = bounds.x + screenInsets.left;
       effectiveScreenArea.y = bounds.y + screenInsets.top;
       effectiveScreenArea.height = bounds.height - screenInsets.top - screenInsets.bottom;
       effectiveScreenArea.width = bounds.width - screenInsets.left - screenInsets.right;
       // Umístění doprostřed:
       int middleX = effectiveScreenArea.x + (effectiveScreenArea.width - frame.getWidth()) / 2;
       int middleY = effectiveScreenArea.y + (effectiveScreenArea.height - frame.getHeight()) / 2;
       frame.setLocation(middleX, middleY);
   }
Související stránky
Další zdroje
Řešení příkladů
Příklad 1
- Okno.java
public class Okno extends JFrame {
   public Okno() {
      this.initComponents();
   }
   public void initComponents() {
      this.setTitle("Hello world!");
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.pack();
   }
}
- Main.java
public static void main(String[] args) {
   Okno okno = new Okno();
   okno.setVisible(true);
}
				
								
				