+ All Categories
Home > Documents > Úvod do JavaFX - zcu.cz

Úvod do JavaFX - zcu.cz

Date post: 21-Oct-2021
Category:
Upload: others
View: 5 times
Download: 0 times
Share this document with a friend
39
Úvod do JavaFX RICHARD LIPKA 1.3.2021
Transcript
Page 1: Úvod do JavaFX - zcu.cz

Úvod do JavaFXRICHARD LIPKA

1.3.2021

Page 2: Úvod do JavaFX - zcu.cz

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

Page 3: Úvod do JavaFX - zcu.cz

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

Page 4: Úvod do JavaFX - zcu.cz

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

Page 5: Úvod do JavaFX - zcu.cz

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

Page 6: Úvod do JavaFX - zcu.cz

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

Page 7: Úvod do JavaFX - zcu.cz

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

Page 8: Úvod do JavaFX - zcu.cz

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

Page 9: Úvod do JavaFX - zcu.cz

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

Page 10: Úvod do JavaFX - zcu.cz

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

Page 11: Úvod do JavaFX - zcu.cz

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

Page 12: Úvod do JavaFX - zcu.cz

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

Page 13: Úvod do JavaFX - zcu.cz

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

Page 14: Úvod do JavaFX - zcu.cz

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

Page 15: Úvod do JavaFX - zcu.cz

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

Page 16: Úvod do JavaFX - zcu.cz

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

Page 17: Úvod do JavaFX - zcu.cz

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

Page 18: Úvod do JavaFX - zcu.cz

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

Page 19: Úvod do JavaFX - zcu.cz

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

Page 20: Úvod do JavaFX - zcu.cz

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

Page 21: Úvod do JavaFX - zcu.cz

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

Page 22: Úvod do JavaFX - zcu.cz

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

Page 23: Úvod do JavaFX - zcu.cz

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

Page 24: Úvod do JavaFX - zcu.cz

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

Page 25: Úvod do JavaFX - zcu.cz

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

Page 26: Úvod do JavaFX - zcu.cz

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

Page 27: Úvod do JavaFX - zcu.cz

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

Page 28: Úvod do JavaFX - zcu.cz

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

Page 29: Úvod do JavaFX - zcu.cz

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

Page 30: Úvod do JavaFX - zcu.cz

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

Page 31: Úvod do JavaFX - zcu.cz

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

Page 32: Úvod do JavaFX - zcu.cz

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

Page 33: Úvod do JavaFX - zcu.cz

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

Page 34: Úvod do JavaFX - zcu.cz

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

Page 35: Úvod do JavaFX - zcu.cz

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

Page 36: Úvod do JavaFX - zcu.cz

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

Page 37: Úvod do JavaFX - zcu.cz

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

Page 38: Úvod do JavaFX - zcu.cz

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

Page 39: Úvod do JavaFX - zcu.cz

Děkuji za pozornost

OTÁZKY?

NÁZORY, PŘIPOMÍNKY … ?

PŘÍŠTĚ: ZÁKLADNÍ STRUKTURA PROGRAMU –NÁVRHOVÉ VZORY


Recommended