GUI v Javě
Z MiS
				
				
				(Rozdíly mezi verzemi)
				
																
				
				
								
				|  (→Textová pole, tlačítka:  Doplnění metod textového pole) |  (Dodány LayoutManagery a zpracování události tlačítka) | ||
| Řádka 1: | Řádka 1: | ||
| [[Category:VSE]] | [[Category:VSE]] | ||
| + | [[Category:Škola]] | ||
| [[Category:Informatika]] | [[Category:Informatika]] | ||
| [[Category:Programování]] | [[Category:Programování]] | ||
| Řádka 6: | Řádka 7: | ||
| 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: | 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] | [http://download.oracle.com/javase/tutorial/uiswing/ tutoriál ze stránek Oracle.com] | ||
| + | |||
| + | |||
| + | |||
| == Vytvoření okna == | == Vytvoření okna == | ||
| Řádka 35: | Řádka 39: | ||
| Vložení komponenty do okna | Vložení komponenty do okna | ||
| * <code>getContentPane().add(Component komponentaVOkne)</code> | * <code>getContentPane().add(Component komponentaVOkne)</code> | ||
| − | ** vloží do okna komponentu. Pokud chceme mít komponent v okně více, je třeba je uspořádat pomocí [[GUI v Javě#Layout Manager | „layout manageru“]]. | + | ** vloží do okna komponentu.   | 
| + | ** se základními komponentami a třídami, které je realizují, se seznámíte v odstavci [[GUI v Javě#Textová pole, tlačítka | Textová pole, tlačítka]]. | ||
| + | ** Pokud chceme mít komponent v okně více, je třeba je uspořádat pomocí [[GUI v Javě#Layout Manager | „layout manageru“]]. | ||
| === Příklad === | === Příklad === | ||
| * Vytvořte aplikaci s oknem, které půjde přesunovat, minimalizovat a při jehož zavření se aplikace ukončí. | * Vytvořte 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 „Hello world!“. | * V titulním pruhu bude zobrazen text „Hello world!“. | ||
| + | |||
| + | |||
| + | |||
| == Textová pole, tlačítka == | == Textová pole, tlačítka == | ||
| Řádka 58: | Řádka 67: | ||
| **: <code>JButton tlStart = new JButton("Start");</code> | **: <code>JButton tlStart = new JButton("Start");</code> | ||
| * reakci na stisk tlačítka nastavíme [[#Zpracování událostí, posluchač | přiřazením posluchače viz dále]] | * reakci na stisk tlačítka nastavíme [[#Zpracování událostí, posluchač | přiřazením posluchače viz dále]] | ||
| + | * <code>String getText()</code> | ||
| + | ** vrací popis tlačítka. | ||
| === <code>JLabel</code> === | === <code>JLabel</code> === | ||
| Řádka 72: | Řádka 83: | ||
| * <code>setText(String text)</code> | * <code>setText(String text)</code> | ||
| ** nastaví do textového pole zadaný text | ** 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. | ||
| Pokud potřebujete z textového pole načíst číslo, můžete použít následující metodu: | Pokud potřebujete z textového pole načíst číslo, můžete použít následující metodu: | ||
| Řádka 98: | Řádka 111: | ||
| * 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!“ | ||
| + | |||
| + | |||
| + | |||
| == 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 Posluchač | návrhový vzor Posluchač (Listener)]]. | ||
| + | |||
| + | === 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 [[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 | ||
| + | |||
| + | === 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. | ||
| + | |||
| + | |||
| == Layout Manager == | == Layout Manager == | ||
| + | * Použijeme, když chceme do okna umístit více než jednu komponentu. | ||
| + | * Instance třídy LayoutManager, resp. jejích dceřinných tříd. | ||
| + | |||
| + | === Nejběžnější třídy layout managerů v Javě === | ||
| + | * FlowLayout | ||
| + | ** Nejjednodušší layout manager. | ||
| + | ** Umisťuje prvky jeden za druhý do řádků v takovém pořadí, v jakém jsou přidány. | ||
| + | * GridLayout | ||
| + | ** umisťuje komponenty do pravidelné mřížky M×N. | ||
| + | ** počet řádků a počet sloupců zadáváme jako parametry konstruktoru při vytváření instance třídy GridLayout. | ||
| + | ** pokud některý z parametrů konstruktoru zadáme nulový, pak je počet řádků resp. sloupců neomezený. | ||
| + | ** při přidávání komponent se mřížka zaplňuje zleva a shora. | ||
| + | * BorderLayout | ||
| + | ** umisťuje komponenty do oblastí North, South, East, West a Center. | ||
| + | ** při zvětšování a zmenšování okna se zvětšuje a zmenšuje oblast Center, ostatní zůstávají pokud možno stejně veliké. | ||
| + | ** přidávání komponent: <code>panel.add(tlacitko, BorderLayout.EAST)</code> | ||
| + | |||
| + | === Třídy <code>JFrame</code> === | ||
| + | |||
| + | === 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. | ||
Verze z 7. 7. 2011, 15:35
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 | 
Vytvoření okna
  Třída JFrame: 
- realizuje okno s titulním pruhem a tlačítky.
Vlastnosti okna
-  setTitle(String titulek)- nastavuje titulek okna (text v titulním pruhu).
 
-  setDefaultCloseOperation(int akce)- říká co se bude dít při stlačení zavíracího tlačítka.
-  naše aplikace většinou mají jediné okno, chceme tedy, aby se při zavření okna zavřela celá aplikace.
- k tomu slouží konstanta JFrame.EXIT_ON_CLOSE.
 
 
Velikost okna
-  pack()- zmenší velikost okna tak, aby se do něj vlezly komponenty, které jsou aktuálně v okně.
 
Zobrazení okna
-  setVisible(boolean maBytViditelne)- Zobrazí nebo zneviditelní okno.
 
Vkládání komponent do okna
- Okno se skládá z dílčích součástí (komponent). Jsou to tlačítka, zatrhávací políčka, panely, tabulky,...
-  Seskládání okna obvykle provádíme v soukromé metodě initComponents(), kterou pro tento účel vytvoříme.
Vložení komponenty do okna
-  getContentPane().add(Component komponentaVOkne)- vloží do okna komponentu.
- se základními komponentami a třídami, které je realizují, se seznámíte v odstavci Textová pole, tlačítka.
- Pokud chceme mít komponent v okně více, je třeba je uspořádat pomocí „layout manageru“.
 
Příklad
- Vytvořte 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 „Hello world!“.
Textová pole, tlačítka
Do okna vkládáme součásti (komponenty). Komponenty jsou potomky třídy JComponent. 
Nejběžnější komponenty jsou:
-  tlačítka (JButton),
-  textová pole (JTextField),
-  popisky (JLabel).
Je-li komponent v okně mnoho, můžeme je uspořádat na
-  panely (JPanel).
  JButton 
-  JButton(String popisTlacitka)-  text na tlačítku zadáme jako parametr konstruktoru
-  JButton tlStart = new JButton("Start");
 
-  
 
-  text na tlačítku zadáme jako parametr konstruktoru
- reakci na stisk tlačítka nastavíme přiřazením posluchače viz dále
-  String getText()- vrací popis tlačítka.
 
  JLabel 
-  JLabel(String textPopisu)-  text popisky zadáme jako parametr konstruktoru
-  JLabel lCisloA = new JLabel("Zadejte číslo A:");
 
-  
 
-  text popisky zadáme jako parametr konstruktoru
- reakci na stisk tlačítka nastavíme přiřazením posluchače viz dále
  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.
 
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;
   }
Příklad
- Vytvořte okno s jediným tlačítkem.
- Na tlačítku bude text „Superokno!“
Zpracování událostí, posluchač
- Pro zpracování událostí prvků GUI (tlačítek, textových polí,...) používá Java návrhový vzor Posluchač (Listener).
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
 
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.
Layout Manager
- Použijeme, když chceme do okna umístit více než jednu komponentu.
- Instance třídy LayoutManager, resp. jejích dceřinných tříd.
Nejběžnější třídy layout managerů v Javě
-  FlowLayout
- Nejjednodušší layout manager.
- Umisťuje prvky jeden za druhý do řádků v takovém pořadí, v jakém jsou přidány.
 
-  GridLayout
- umisťuje komponenty do pravidelné mřížky M×N.
- počet řádků a počet sloupců zadáváme jako parametry konstruktoru při vytváření instance třídy GridLayout.
- pokud některý z parametrů konstruktoru zadáme nulový, pak je počet řádků resp. sloupců neomezený.
- při přidávání komponent se mřížka zaplňuje zleva a shora.
 
-  BorderLayout
- umisťuje komponenty do oblastí North, South, East, West a Center.
- při zvětšování a zmenšování okna se zvětšuje a zmenšuje oblast Center, ostatní zůstávají pokud možno stejně veliké.
-  přidávání komponent: panel.add(tlacitko, BorderLayout.EAST)
 
  Třídy JFrame 
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.
