Úvod do JavaFXRICHARD LIPKA
1.3.2021
API pro GUI v JavěAWT (Abstract Window Toolkit)
◦ Starší, jednodušší, rychlejší (navázáno na volání OS API → vzhled podle OS)
◦ Původní GUI v Javě
Swing◦ Novější, velmi komplexní (30 komponent)
◦ Pomalejší, vlastní vykreslování nezávislé na OS; ale bez nativního kódu, čistá Java
◦ Souběžně využívá některé věci z AWT (vychází z něj, přebírá událostní model, fonty, barvy, layouty)
◦ Velký důraz na MVC architekturu
◦ Existují nad ním vybudované knihovny (JGoodies)
SWT◦ Vytvořeno IBM, využité v Eclipse
◦ Využívá nativní kód, jednodušší než Swing
JavaFX◦ Moderní náhrada za Swing, od Java 8 má je součástí JRE/JDK
◦ Jednodušší práce s událostmi, deklarativní popis oken, využití CSS a HTML
(stejná jména tříd jako u AWT)
1.3.2021 UUR - ÚVOD JAVAFX 3
JavaFXOficiálně součástí Javy od verze 8 (březen 2014)
◦ První verze 2008 jako speciální skriptovací jazyk, v současné podobě od JavaFX 2.0 od r. 2011 → není to úplně nová a nevyzkoušená technologie
Potřebuje vlastní běhové prostředí◦ Od Javy 8 součástí JRE / JDK, do Javy 7 se dá doinstalovat
◦ Platformě závislé (stejně jako JRE) – k dispozici pro Windows, Linux, MacOS, Solaris
◦ Od Javy 11 samostatný balík s vlastním vývojovým cyklem (spravován Gluonem)
◦ Existuje projekt JavaFXPorts (pod GluonMobiles, trial je zdarma) pro spouštění JavaFXaplikací na Androidu
JavaFX Scene builder – WISYWIG návrhář aplikace◦ Návrh rozložení prvků, layoutů, podpora pro nastavení obsluh
◦ Funguje jen pro FXML soubory (neumí generovat zdrojový text Javy)
◦ Silná podpora CSS, lokalizačních souborů, tvorby kontrolerů …
◦ Oracle ukončil vlastní vývoj, momentálně pod Gluon (zdarma, poslední verze z května 2019)
1.3.2021 UUR - ÚVOD JAVAFX 4
JavaFX a GluonGluon
◦ Firma zabývající se vývojem UI, výukou a rozvojem JavaFX
◦ Převzal správu JavaFX po vydání Java 11 (září 2018)→ oficiální distribuce balíku je jen u nich, není součástí JDK
( https://openjfx.io/openjfx-docs/#introduction )→ spravují i dokumentaci, další vývoj, updaty, …
( https://openjfx.io/ )→ spravují Git se zdrojovými texty (podívejte se jak vypadá)
(https://github.com/javafxports/openjdk-jfx )
◦ Po instalaci Java 11 nutné instalovat knihovny JavaFX zvlášť ◦ Lze udělat manuálně (https://openjfx.io/openjfx-docs/#install-javafx )
◦ Podpora pro Maven a Gradle – deklarace závislostí na projektu (https://openjfx.io/openjfx-docs/#gradle )
◦ Podpora pro IDE - Eclipse, Netbeans, IntelliJ (https://openjfx.io/openjfx-docs/#IDE-Eclipse )
1.3.2021 UUR - ÚVOD JAVAFX 5
Drag and drop programovánívs
psaní zdrojového textu ručněExistují nástroje pro „naklikání“ GUI (pro většinu běžných technologií)
◦ JavaFX Scene Builder jako samostatná aplikace (https://gluonhq.com/products/scene-builder/ - vybrat správnou verzi – 8, 11, 15, … ) jako plugin do Eclipse, Netbeans, IntelliJ Idea
◦ Tvoří jen FXML soubory (XML popis GUI), ne volání z API → podporuje dobré návyky
→ rychlejší vývoj GUI aplikací, příprava formulářů
ALE
? Debugování programu, zejména složitých oken ?
? Recyklace formulářů bez zbytečného opakování ?
? Tvorba automatických testů (unit testy) ?
? Dynamické generování GUI podle dostupných dat ?
1.3.2021 UUR - ÚVOD JAVAFX 6
JavaFX – podporované technologieAPI – V Javě, použitelné v dalších jazycích založených na JRE (jRuby, Scala)
FXML – deklarativní popis GUI v XML souboru (→ oddělení view od zbytku programu)
CSS – Nastavení vzhledu oddělené od definice view i od programu
HTML – schopnost zobrazovat a pracovat s HTML 5 (WebKit = Safari, OS X)
Swing – schopnost pracovat se Swing komponentami
Dotyková zařízení – podpora dotykových a vícedotykových gest
Rich text – podpora obousměrného textu (arabské jazyky), mnoha abeced a formátování textu v komponentách
Grafika – podpora 2D a 3D grafiky, na některých kartách podpora akcelerace (přehled podporovaných karet v dokumentaci)
Média – podpora pro přehrávání videa a zvuku (včetně streamování)
Nasazení aplikace – podpora pro vytvoření plně spustitelného programu (balí se do něj JRE a JavaFX)
1.3.2021 UUR - ÚVOD JAVAFX 7
Struktura knihovny
Převzato z http://docs.oracle.com/javase/8/javafx/get-started-tutorial/jfx-architecture.htm#JFXST788
Knihovny se kterými budete pracovat
Získávání zdrojů z OS (okna, časovače, plochy ke kreslení)
Kodeky, práce s kontejnery
WebkitVykreslovací jádro – SW kreslení a spojení s GPU
Middleware pro ostatní moduly, řízení vláken
1.3.2021 UUR - ÚVOD JAVAFX 8
Základní struktura GUIVstup od uživatele
◦ Propojení s periferiemi
Zpracování událostí◦ Co se má stát po vstupu
Spojení s jádrem programu◦ „Užitečná činnost“
Grafický subsystém◦ Vykreslení obrazu
1.3.2021
Zpracování vstupu (od OS)
Reakce na události
Vlastní činnost
Vykreslování
UUR - ÚVOD JAVAFX 9
Interakce s uživatelemOS zajišťuje komunikaci s periferiemi
Jednoduchá komunikace◦ Stisknutí tlačítka
◦ Pohyb myši
◦ …
→ Jedna jasná událost z okolí
Gesta◦ Dvojklik, trojklik
◦ Gesta myši, drag and drop
◦ Více dotyková zařízení
◦ Klávesové kombinace
◦ Stisk tlačítka
◦ Kinect a podobná zařízení – gesta rukou
→ Potřebuji je rozpoznávat
◦ V ideálním případě jejich rozpoznání zajistí OS / platforma
◦ Kde to jde reagovat na gesta - univerzálnější
1.3.2021
Správa přerušení (HW)
Ovladač zařízení
Detekce gest
Vznik události
Obsluha
OS
Platforma
Aplikace
UUR - ÚVOD JAVAFX 10
Událostní smyčka1 proces (CPU) může vykonávat jen 1 program
◦ Pevně daná posloupnost akcí◦ Můžu se ptát jestli proběhla událost→ potřebuji „nekonečný“ cyklus
Proces musí zajistit◦ Sledování událostí◦ Rozpoznání gest (pokud je nedělá
někdo za něj)◦ Reakci na události◦ Aktualizaci vzhledu
◦ Včetně změn kurzoru, podbarvení tlačítek …
Smyčka funguje ve většině technologií sama → Nenarušovat ji, jen využít
1.3.2021
Pokračovat?
Vezmi událost z fronty
Zavolej obsluhu
Překresli okno
Je tam?
ano
ne
ano
ne
UUR - ÚVOD JAVAFX 11
Zpracování událostiKaždé události je třeba nastavit obsluhu
◦ Běží „uvnitř“ smyčky událostí → krátká a rychlá (nebo nové vlákno)! jinak GUI zamrzne !
Platforma obvykle dokáže zpracovat základní gesta◦ Kliknutí na obrazovku
◦ Událost myši → pozice, identifikace tlačítka
◦ Lze získat z OS / ovladače příslušného zařízení
◦ Stisk tlačítka◦ V důsledku stisknutí levého tlačítka myši nad komponentou „tlačítko“
(nebo stisknutí klávesnicí, nebo stisknutí na dotykovém zařízení)
→ Platforma musí zjistit že k ní došlo (OS nerozumí vnitřku okna, pokud není nativní)
◦ Platforma může vytvořit odpovídající událost, reagovat na ni (univerzálnější)
◦ Pozor, gesto může existovat s původní událostí → lze reagovat na obojí (ale chci to?)
1.3.2021 UUR - ÚVOD JAVAFX 12
Základní aplikaceVstupní bod programu - třída Application
◦ Musí být děděna (abstraktní)
◦ Zahajuje vytváření GUI (metody init() a start() )
◦ Ukončuje běh aplikace (metoda stop())
Běží ve vlastním vlákně (JavaFX ApplicationThread)
◦ Celá tvorba GUI
◦ Obsluhy všech událostí
Ukončení:◦ Patform.exit() – preferované
◦ System.exit() – funguje, ale pak se nevolá metoda stop()
Vytvoření instance třídy Application
Spuštení metody init()– vlastní vlákno (spouštěč)
Vytvoření instance scény –Stage
Spuštení metodystart() – vlastní vlákno
Čeká na ukončení
Volání metody stop()
1.3.2021 UUR - ÚVOD JAVAFX 13
Hello World oknopublic class HelloWorld extends Application {
public void start(Stage primaryStage) {Button btn = new Button();btn.setText("Say 'Hello World'");
StackPane root = new StackPane();root.getChildren().add(btn);Scene scene = new Scene(root, 300, 250);
primaryStage.setTitle("Hello World!");primaryStage.setScene(scene);primaryStage.show();
}
public static void main(String[] args) {launch(args);
}}
1.3.2021 UUR - ÚVOD JAVAFX 14
FXML Hello WorldBorderPane border =
new BorderPane();
Label toppanetext =
new Label("Page Title");
border.setTop(toppanetext);
Label centerpanetext =
new Label ("Some data
here");
border.setCenter(
centerpanetext);
<BorderPane>
<top>
<Label text="Page Title"/>
</top>
<center>
<Label text=
"Some data here"/>
</center>
</BorderPane>
1.3.2021 UUR - ÚVOD JAVAFX 15
Jeviště (Stage) – top levelcontainerObvykle reprezentuje 1 okno aplikace (nemusí)
◦ Aplikace funguje dokud je na obrazovce alespoň jedno okno
Kontejner – může obsahovat další komponenty
◦ Komponenty uloženy v Grafu scény (Scene, ve skutečnosti strom)
◦ Obsahuje uzly (Node) - společný předek pro všechny komponenty GUI◦ Další kontejnery (panely, skupiny, menu) - root
◦ Ovládací prvky (tlačítka)
◦ Zobrazovací prvky (tabulky, grafy, stromy)
◦ Vstup od uživatele (textová pole, zaškrtávací políčka)
1.3.2021 UUR - ÚVOD JAVAFX 16
Prvek scény - NodeJakýkoliv element scény který vidíte
Obsahuje◦ ID (textová identifikace – pro CSS), musí být unikátní, pokud je nastaveno
(potřeba hlavně ve FXML)◦ StyleClass – třída (nebo několik tříd) pro CSS◦ Parent – rodič uzlu (nadřazený prvek)◦ UserData – s uzlem lze spojit jeden datový objekt
+ cokoliv dalšího podle konkrétní komponenty
Lze na něj aplikovat◦ Efekty (stíny, rozmazání, …)◦ Průhlednost◦ Transformace (pozice, natočení, zvětšení, zkosení)
Může odchytávat události a reagovat na ně
1.3.2021 UUR - ÚVOD JAVAFX 17
Struktura scényV kořeni musí být kontejner (potomek Parent – panely, toolbary, …)
Každá komponenta vložena jen jednou
◦ Node má rodiče, při opětovném vložení se rodič změní (automaticky)
Lze vytvářet hierarchii do sebe vnořených panelů – layoutování
◦ Změny pozice a velikosti podle změny velikosti okna
◦ Struktura by měla odrážet logiku používání okna (u složitých formulářů)
Scene
Hlavnípanel
Obsahovýpanel
Řídícípanel
OK tlačítko
Storno tlačítko
…
Zobrazovacípanel
Textová oblast
…
Menu
Menu Sobor
Položka 1
Položka 2
…
Menu Nápověda
…
1.3.2021 UUR - ÚVOD JAVAFX 18
Reprezentace GUI v počítačiSCÉNA
Sada objektů k vykreslení◦ Tlačítka, panely, tabulky, …
Mají určené:◦ Pozice, rozměry, nadřazené prvky
◦ Vzhled
◦ Obslužné objekty
→ lze detekovat události
→ lze jimi manipulovat
Zpracování◦ Souřadnice pro detekci událostí
◦ Překreslení jen toho co je potřeba
◦ Nutné převést na obrázek (u nativního GUI to zařídí OS)
VYKRESLOVANÝ OBRAZ
Bitmapa◦ 2D pole pixelů (barev)
◦ Mohou být 2 – double buffering
Může být přímo vykreslen na zobrazovací zařízení◦ (existují i vektorová – neobvyklé)
Práce s ním hlavně ve fullscreenu◦ Hry, 3D grafika, přehrávání videa
◦ lze získat i okno pro vykreslování(místo nativního GUI – knihovna kreslí všechno sama)
Zpracování◦ Přímé změny barvy na pixelu
◦ Pravidelné překreslení (snímkovací frekvence)
1.3.2021 UUR - ÚVOD JAVAFX 19
Jmenné konvenceNejsou povinné, závisí na firemním prostředí … ale mohou se hodit
◦ Lepší čitelnost programu◦ Na druhé straně překladač i IDE typ reference zná a napovídá
◦ Nutné důsledně dodržovat v celém programu◦ Pozor na míchání češtiny a angličtiny, někdy vadí více, někdy méně
◦ Pozor na „kreativní mizzpelling“ nebo skutečné chyby(na druhé straně někdy může být záměrný - v knihovnách Javy např. Clazz)
V JavaFX 2 typy jmen◦ Jména referencí◦ Identifikátory objektů a tříd pro CSS a FXML (vždy textové) - nepovinné
Pozor, jména tříd JavaFX z package javafx, stejné jako jména z AWT
Např.◦ Button: okButton, okBT, …◦ Menu: fileMenu, fileMN, …◦ Label: averageLabel, averageLB, …
1.3.2021 UUR - ÚVOD JAVAFX 20
Dělení aplikaceObjekty vždy zodpovědné za jednu věc, neměly by bát moc dlouhé→ rozumně dělit tvorbu GUI do metod
Typické řešení:◦ Privátní metody pro každý panel
(skupinu prvků v GUI) nebo složitější komponentu (vyžaduje několik nastavení)◦ Vrací hotový uzel (panel naplněný
komponentami)
◦ Využívá volání dalších metod, pokud jsou uvnitř další panely
◦ Pro každé okno vlastní třída◦ Vhodné konstruktory pro plnění daty?
◦ Pro složitější a znovupoužitelné komponenty (které nejsou v API) určitě vlastní třída
Scene
Hlavnípanel
Obsahovýpanel
Řídícípanel
OK tlačítko
Storno tlačítko
…
Zobrazovacípanel
Textová oblast
…
Menu
Menu Sobor
Položka 1
Položka 2
…
Menu Nápověda
…
1.3.2021 UUR - ÚVOD JAVAFX 21
Strukturování zdrojového textuJen doporučení – není povinné, ale zlepšuje přehlednost aplikace
1 třída – 1 funkce →◦ Vstupní bod aplikace potomek Application
◦ pro každé okno vlastní třída (může a nemusí být potomek Stage)
◦ GUI by nemělo provádět funkce jádra aplikace → propojit s ním přes vhodné rozhraní(= pokud aplikace ukládá do DB v obsluze se jen volá metoda jádra, ne samotné ukládání)
1 metoda – 1 funkce →◦ Netvořit celé okno v jedné metodě
◦ Konvence:◦ každý uzel stromu scény má vlastní metodu, která vrací Node a stará se o jeho vytvoření
◦ pokud je složen z dalších uzlů, volá potřebné metody
Jednoduchá obsluha◦ V obslužné metodě jen minimum kódu
◦ Ideálně 1 řádek který volá obslužnou metodu (nejspíš privátní)
1.3.2021 UUR - ÚVOD JAVAFX 22
Naslouchání událostemUdálosti zachycené OS, předané do JavaFX frameworku
◦ Oznamují aplikaci že se něco stalo – obvykle interakce s uživatelem
◦ Framework události většinu vytváří a posílá sám
Reprezentované instancemi třídy Event◦ Řada specializovaných potomků podle původce události a informací které
nese (stisknutá klávesa, pohyb myši, …)
Každá komponenta může naslouchat všem událostem, jen je třeba nastavit obsluhu
◦ Metody setOn…() – např. setOnAction(), setOnMouseEntered(), … (zděděné z Node)
1.3.2021 UUR - ÚVOD JAVAFX 23
UdálostTřída Event a její potomci
◦ Zdroj události (metoda getSource() ) – kdo ji vyvolal – rodič prvku
◦ Cíl události (metoda getTarget() ) – kam událost směřuje (v grafu scény)(občas stejný objekt jako zdroj události)
◦ Typ události :umožňujespecifikovatdetailyudálosti(metodagetEventType() )
1.3.2021 UUR - ÚVOD JAVAFX 24
Propagace událostiRozhraní EventTarget pokud může komponenta být cílem události(implementuje ho Window, Scene, Node)
◦ Klávesnice – cílem je komponenta která má fokus◦ Myš – cílem komponenta pod kurzorem ◦ Dotyková gesta – všechny body kterých se dotýkáte na začátku
◦ Pokud je komponent víc, bere se vrchní (na obrazovce → list stromu)◦ Při déletrvajícím gestu události předávány cíli ze začátku gesta
Událost předávána ve stromu (scéna → panely → cíl)◦ Projde skrz všechny „rodiče“ ve scéně k cíli a zpět ke scéně◦ „Event capturing“ – cesta dolů, filtry –
addEventFilter(EventType, EventHandler)
◦ „Event bubbling“ – cesta nahoru, obsluhy –addEventHandler(EventType, EventHandler)
Pohlcení události – consume()
1.3.2021 UUR - ÚVOD JAVAFX 25
Doporučení pro obsluhu událostíObsluha by měla být co nejkratší
◦ Běží ve stejném vlákně jako vykreslování GUI
◦ Pokud je dlouhá, provést ve vlastním vlákně
Obsluha není / nemusí být součástí View→ vhodně ji oddělit do vlastního objektu nebo alespoň metody
(alespoň kousek ji ve View vždycky zbyde)◦ Delegovat na objekty, které mají potřebnou odpovědnost
Nezapomenout na kontrolu dat◦ Nemusí být součástí View, ale někde v obsluze se musí objevit
Naslouchat co nejobecnějším událostem◦ Akce tlačítka je lepší než stisknutí myši – záleží na technologii
1.3.2021 UUR - ÚVOD JAVAFX 26
Obslužný objektJednotné rozhraní pro obsluhu všech typů událostí EventHandler
◦ Jediná metoda handle(T event), rozhraní typováno:EventHandler<T extendsEvent>na jakéhokoliv potomka třídy Event
Podle metody setOn…() lze implementovat vhodný objekt
◦ MouseEvent pro události myši
◦ ActionEvent pro akce spuštěné v GUI (stisknuté tlačítko)
◦ KeyEvent pro stisknuté klávesy
◦ …
Základní obslužný objekt (Controller):
public Class BTActionHNDL implementsEventHandler<ActionEvent> {
public void handle(ActionEvent e) {…
}
}
…Button btn = new Button();btn.setOnAction(
new ButtonActionHandler());
1.3.2021 UUR - ÚVOD JAVAFX 27
Anonymní vnitřní třídaObsluha události je jen na jednom místě → nepotřebuji celou třídu
◦ Nepřehledné pokud je obsluha delší – neměla by být
Button btn = new Button();
btn.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent e) {
…
}
});
Přímo ve volání metody setOnAction() vytvořena nová třída jako implementace rozhraní EventHandler<ActionEvent>
◦ Typ zvolen podle metody která obsluhu registruje
◦ V metodě handle() je samotná obsluha
1.3.2021 UUR - ÚVOD JAVAFX 28
Malá odbočka k typům v parametrech metodEventHandler<ActionEvent> ◦ typováno na ActionEvent
EventHandler<? super MouseEvent> ◦ typováno na MouseEvent (Event, InputEvent) a její předky („spodní“ hranice)◦ Typicky pro konzumenty – pokud jen vkládám do kolekce (Object ... MouseEvent)
CssMetaData<? extends Styleable> ◦ typováno na Styleable a její potomky („horní“ hranice)◦ Typicky pro producenty – pokud jen vybírám z kolekce (Styleable a potomci)
Označení typů z API:◦ E – prvek (obvykle u kolekcí)◦ K – klíč ◦ V – hodnota◦ T – obecně typ◦ N – číselný typ
1.3.2021 UUR - ÚVOD JAVAFX 29
Lambda výraz jako náhrada vnitřní třídyAnonymní vnitřní třídu lze přepsat na lambda výraz
◦ Pokud je parametrem reference na funkční rozhraní (1 metoda k implementaci, je vidět v dokumentaci k API)
Button btn = new Button();
btn.setOnAction(event -> { … });
Typ parametru event odvodí překladač automaticky z definice metodysetOnAction(EventHandler<ActionEvent> value)
1.3.2021 UUR - ÚVOD JAVAFX 30
Privátní obslužné metodyVe vnitřní třídě / lambda výrazu volána jen jedna obslužná metoda
◦ Součást nadřazené třídy →může být privátnínebo
◦ Z jiné třídy (Controller)
◦ Obsluha vnitřní třídy krátká a přehledná
Button btn = new Button();
btn.setOnAction(event -> btnActionPerformed(event));
…
private void btnActionPerformed(ActionEvent e) {
…
}
1.3.2021 UUR - ÚVOD JAVAFX 31
Obsluha ve vlastním vlákněDlouhá obsluha (komprese, odesílání, ukládání) celkem běžná
◦ Blokuje GUI → zamrzne a nereaguje na uživatele
→ potřebuji oddělit do vlastního vlákna
Rozhraní Worker<V> pro implementaci vlákna◦ Typováno na V – typ návratové hodnoty (vlákno končí vrácením výsledku)◦ Možnost řídit běh „zvenku“ (na rozdíl od běžných Java vláken) – musí zajistit implementující
třída ◦ Lze se dotazovat na stav (isRunning(), getState(), getProgress(), getMessage())
Implementace ve třídě Task<V>◦ Metoda call() ve které je „užitečná práce“
◦ Musí se „chovat hezky“ a podporovat řízení zvenku
◦ Běží na pozadí, dokáže informovat o stavu, neblokuje vykreslovací smyčku◦ Explicitně určena pro použití v JavaFX◦ Jednorázová – při každé obsluze je třeba vytvořit novou instanci
(existuje i znovupoužitelná Service<V>, ale to přináší některé komplikace)
1.3.2021 UUR - ÚVOD JAVAFX 32
Obsluha ve vlastním vlákně –příklad základní smyčkyTask<Integer> task = new Task<Integer>() {
protected Integer call() throws Exception {
int it;
for (it = 0; it < 100000; it++) {
if (isCancelled()) {
break;
}
System.out.println("it " + iterations);
}
return it;
}
};
Thread th = new Thread(task);
th.start();
1.3.2021 UUR - ÚVOD JAVAFX 33
Obsluha ve vlastním vlákně –smyčka s aktualizací stavuTask<Integer> task = new Task<Integer>() {
protected Integer call() throws Exception {
int it;
for (it = 0; it < 100000; it++) {
if (isCancelled()) {
updateMessage("Canceled");
break;
}
updateMessage("Iteration " + it);
updateProgress(it, 100000);
}
return it;
}
};
Thread th = new Thread(task);
th.start();
1.3.2021 UUR - ÚVOD JAVAFX 34
Reprezentace GUI v počítačiSCÉNA
Sada objektů k vykreslení◦ Tlačítka, panely, tabulky, …
Mají určené:◦ Pozice, rozměry, nadřazené prvky
◦ Vzhled
◦ Obslužné objekty
→ lze detekovat události
→ lze jimi manipulovat
Zpracování◦ Souřadnice pro detekci událostí
◦ Překreslení jen toho co je potřeba
◦ Nutné převést na obrázek (u nativního GUI to zařídí OS)
VYKRESLOVANÝ OBRAZ
Bitmapa◦ 2D pole pixelů (barev)
◦ Mohou být 2 – double buffering
Může být přímo vykreslen na zobrazovací zařízení◦ (existují i vektorová – neobvyklé)
Práce s ním hlavně ve fullscreenu◦ Hry, 3D grafika, přehrávání videa
◦ lze získat i okno pro vykreslování(místo nativního GUI – knihovna kreslí všechno sama)
Zpracování◦ Přímé změny barvy na pixelu
◦ Pravidelné překreslení (snímkovací frekvence)
1.3.2021 UUR - ÚVOD JAVAFX 35
Společné vlastnosti všech uzlůSouřadnice
◦ getBoundsInLocal() – netransformované lokální souřadnice
◦ getBoundsInParent() – transformované souřadnice v prostoru rodiče
◦ contains(), intersect() – testuje jestli je bod / obdélník uvnitř uzlu (jen obalový obdélník)
◦ screenToLocal(), LocalToScreen(), ParentToLocal(), LocalToParent() – transformuje souřadnice scény, uzlu a rodiče
Viditelnost a použitelnost◦ setVisible() – viditelnost uzlu (a potomků) – „vyřazuje z grafu“
◦ setOpacity() – nastavení průhlednosti (1 - neviditelné) – stále vykreslován
◦ setDisable() – nastavení uzlu (a potomků) na „vypnuto“
◦ toBack(), toFront() – pohyb v rámci pole potomků
1.3.2021 UUR - ÚVOD JAVAFX 36
Specializované uzly – potomci NodeShape, Shape3D
◦ Společný předek pro obecné tvary (kruhy, čáry, …)
◦ Vlastnosti jako je barva výplně a ohraničení, styl čáry, konce čar …
Canvas
◦ Plocha pro vlastní kreslení („bitmapové“)
ImageView
◦ Uzel pro vykreslování obrázků (Image – png, jpg, gif)
MediaView
◦ Uzel pro vykreslení obsahu média (MediaPlayer)
Parent
◦ Společný předek pro uzly které mohou mít další potomky (grafy, panely)
◦ protected ObservableList<Node> getChildren()v panelech překryta veřejnou podobou
◦ Potomek je i Control – tlačítka a další ovládací prvky
SwingNode◦ Uzel pro vložení Swing komponent – zpětná kompatibilita
1.3.2021 UUR - ÚVOD JAVAFX 37
Vkládání komponentNode má potomky uložené v kolekci (rozhraní ObservableList<Node> - nová kolekce v JavaFX)
◦ Metoda add() a addAll() pro vkládání dalších uzlů(mění i vkládaný uzel – nastavuje mu předka!)
◦ Musím získat referenci na kolekci:
parent.getChildren().add(newNode);
Kořenový uzel se vkládá přes konstruktor:
stage.setScene(new Scene(root, 300, 250));
Primární Stage získám jako parametr metody start():
public void start(Stage primaryStage)
1.3.2021 UUR - ÚVOD JAVAFX 38
Strukturování zdrojového textuJen doporučení – není povinné, ale zlepšuje přehlednost aplikace
1 třída – 1 funkce →◦ Vstupní bod aplikace potomek Application
◦ pro každé okno vlastní třída (může a nemusí být potomek Stage)
◦ GUI by nemělo provádět funkce jádra aplikace → propojit s ním přes vhodné rozhraní(= pokud aplikace ukládá do DB v obsluze se jen volá metoda jádra, ne samotné ukládání)
1 metoda – 1 funkce →◦ Netvořit celé okno v jedné metodě
◦ Konvence:◦ každý uzel stromu scény má vlastní metodu, která vrací Node a stará se o jeho vytvoření
◦ pokud je složen z dalších uzlů, volá potřebné metody
Jednoduchá obsluha◦ V obslužné metodě jen minimum kódu
◦ Ideálně 1 řádek který volá obslužnou metodu (nejspíš privátní)
1.3.2021 UUR - ÚVOD JAVAFX 39
Děkuji za pozornost
OTÁZKY?
NÁZORY, PŘIPOMÍNKY … ?
PŘÍŠTĚ: ZÁKLADNÍ STRUKTURA PROGRAMU –NÁVRHOVÉ VZORY