Lekce 5 - Upomínač narozenin v JavaFX - Formuláře podruhé
V minulé lekci, Upomínač narozenin v JavaFX - Návrh formuláře, jsme si v nástroji JavaFX Scene Builder navrhli hlavní formulář aplikace.
Dnes budeme v JavaFX tutoriálu s formuláři pokračovat. Vytvoříme si
kontroler, který bude zpracovávat vybrané komponenty
formuláře. Ty následně propojíme s naším FXML souborem. Dále si
ukážeme, jak si naprogramovat nový dialog, ve kterém budeme
moci přidávat své přátele a jejich narozeniny do naší
aplikace. Dialog uděláme pomocí metody vytvorObsahDialogu()
, kdy
formulář vytvoříme jako instanci objektů. Na závěr v
kontroleru upravíme metodu pro přidání přátel tak, aby zobrazovala nový
dialog.
Příprava kontroleru
Náš kontroler bude odkazovat na třídu Osoba
, začneme tedy
tím, že si tuto třídu vytvoříme.
Přidání třídy Osoba
V projektu si tedy založíme novou třídu s názvem Osoba
,
zatím ji však ponecháme prázdnou:
public class Osoba { }
Přidání atributů a obslužných metod
Přejděme do kontroleru formuláře a vytvořme atributy s
@FXML
anotací pro komponenty formuláře, které budeme z kódu
používat. Rovnou si připravme i obslužné metody. Náš kontroler bude
vypadat asi takto:
public class UpominacNarozeninFXMLController implements Initializable { @FXML private ListView<Osoba> osobyListView; @FXML private Label dnesLabel; @FXML private Label nejblizsiLabel; @FXML private Label narozeninyLabel; @FXML private Label vekLabel; @FXML public void handlePridatButtonAction(ActionEvent event) { } @FXML public void handleOdebratButtonAction(ActionEvent event) { } @Override public void initialize(URL url, ResourceBundle rb) { // TODO } }
Budeme potřebovat jeden ListView
atribut a čtyřmi položky
typu Label
, to jsou ty, které mají na formuláři v textu
otazník. Zbytek komponent nebudeme v kontroleru využívat. Je proto zbytečné
si je ukládat. V kódu jsme si také už předepsali dvě obslužné metody pro
obě tlačítka.
Propojení kontroleru a FXML
Změny v souboru uložíme a přejdeme do Scene Builderu,
kde danému ListView
a čtyřem položkám Label
nastavíme příslušná fx:id. Tlačítkům nastavíme
obslužné metody, jako jsme to dělali u kalkulačky. Nastavovat
fx:id jim nemusíme:
U obslužných metod tlačítek můžeme parametr
ActionEvent
vynechat. Standardně se tam však uvádí, i když ho
zrovna nevyužijeme.
Vytvoření dialogu
V aplikaci budeme dále kromě hlavního formuláře potřebovat dialog pro vytvoření nové osoby. Dialog bude vypadat takto:
Formulář je opravdu jednoduchý. Obsahuje pouze dvě pole typu
TextField
a jeden Button
. Při úvodu do
JavaFX jsme si říkali, že můžeme formulář vytvořit i
jako instance objektů. Vyzkoušíme si to na dialogu.
Do kontroleru si přidáme novou metodu vytvorObsahDialogu()
,
která bude vypadat následovně:
private void vytvorObsahDialogu(Dialog<Osoba> dialog) { // Vytvoření "potvrzovacího" tlačítka pro potvrzení dialogu ButtonType createButtonType = new ButtonType("OK", ButtonData.OK_DONE); // Nastavení tlačítek dialogu dialog.getDialogPane().getButtonTypes().setAll(createButtonType, ButtonType.CANCEL); // Mřížka GridPane grid = new GridPane(); grid.setAlignment(Pos.CENTER); grid.setPadding(new Insets(10)); grid.setHgap(10); grid.setVgap(10); // Komponenty TextField jmenoTextField = new TextField(); TextField datumTextField = new TextField(); Label jmenoLabel = new Label("Jméno"); Label datumLabel = new Label("Datum narození"); grid.add(jmenoLabel, 0, 0); grid.add(jmenoTextField, 1, 0); grid.add(datumLabel, 0, 1); grid.add(datumTextField, 1, 1); dialog.setResultConverter(new Callback<ButtonType, Osoba>() { @Override public Osoba call(ButtonType param) { // Obsluha tlačítek dialogu return null; } }); dialog.getDialogPane().setContent(grid); }
Metoda dělá v podstatě to, co za nás jinak dělá Scene Builder.
Tento přístup se u JavaFX také používá, my si ho nyní popíšeme, abychom byli schopni porozumět dalším aplikacím, které FXML z nějakého důvodu nevyužívají.
Na začátku jsme si vytvořili nové potvrzovací tlačítko s vlastním
textem. Toto tlačítko spolu s tlačítkem Cancel
jsme přidali do
dialogu.
Dále jsme do metody doplnili GridPane
, tabulkový panel,
kterému jsme nastavili zarovnání a okraje.
Následně vytváříme komponenty, které naskládáme do buněk
GridPane
panelu. Uvedeme vždy komponentu, sloupec a řádek, do
kterého ji chceme vložit.
Další řádky tvoří obsluhu události nastavení výsledku dialogu.
Implementaci logiky si necháme na další lekci. Zatím budeme jednoduše
vracet null
.
Naplněný GridPane
a tlačítko přidáme dialogu pomocí
metody dialog.getDialogPane().setContent(grid)
.
Doplnění metody
handlePridatButtonAction()
Abychom z té práce vůbec něco viděli, upravíme obslužnou metodu přidávacího tlačítka do následující podoby:
public void handlePridatButtonAction(ActionEvent event) { Dialog<Osoba> dialog = new Dialog<>(); dialog.setTitle("Nová osoba"); dialog.setWidth(350); dialog.setHeight(250); vytvorObsahDialogu(dialog); dialog.showAndWait(); }
Vytváříme zde instanci nového dialogu. Nastavíme mu titulek a velikost
okna. Dále zavoláme naší výše vytvořenou metodu, pomocí které naplníme
dialog vlastním obsahem. Dialog nakonec zobrazíme metodou
showAndWait()
. Tím zajistíme, že hlavní okno nebude reagovat do
té doby, než se dialog uzavře. U dialogu se toto většinou dělá již jen
proto, aby si uživatel nemohl ten samý dialog vyvolat vícekrát. I když nám
by v podstatě nevadilo, kdyby uživatel během zadávání nové osoby aplikaci
používal a otevřel třeba další dialog k zadávání nové osoby.
Aplikaci můžeme spustit a kliknout na tlačítko Přidat:
Tím máme formuláře hotové.
V následujícím kvízu, Kvíz - Layouty, komponenty a pozicování v JavaFX, si vyzkoušíme nabyté zkušenosti z předchozích lekcí.
Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.
Stáhnout
Stažením následujícího souboru souhlasíš s licenčními podmínkami
Staženo 723x (17.02 kB)
Aplikace je včetně zdrojových kódů v jazyce Java