GUI v Javě
Z MiS
(Rozdíly mezi verzemi)
(→Základní komponenty: Úvodní text přeformulován.) |
(→Základní komponenty: Úprava textu o tlačítku + příklad Pozdrav!) |
||
Řádka 75: | Řádka 75: | ||
setContentPane(mainPanel); | setContentPane(mainPanel); | ||
− | === | + | === Tlačítko <code>JButton</code> === |
− | * <code>JButton(String popisTlacitka)</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"); | |
− | * reakci na stisk tlačítka | + | * 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> | ||
+ | |||
+ | ; Další metody tlačítka: | ||
* <code>String getText()</code>, <code>setText(String novy)</code> | * <code>String getText()</code>, <code>setText(String novy)</code> | ||
** vrací/nastavuje popis tlačítka. | ** vrací/nastavuje popis tlačítka. |
Verze z 27. 1. 2025, 07:44
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ě
PrvniOkno
nastaví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, poziceY
a 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);
Třída 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
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
Object
naJButton
.
- 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ě
initComponents
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
event
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.
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); }