JavaFX

JavaFX
Podstawowe dane

deweloper Wyrocznia
Aktualna  wersja 14
( 10 marca 2020 )
system operacyjny Windows , macOS , Linux
język programowania Jawa
Kategoria Struktura
Licencja GPL z wyjątkiem powiązania GPL
OpenJFX w java.net i openjfx.io

JavaFX to framework do tworzenia cross-platform Java - aplikacje . Jest to specyfikacja Java od Oracle i cele , aby ułatwić profesjonalnego tworzenia i dystrybucji interaktywnych , multimedialnych treści i graficznych interfejsów użytkownika (GUI) na wszystkich platformach Java .

Do 2014 roku AWT i Swing były standardowymi rozwiązaniami dla aplikacji graficznych w Javie. Jednak to trwało przez lata. Wystąpiły luki w dziedzinie mediów i animacji , na które jest obecnie zapotrzebowanie w przypadku nowoczesnych interfejsów graficznych. Zamiast inwestować w dalszy rozwój AWT / Swing, Oracle zdecydowało się całkowicie przebudować poziom GUI za pomocą JavaFX.

JavaFX jest charakterystyczny dla grafu sceny (ang. Scene graph ), który zarządza poszczególnymi komponentami GUI. Dzięki FXML umożliwia również deklaratywny opis interfejsów graficznych w oparciu o XML . Scene Builder jest graficznym narzędziem, które upraszcza tworzenie plików FXML. Ponadto do projektowania można również wykorzystać technologie internetowe , takie jak CSS, poprzez osadzenie ich w kodzie FXML.

Ponieważ JavaFX oferuje wszystkie interfejsy API dla nowoczesnych interfejsów i nie jest zależny od AWT / Swing, tworzy kompletny stos mediów. JavaFX ma bezpośredni dostęp do wszystkich umiejętności 2D / 3D nowoczesnych procesorów graficznych . Więc wszystko można zaprogramować za pomocą JavaFX, które wcześniej najlepiej było zaimplementowane we Flashu .

Środowisko wykonawcze JavaFX było częścią każdej instalacji środowiska x86 Java SE od wersji Java SE Runtime 7 Update 6 do 10.

Historia rozwoju

Historia JavaFX nie jest szczególnie prosta. Początkowo firma Sun / Oracle chciała umieścić JavaFX jako zamiennik Flasha w Internecie, ale połączenie HTML5 i CSS3 oraz JavaScript było zbyt atrakcyjne. Obecnie jest to głównie zestaw narzędzi GUI do klasycznych aplikacji klienckich .

Wersja 1

JavaFX został ogłoszony w maju 2007 roku i zaprezentowany na konferencji deweloperów JavaOne w maju następnego roku . 4 grudnia 2008 firma Sun oficjalnie wydała JavaFX 1.0 jako zestaw deweloperski dla systemów Windows i macOS . Wydanie JavaFX 1.0 pojawiło się wraz z językiem programowania JavaFX Script . Język ten ułatwił tworzenie hierarchicznych grafów obiektów i oferował dobrą składnię dla powiązań obiektów, z którymi można było synchronizować stany.

Wersja 1.2 została wydana w czerwcu 2009 roku. Zawierał między innymi konfigurowalne kontrolki interfejsu użytkownika, dodatkowe klasy układu (Tile, Stack, Flow, ClipView, Panel), obsługę kanałów RSS / Atom. Nie jest kompatybilny wstecz. Linux i Solaris są obsługiwane dopiero od tej wersji . Wersja 1.3 (nazwa kodowa SoMa) została wydana 22 kwietnia 2010 roku. Najbardziej oczywistą innowacją jest czasami ogromny wzrost wydajności. Nowością jest także JavaFX TV, oficjalne API CSS do projektowania elementów sterujących JavaFX, kilka nowych, pożądanych elementów sterujących i obsługa 3D. Wersja 1.3.1 została wydana 21 sierpnia 2010 r. I poprawiła pasek postępu podczas uruchamiania i debugowania w Netbeans 6.9.1.

Wersja 2

JavaFX 2.0 pojawiła się zgodnie z zapowiedziami w trzecim kwartale 2011 r. Ta wersja nie używa JavaFX Script, „ponieważ Oracle nie chciało budować innego języka programowania, ale czysto Java API, do którego programiści mogliby się odwołać z różnych istniejących języków skryptowych.” JavaFX Interfejsy API skryptów przeniesione do języka Java. Renderowanie sprzętowe zostało również zoptymalizowane w JavaFX 2.0, dzięki czemu gry i złożone reprezentacje 3D powinny być teraz możliwe. JavaFX 2.0 renderuje zawartość HTML i JavaScript przy użyciu biblioteki WebKit . Kiedy nowa wersja została wydana, Oracle ogłosiło, że będzie nadal rozwijać JavaFX jako projekt open source w ramach OpenJDK .

JavaFX rozwijał się coraz bardziej w kierunku alternatywy Swing / AWT. JavaFX 2.2 została wydana w sierpniu 2012 roku. Zostało to zintegrowane z JRE / JDK 7 Update 6. Krok był niezwykły, ponieważ tak duże dodatki nigdy nie zostały wprowadzone jako aktualizacja JRE / JDK.

Rozwój w kierunku Open Source zaowocował OpenJFX, który wraz z OpenJDK pozwala na zbudowanie całkowicie darmowego systemu Java ze stosem GUI na licencji GPL .

Wersja 8

Wraz z przejściem do wydania Java 8, JavaFX przeskoczył z 2 do teraz 8. JavaFX 8 wnosi ze sobą kilka innowacji. Na przykład oferuje lambdy jako nową konstrukcję językową. Jedną z dużych innowacji jest również JavaFX-UI-Toolkit, który jest dostarczany z Java 8 jako zalecany zestaw narzędzi UI. Zestaw narzędzi FXML oferuje między innymi. XML -na języka do tworzenia interfejsów użytkownika.

W wersji 8u33 zaprzestano obsługi technologii ARM firmy Oracle dla JavaFX. Dlatego JavaFX nie jest już uwzględniana w oficjalnych dystrybucjach Java dla ARM.

Mapa drogowa

„Mobile first” i „Web first” motywują Oracle do zaprzestania wsparcia dla JavaFX, prawdopodobnie w marcu 2025 roku. Dalszy rozwój będzie następnie odbywał się jako oddzielny moduł open source, nad którym Oracle już pracuje z zainteresowanymi stronami.

architektura

Architektura JavaFX jest zupełnie nowa iw szczególności nie jest oparta na Swingu ani AWT. Jednak oznacza to również, że JavaFX i AWT / Swing nie mogą być po prostu mieszane (nawet jeśli istnieją na to rozwiązania). JavaFX oferuje kompletne API dla nowoczesnych interfejsów. Główne pakiety tego API to:

Pakiet opis
javafx.animation Zajęcia do animacji oparte na przejściach
javafx.application Zajęcia z podstawowego cyklu życia aplikacji
javafx.collections Niezbędne kolekcje JavaFX, w tym narzędzia
javafx.event Podstawowa struktura zdarzeń JavaFX i ich obsługa
javafx.fxml Klasy do ładowania hierarchii obiektów ze struktury znaczników, takiej jak FXML
javafx.geometry Ćwiczenia z operacji geometrycznych na obiektach dwuwymiarowych
javafx.scene Podstawowe klasy interfejsu API JavaFX Scene Graph oraz pakiet nadrzędny poszczególnych składników i elementów. Zawiera pakiety podrzędne, takie jak płótno, wykres, sterowanie, efekt, obraz, dane wejściowe, układ, media, farba, kształt, tekst, transformacja, sieć itp.
javafx.stage Klasy kontenerów najwyższego poziomu dla treści JavaFX
javafx.util Różne narzędzia i klasy pomocnicze

Poniższa grafika przedstawia architekturę JavaFX oficjalnie reprezentowaną przez Oracle:

Javafx-architecture.svg

Podobnie jak w przypadku każdej aplikacji Java, JavaFX ma również wirtualną maszynę Java (JVM) na najniższym poziomie , która jest odpowiedzialna za wykonanie kodu bajtowego Java . Zwykle każdy uruchomiony program Java jest wykonywany na własnej maszynie wirtualnej (VM).

Odpowiednie narzędzia programistyczne dla języka Java lub JavaFX są dostarczane w zestawie Java SE Development Kit (lub po prostu w zestawie Java Development Kit, w skrócie JDK). Na tej podstawie istnieje wiele rozszerzeń, z których niektóre były używane w Javie od bardzo dawna, na przykład Java 2D do rysowania dwuwymiarowych kształtów.

Prism to nowy silnik renderujący, który wykorzystuje sprzęt graficzny (jeśli jest obsługiwany). Między innymi udostępnia na wysokim poziomie właściwości Java 2D oraz różne efekty graficzne, takie jak cienie, odbicia, transformacje czy animacje. Jest renderowany za pomocą OpenGL pod Linuksem i macOS , podczas gdy Direct3D jest używany w systemie Windows . Jeśli sprzęt graficzny nie jest obsługiwany, używany jest program zastępczy do języka Java 2D.

Szkło Windowing Toolkit zapewnia niskim poziomie systemu operacyjnego procedur , takich jak zarządzanie okna, liczniki lub zarządzania zdarzeniami. Służy jako warstwa zależna od platformy, która łączy platformę JavaFX z systemem operacyjnym.

Silnik multimediów jest oparty na GStreamer i oferuje szerokie wsparcie dla audio i wideo. Silnik sieciowy umożliwia osadzanie treści internetowych w aplikacjach JavaFX. Obejmuje to renderowanie HTML oparte na silniku WebKit , renderowanie zależne od sprzętu przez Prism oraz opcję dostępu do DOM i manipulowania DOM.

Quantum Toolkit linki Prism, szkło okienkowanie Toolkit, mediów Engine i Web silnik i czyni je jednakowo dostępne dla API JavaFX. JavaFX API i Quantum Toolkit zawierają szczegóły niższych poziomów i ukrywają je przed użytkownikiem. Zasadniczo programista JavaFX nie musi wiedzieć, jak działają niższe poziomy.

Struktura aplikacji JavaFX

Cykl życia JavaFX

Image
Cykl życia aplikacji JavaFX

Aplikacji JavaFX rozszerzyć klasę bazową Application , cyklu życia metod , takich jak init(), start()lub stop() dziedziczona . Te metody mogą (lub muszą) zostać przesłonięte w aplikacji JavaFX . Program uruchamiający JavaFX dba o to, aby były one odpowiednio wywoływane. Więc JavaFX aplikacje nie wymagają mainmetoda: własny statyczny main(String[])sposób kieruje statyczną launch(String[])metodę Application- klasy na i daje jej wszystkie parametry połączenia . Ponieważ metoda klasy launch(...)wie, do której klasy została wywołana, tworzy instancję tej klasy, a następnie wywołuje metody cyklu życia.

Cykl życia aplikacji JavaFX wygląda następująco:

  1. Po uruchomieniu aplikacji, JavaFX Runtime najpierw konstruuje wystąpienie w Applicationklasie.
  2. init()Metoda utworzonej instancji jest teraz wykonywana. Ta metoda jest domyślnie implementowana jako pusta i niekoniecznie musi być nadpisywana. Na przykład parametry wywołania można odczytać tutaj. Jednak nie można jeszcze tworzyć tutaj żadnych elementów interfejsu użytkownika.
  3. Następnie start(javafx.stage.Stage)wywoływana jest metoda , którą należy przesłonić dowolna aplikacja JavaFX. JavaFX przenosi etap do metody, która z grubsza odpowiada zadaniu głównego kontenera i najlepiej ją porównać z oknem startowym.
  4. Środowisko wykonawcze JavaFX czeka teraz na zakończenie działania aplikacji. Można to zrobić w następujący sposób:
    • wywołując metodę Platform.exit()
    • zamykając ostatnie okno i ustawiając atrybut implicitExitPlatforma na true.
  5. Teraz środowisko wykonawcze wywołuje stop()metodę przed zatrzymaniem procesu Java . Ponownie, ta metoda niekoniecznie musi zostać nadpisana.

Etapie

Image
Etap tworzy ramy dla faktycznej treści. Klasa Scene zarządza wykresem sceny. To jest zakorzenione drzewo złożone z węzłów. Węzły nadrzędne zawierają dalsze węzły, podczas gdy węzły liści reprezentują widoczne elementy GUI (przycisk, pole tekstowe, suwak itp.).

start(...)Metodą jest Stagewprost. Dlatego parametr of start(...)jest typu javafx.stage.Stage. Ta klasa jest kontenerem JavaFX najwyższego poziomu, który jest zawsze tworzony przez platformę - jako parametr start(...)metody. Najlepiej można to porównać do okna startowego . W aplikacji można również tworzyć dodatkowe obiekty sceny .

Scena może być wykorzystana do wykonania wielu scen lub (Engl. Sceny ) do prezentacji. Nazewnictwo klas podstawowych Stagei Scenejest podobne do teatru: Scena to scena wymieniona na scenie. Tworzy ramy dla rzeczywistej treści.

Podobnie jak w przypadku okna, istnieje wiele opcji ustawień dla obiektu stołu montażowego, na przykład przy użyciu odpowiednich metod

  • setWidth(double value)i określ setHeight(double value)wysokość i szerokość sceny oraz
  • setTitle(java.lang.String value) ustawia tytuł okna.

StageStyleOkreśla wygląd okna. Wartość domyślna to DECORATEDta, która wyświetla okno z obramowaniem i elementami sterującymi w zależności od systemu operacyjnego i białym tłem. Większość właściwości obiektu Stage jest jednak tylko do odczytu, ponieważ są one zmieniane przez platformę bazową.

Scena

Na sceniejavafx.scene.Scene jest zwykle prezentowana jedna lub więcej scen tego typu . Ta klasa jest kontenerem dla całej zawartości na wykresie sceny, który zarządza poszczególnymi komponentami GUI .

Z punktu widzenia teorii grafów, graf sceny to zakorzenione drzewo składające się z węzłów ( istnieje niemiecki węzeł ). Jako węzły wewnętrzne istnieją węzły nadrzędne, które mogą zawierać dalsze węzły (węzły) jako dzieci. Arkusz (Engl. Węzeł liścia ), jednak nie ma więcej dzieci. Liście reprezentują teraz widoczne elementy GUI (np. Przyciski, okna tekstowe i suwaki), węzły macierzyste niewidoczne elementy strukturalne (np. BorderPane, HBox i VBox). Aplikacja musi mieć węzeł główny (ang. Węzeł główny ), aby można było określić wykres sceny. To jest coś w rodzaju źródła, z którego rozwija się cała scena. Nie jest to argument dla konstruktora w Sceneobiekcie do tego. Te Sceneobiekty muszą być tworzone i modyfikowane w zgłoszeniu JavaFX wątku .

Jest Sceneto również łącze między oknem udostępnianym przez system operacyjny a wykresem sceny. Jeśli na przykład okno jest powiększone, próbuje Sceneprzekazać tę zmianę do węzła głównego: isResizableW tym celu wywołuje metodę w węźle głównym, aby dowiedzieć się, czy węzeł chce reagować na zmiany rozmiaru. Jeśli węzeł truepowróci, zmieni Scenego na nowy rozmiar, falsepozostawi go w.

Za pomocą polecenia stage.setScene(scene)wykres sceny pojawia Scenesię na scenie za pośrednictwem klasy . Wszystkie obiekty graficzne aplikacji JavaFX są obecne w dowolnym momencie, tj. H. nie istnieją tylko w momencie rysowania.

Węzły

Image
Hierarchia klas węzłów w JavaFX.

Wszystkie obiekty na wykresie sceny są tego typu Node. Tworzą one zatem zawartość wykresu sceny. Każdy węzeł i każdy element na wykresie sceny jest z kolei podtypem klasy abstrakcyjnej Node.

Podklasa Nodeto Parent. Węzły nadrzędne są klasą bazową dla wszystkich węzłów, które zawierają dodatkowe węzły jako dzieci, tj. Są kontenerami. Istnieją podklasy klasy Parent:

  • Klasa Groupłączy kilka elementów w jednym węźle. Pozwala na przykład na zastosowanie transformacji i efektów do grupy i delegowanie przez nią do wszystkich elementów (dzieci) grupy. GroupWęzeł biegnie jedna ObservableListz dziećmi. Metodę getChildren()można wykorzystać do wywołania listy dzieci, które następnie można dodać za pomocą getChildren().add(element)kolejnych elementów. One Groupnie dba o pozycjach dziecięcych i nie można regulować za pomocą CSS.
  • Klasa Regiontworzy klasę bazową dla wszystkich kontrolek i układów oraz rozszerza klasę bazową o wiele opcji stylizacji przez CSS. Stamtąd Regionjest klasa niższa Pane, którą są dzieci metodami publicznymi na zewnątrz. Na BorderPaneprzykład klasa pochodna umieszczona nad dziećmi (u góry ), po lewej (po lewej ), po prawej (po prawej ), od dołu (u dołu ) i pośrodku (na środku ).
  • Klasa Controlrozszerza klasę Region. Jest to klasa bazowa dla komponentów, które umożliwiają wprowadzanie danych przez użytkownika w jakiejś formie. Obejmuje to na przykład przyciski lub etykiety. Każdy element sterujący można z kolei edytować optycznie za pomocą CSS.

JavaFX jest dostarczany - podobnie jak Swing - z zestawem standardowych komponentów w pakiecie javafx.scene.controli ma Controljako klasę bazową. Poniższy przegląd zawiera najważniejsze kontrolki dostępne w JavaFX:

Kontrola posługiwać się
Etykieta Etykieta jest jednym z najprostszych kontroli. Składa się z tekstu i dowolnego innego węzła do deklaracji. Często używa się do tego obrazu.
Hiperłącze Odpowiada HTML - hiperłącza i jest domyślnie wyświetlany jako niebieski podkreślony tekst.
Przycisk Przycisk może być wciśnięty. Status wyboru zostaje zachowany.
Przycisk radiowy Przycisk wyboru do indywidualnego wyboru z grupy przycisków opcji . Stan wyboru pozostaje zachowany do momentu wybrania innego przycisku w tej samej grupie.
ToggleButton Przycisk opcji, który istnieje w dwóch stanach: zaznaczony i niewybrany. Zachowuje się jak CheckBox lub RadioButton.
CheckBox Pole wyboru to pole wyboru z trzema możliwymi stanami: niezdefiniowany, zaznaczony i niezaznaczony. Status wyboru pozostaje zachowany, dopóki nie zostanie zmieniony.
ChoiceBox Lista wyboru umożliwiająca wybranie pojedynczej pozycji z najlepiej krótkiej listy.
Pole tekstowe Jednowierszowe pole do wprowadzania tekstu z kontrolą kursora i wyborem.
TextArea Wielowierszowe, dowolne pole wprowadzania tekstu z kontrolą kursora i wyborem.
ListView Standardowy komponent do wyświetlania list obiektów.
TableView Składnik tabeli, który składa się z serii kolumn (TableColumns). Poszczególne komórki są reprezentowane jako TableCell.
TitledPane Częściowe okno dialogowe, które można otwierać i zamykać.
ScrollPane Służy do przemieszczania i prezentowania sekcji z poziomym i pionowym paskiem przewijania ( pasek przewijania ).

Początkowo kontrolki to tylko węzły, które można dodać do SceneGraph, a następnie wyświetlić. Oczywiście odpowiednie klasy dla kontrolek interfejsu użytkownika zapewniają różne specyficzne właściwości i metody do obsługi typowych interakcji z użytkownikami.

Przykłady programów

Witaj świecie JavaFX!

Poniższy przykład programu przedstawia typowy program Hello World w JavaFX:

package application;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

	@Override
	public void start(Stage primaryStage) {
		Label label = new Label("Hello JavaFX World!");

		StackPane root = new StackPane();
		root.getChildren().add(label);

		Scene scene = new Scene(root, 400, 300);

		primaryStage.setTitle("Hello JavaFX World!");
		primaryStage.setScene(scene);
		primaryStage.show();
	}

	public static void main(String[] args) {
		launch(args);
	}
	
}

Klasa Mainjest Applicationpochodną klasy . Metoda własna main(...)przekazuje dalej do launch(...)metody klasy Application. W utworzonej instancji Applicationklasy najpierw init()wykonywana jest metoda, która domyślnie pozostaje pusta.

Następnie start(...)wykonywana jest metoda, która, tak jak tutaj, musi zostać nadpisana przez każdą aplikację JavaFX. JavaFX przekazuje metodę, Stagektórą można porównać z oknem startowym. start()Następujące teraz kroki są wykonywane w sposób:

  • Tworzona jest prosta kontrolka etykiety label. Wyświetlany tekst „Hello JavaFX World!” Jest tutaj przekazywany bezpośrednio do konstruktora.
  • Teraz tworzona StackPanejest nazwa root. Spowoduje to umieszczenie wszystkich elementów podrzędnych jeden na drugim w kolejności, w jakiej zostały dodane. Domyślnie komponenty są wyśrodkowane w StackPane. root.getChildren().add(label)Wcześniej utworzony plik jest teraz Label labeldodawany za pośrednictwem .
  • Teraz jest Scene scenetworzony jeden, który można następnie Stagezaładować do . Aplikacja musi określić węzeł główny dla wykresu sceny. W tym przykładzie jest to rootobiekt typu StackPane. Ponadto konstruktor ma określony rozmiar wyświetlania ( ).
  • W następnym kroku primaryStage.setTitle("Hello JavaFX World!")tytuł okna aplikacji jest również ustawiany na „Hello JavaFX World!”. Najważniejsze jest jednak przypisanie sceny, scenektóra odnosi się do faktycznej treści. show()Metoda teraz próbuje wyświetlić okno poprzez ustawienie widoczności true.

Cykl życia

package application;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.stage.Stage;

public class CycleOfLife extends Application {

	@Override
	public void init() {
		System.out.printf("Die Methode init(), aufgerufen im Thread %s%n",
				Thread.currentThread());
	}

	@Override
	public void start(Stage primaryStage) {
	   System.out.printf("Die Methode start(), aufgerufen im Thread %s%n",
                  Thread.currentThread());
	   Platform.exit();
	}

	@Override
	public void stop() {
		System.out.printf("Die Methode stop(), aufgerufen im Thread %s%n",
				Thread.currentThread());
	}

	public static void main(String[] args) {
		System.out.printf("Die Methode main(), aufgerufen im Thread %s%n",
				Thread.currentThread());
		launch(args);
	}
	
}

Program dostarcza z grubsza następujące dane wyjściowe:

Metoda main (), wywoływana w wątku wątku [main, 5, main]
Metoda init () wywoływana w wątku wątku [JavaFX-Launcher, 5, main]
Metoda start () wywoływana w wątku wątku [JavaFX Application Thread, 5, main]
Metoda stop () wywoływana w wątku wątku [JavaFX Application Thread, 5, main]

main(...)Sposób CycleOfLifepołączeń Application.launch(...)i instancją Applicationpodklasy jest tworzony w zgłoszeniu JavaFX wątku . init()Metoda jest wywoływana w wątku JavaFX Launcher , który jest wątek, który uruchamia aplikację. Aby wykonać metody start()i stop(), JavaFX tworzy wątek o nazwie Wątek aplikacji JavaFX . Utworzenie Stagei Sceneobiektów i modyfikacje wykresie sceny musi odbywać się w tym nici aplikacji JavaFX .

Obsługa zdarzeń

Obsługa zdarzeń JavaFX to konsekwentny dalszy rozwój obsługi zdarzeń w ramach AWT i Swing lub samej Javy, ale także w sieci. Nowoczesne programy graficzne są bardzo zorientowane na wydarzenia. Potrzebujesz zatem mechanizmów, które reagują na wystąpienie zdarzeń.

Ralph Steyer wyjaśnia podstawową ideę obsługi zdarzeń w następujący sposób:

Jeden obiekt może odpalić obiekt zdarzenia, a inny obiekt rejestruje się na reakcję na niego (tzw. Nasłuchiwacz zdarzenia), np. W przypadku iskry, w której nadajnik wysyła komunikat swoim radiem na określonej częstotliwości i odbiornik wysyła swoje radio dostrojone do tej częstotliwości, odbiera wiadomość. Dokładnie w ten sam sposób odbiorca może zareagować na wiadomość o zdarzeniu lub zignorować wiadomość. W związku z tym o konkretnej obsłudze zdarzenia decyduje obiekt detektora.

Zdarzenia JavaFX

Pakiet javafx.eventzawiera odpowiednie klasy i interfejsy do obsługi zdarzeń w JavaFX. Zasadniczo, konkretne wydarzenie wystąpienie klasy javafx.event.Eventlub jedną z jego podklasy, takie jak DragEvent, KeyEvent, MouseEventi ScrollEvent.

Gdy wystąpi zdarzenie, do określenia, który węzeł jest celem obiektu zdarzenia, używany jest mechanizm wewnętrzny. Na przykład w przypadku zdarzeń myszy celem jest węzeł w miejscu wskaźnika myszy. Z wybranego celu zdarzenia istnieje łańcuch wysyłania zdarzeń, który biegnie do początku wykresu sceny.

Zawsze najpierw podejmowana jest próba obsłużenia zdarzenia w najbardziej wewnętrznym elemencie, w którym miało ono miejsce. Wymaga to odpowiedniej procedury obsługi zdarzeń (lub innej struktury obsługi). Następnie element obiektu zdarzenia jest przekazywany do następnego najwyższego obiektu w drzewie itd. Mówi się w tym kontekście bulgotania zdarzenia, ponieważ obiekt zdarzenia, taki jak bańka (ang. Bubble ), wznosi się do korzenia wykresu sceny. Jeśli nie można tego potraktować do korzenia, zostanie zniszczone. Jest to dość reguła, gdyż wiele zdarzeń, takich jak przesunięcie wskaźnika myszy o kilka milimetrów, nie wymusza określonej reakcji ze strony aplikacji.

Procedura obsługi zdarzeń

Jeśli dowolny węzeł na trasie obiektu zdarzenia zarejestrował procedurę obsługi zdarzenia, zdarzenie jest zużywane. Zadaniem programisty jest zatem odpowiednie wyłapanie zdarzenia i zaimplementowanie na nie reakcji. Programy obsługi zdarzeń w zasadzie implementują EventHandlerinterfejs, co handle()wymusza nadpisanie opisanej tam metody. To jest miejsce, do którego należy właściwa reakcja na zdarzenie, które miało miejsce. Ta metoda zawiera następnie obiekt zdarzenia odpowiedniego typu jako parametr.

Poniższe dwie metody oferują ogólny sposób dodawania lub wyrejestrowywania programu obsługi zdarzeń do obiektu węzła:

  • addEventHandler(EventType<T>, EventHandler<? super T>) aby dodać obsługę
  • removeEventHandler(EventType<T>, EventHandler<? super T>) wylogować program obsługi.

Pierwszy parametr określa konkretne zdarzenie, na które chcesz zareagować, a drugi parametr określa samą procedurę obsługi zdarzeń.

Często program obsługi zdarzeń jest tworzony i rejestrowany jako klasa anonimowa , z handle()metodą zaimplementowaną bezpośrednio w celu zapewnienia żądanych działań. Po pierwsze, Button btnmogłoby to wyglądać mniej więcej tak:

btn.addEventHandler(ActionEvent.ACTION, new EventHandler<ActionEvent>() {
	@Override
	public void handle(ActionEvent event) {
		// do something here
	}
});

Jako wyrażenie lambda może wyglądać mniej więcej tak:

btn.addEventHandler(ActionEvent.ACTION, (event) -> {
    // do something here
});

Ponadto klasy komponentów oferują również własne metody ustawiające dla określonych zdarzeń, które mają następujący format:

setOnEventType(EventHandler handler)

Wskazuje EventTypena rodzaj zdarzenia. Na przykład istnieje Buttonnastępująca metoda setOnAction(EventHandler<ActionEvent>):

btn.setOnAction(new EventHandler<ActionEvent>() {
    @Override
	public void handle(ActionEvent event) {
		// do something here
	}
});

Dynamiczne struktury danych z powiadomieniami o zmianach

W JavaFX indywidualne wartości nie są tylko observierbar ale również dynamiczne struktury danych , które są w pakiecie javafx.collectionsto: ObservableList, ObservableMapa ObservableSetpochodzące z każdego interfejsu obserwowalnych i dodać każdy sposób przyczynia się do odpowiedniego ChangeListenerrejestru. Tak więc nowe struktury danych rozszerzenie java.utilstruktur danych List, Seta Mapi może zgłosić zmiany.

Na ObservableListprzykład istnieje interfejs dla takiego, ListChangeListenerktóry reaguje na zmiany w obserwowanej liście. Klasa ListChangeListener.Changereprezentuje zmianę wprowadzoną na takiej liście. Z

observableList.addListener(new ListChangeListener(){/* do something here */});

słuchacz jest następnie rejestrowany pod kątem zmian na liście.

Właściwości i powiązanie danych

Właściwości i powiązanie danych to dwa potężne mechanizmy językowe w JavaFX, których można używać do tworzenia relacji między zmiennymi. Zwykle służą do (wzajemnej) aktualizacji wartości. Na przykład użytkownik obsługuje suwak, który steruje szerokością prostokąta iw zależności od ustawionej wartości, widthwartość modelu danych musi zostać zaktualizowana, a obszar prostokąta ponownie obliczony. W celu porównania danych między sobą istnieje zatem koncepcja właściwości i powiązania danych.

W JavaFX właściwości są podstawowymi blokami konstrukcyjnymi do przetwarzania i informowania o zmianach wartości. Stanowią podstawę wygodnego wiązania danych. Właściwość to kontener danych, który umożliwia również powiadamianie o zmianach. Inne klasy zainteresowane zmianami mogą zarejestrować się jako słuchacze. Wiązanie jest również określane jako zależność lub zależność .

Powiązane interfejsy API są podzielone na dwie kategorie w JavaFX:

  • Interfejs API wysokiego poziomu: zapewnia łatwy sposób tworzenia powiązań w większości sytuacji. W szczególności uzupełnianie kodu jest zapewniane w środowiskach IDE, takich jak NetBeans.
  • Interfejs API niskiego poziomu: ten interfejs API jest bardzo elastyczny, oszczędny i szybki oraz oferuje rozszerzone opcje, jeśli interfejs API wysokiego poziomu nie jest wystarczający.

Pakiet javafx.beans.propertyróżnych klas własności są zdefiniowane, takie jak hermetyzacji int, long, float, double, booleani String. Właściwości implementują interfejs Observablelub służą do powiadamiania o zmianach ObservableValue<T>. Na przykład zamiast pierwotnego typu danych doubleDoubleProperty używany jest nowy typ, który double„opakowuje” typ pierwotny . Oprócz metod pobierających i ustawiających właściwości JavaFX mają również dodatkową metodę, która kończy się właściwością i zwraca obiekt właściwości.

Poniższy przykład pochodzi z dokumentacji Java firmy Oracle i definiuje klasę o nazwie Bill( faktura niemiecka ), która implementuje pojedynczą właściwość o nazwie amountDue( kwota należna w Niemczech ):

package application;

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;

public class Bill {

	// Definiere eine Variable um die Property zu speichern
    private DoubleProperty amountDue = new SimpleDoubleProperty();

    // Definiere die Getter-Methode für den Wert der Property
    public final double getAmountDue() {
    	return amountDue.get();
    }

    // Definiere die Setter-Methode für den Wert der Property
    public final void setAmountDue(double value) {
    	amountDue.set(value);
    }

    // Definiere einen Getter für die Property selbst
    public DoubleProperty amountDueProperty() {
    	return amountDue;
    }

}

amountDuePrzedmiot jest przykładem z klasy javafx.beans.property.DoubleProperty. Aby go zamknąć, jest privateoznaczony jako. Zgodnie z konwencją nazewnictwa dotyczącą uzyskiwania dostępu do właściwości dostępne są następujące metody:

  • getAmountDue()Metoda jest domyślnym getter że amountDuezwraca aktualną wartość nieruchomości. Wartość zwracana przez tę metodę to double(a nie coś DoubleProperty). Metoda pobierająca powinna być finalzadeklarowana jako.
  • setAmountDue(double)Metoda jest również finaluznany jako i umożliwia wartość nieruchomości być ustawione na zewnątrz. Twój parametr jest również double.
  • amountDueProperty()Metoda definiuje getter właściwości i wraca sama nieruchomość. Jest to nowa konwencja, na którą składa się nazwa własności (tutaj amountDue ) i słowo property .

Właściwości są szczególnie interesujące, gdy obserwuje się ich zmiany. W modelu zdarzeń Java istnieją tzw. Wyzwalacze zdarzeń ( źródła zdarzeń ), takie jak przyciski czy suwaki. Te zdarzenia mogą pochodzić od użytkowników interfejsu graficznego, ale można je również prześledzić z powrotem do ich własnych wyzwalaczy. Oprócz wyzwalaczy zdarzeń istnieje szereg zainteresowanych stron, tak zwanych słuchaczy, którzy chcą być informowani o wystąpieniu określonego zdarzenia. W tym przypadku istnieje ChangeListener( javafx.beans.value.ChangeListener) addListener()dla właściwości, które można dołączyć do właściwości za pomocą metody, która jest zwracana z odpowiednią metodą pobierającą.

Aby zilustrować ChangeListener, w dokumentacji języka Java w Mainklasie tworzona jest instancja electricalBillklasy Bill(patrz wyżej):

package application;

import javafx.beans.value.ObservableValue;
import javafx.beans.value.ChangeListener;

public class Main {

    public static void main(String[] args) {
    	Bill electricBill = new Bill();

    	electricBill.amountDueProperty().addListener(new ChangeListener<Object>(){
    		@Override
    		public void changed(ObservableValue<?> o,Object oldVal, Object newVal) {
    			System.out.println("Electric bill has changed!");
    		}
    	});

        electricBill.setAmountDue(100.00);
    }

}

Wynik pojawia się w konsoli Rachunek za prąd się zmienił! . Słuchacz zauważył, że electricBill.setAmountDue(100.00)wartość właściwości amountDue została zmieniona i odpowiedni komunikat został changed(...)wyprowadzony za pomocą metody.

Interfejsy API wysokiego poziomu to najłatwiejszy i najszybszy sposób korzystania z powiązań. Składają się z dwóch części: Fluent API i klasy Binding. Interfejs API Fluent udostępnia wiele metod dla obiektów zależnych, podczas gdy klasa Binding oferuje statyczne metody fabryczne.

W poniższym przykładzie dwie liczby całkowite są powiązane w taki sposób, że ich wartości są zawsze automatycznie dodawane do sumy sum :

package application;

import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.binding.NumberBinding;

public class Main {

    public static void main(String[] args) {
        IntegerProperty num1 = new SimpleIntegerProperty(1);
        IntegerProperty num2 = new SimpleIntegerProperty(2);

        NumberBinding sum = num1.add(num2);

        System.out.println(sum.getValue());

        num1.set(2);

        System.out.println(sum.getValue());
    }

}

Istnieją trzy zmienne w całości, w szczególności dwóch zmiennych zależnych num1i num2a wiązanie sum. Zmienne zależne są zarówno typu, jak IntegerPropertyi samo wiązanie jest typu NumberBinding. sumZatem wartość zmienia się automatycznie, jeśli num1lub num2zmienia się.

Deklaratywne opisy GUI

Zasadniczo interfejsy graficzne można skonfigurować za pomocą programu API lub można je określić w opisie deklaratywnym . W przypadku interfejsów deklaratywnych rozmieszczenie komponentów jest opisane w zewnętrznym pliku zasobów.

FXML

Oprócz możliwości budowania wykresu sceny za pomocą kodu programu, JavaFX oferuje również możliwość konfiguracji obiektów za pomocą XML . Dzięki FXML, JavaFX zapewnia łatwy do nauczenia, deklaratywny język, który umożliwia alternatywną definicję interfejsów graficznych wyłącznie za pomocą XML. Ponieważ XML ma strukturę hierarchiczną, podstawową hierarchiczną strukturę GUI w kontenerach i komponentach można bardzo dobrze odwzorować na podstawie XML. Ułatwia to również wyraźne oddzielenie układu od kodu. Ponadto technologie internetowe, takie jak CSS (Cascading Style Sheets), JavaScript, ale także inne języki, takie jak Groovy, mogą być tam używane poprzez osadzenie w kodzie XML i połączenie z nim.

Klasa javafx.fxml.FXMLLoaderi jej metoda klasy load(...)służą do ładowania zasobu FXML . W tym przypadku *.fxmljako parametr należy przekazać ścieżkę względną do pliku. Teraz określony plik można załadować jako zasób i javafx.scene.Parentwygenerować z niego obiekt typu. Jest to przekazywane jako parametr do konstruktora obiektu Scene.

Dokumentacja Java ilustruje różnicę między kodem a FXML na następującym prostym przykładzie:

Poniższy kod programu tworzy graficzny interfejs użytkownika, który składa się z jednego z etykietą Tytuł strony uBorderPane góry i jednym z etykietą Niektóre dane w środku : LabelLabel

BorderPane border = new BorderPane();
Label toppanetext = new Label("Page Title");
border.setTop(toppanetext);
Label centerpanetext = new Label ("Some data here");
border.setCenter(centerpanetext);

Ten sam interfejs jest opisany w języku FXML w następujący sposób:

<BorderPane>
    <top>
        <Label text="Page Title"/>
    </top>
    <center>
        <Label text="Some data here"/>
    </center>
</BorderPane>

Hierarchiczną strukturę powierzchni można zatem bardzo dobrze przedstawić w hierarchicznie ustrukturyzowanym języku znaczników FXML. Ułatwia to dodawanie komponentów i tworzenie konspektu GUI.

Konstruktor scen

JavaFX Scene Builder to narzędzie graficzne, które upraszcza tworzenie plików FXML. Dzięki temu narzędziu elementy GUI można projektować bez znajomości programowania. Użytkownik może użyć metody przeciągnij i upuść, aby wizualnie zaprojektować i wygenerować struktury XML z FXML.

Firma Oracle zaprzestała opracowywania narzędzia i udostępniła kod źródłowy programu na licencji podobnej do BSD. W rezultacie Gluon przejął obsługę techniczną i wsparcie handlowe.

FXGraph

FXGraph to prosty język DSL ( Domain Specific Language ) służący do definiowania grafu obiektów, który jest implementowany w tle w języku FXML. FXGraph pochodzi z projektu e (fx) clipse, wsparcia JavaFX w Eclipse . FXGraph jest bardziej kompaktowy niż FXML i niejasno przypomina JSON .

krytyka

Były pracownik Sun i założyciel Codename One, Shai Almog, potwierdza, że ​​JavaFX nie będzie miała świetlanej przyszłości. Dzieli on użytkowników JavaFX na trzy kategorie: firmy z dużymi inwestycjami w Swing, studentów i zagorzałych fanów. Zdaniem Almoga na tym fundamencie trudno jest zbudować żywą społeczność . Ponadto Oracle nie wysyła żadnych jasnych sygnałów co do swojego przyszłego zaangażowania w JavaFX. Ogólnie rzecz biorąc, za brak przyszłości JavaFX obwinia trzy główne przyczyny:

  • Sama Oracle nie używa JavaFX lub nie używa go w wystarczającym stopniu: nawet produkty oparte na Swing nie zmierzają w kierunku JavaFX. Ponadto program Scene Builder nie był od jakiegoś czasu dystrybuowany przez samą firmę Oracle.
  • JavaFX nigdy nie zyskał takiego samego wpływu jak Swing. Główna grupa docelowa JavaFX, czyli programiści Swing, nie przeszli na nową technologię.
  • Rynek pracy wygląda ponuro: na stronie kariery dice.com Almog znalazł tylko 28 miejsc pracy, które wymagały znajomości JavaFX, w przeciwieństwie do 198 ofert pracy dla Swing, 2333 dla Androida i 16752 dla Java EE (stan na 22 listopada 2015).

Po zaprzestaniu obsługi platformy ARM Embedded i opracowaniu narzędzia Scene Builder firmy Oracle, stowarzyszenie iJUG (Association of German Java User Groups) zażądało od Oracle wyraźnego zaangażowania się w JavaFX. W rezultacie Don Smith (Starszy Dyrektor ds. Zarządzania Produktami w Oracle) dał jasno do zrozumienia, że ​​JavaFX będzie nadal zalecaną technologią do rozwoju bogatych klientów i będzie dalej rozwijana w tym zakresie. Brak wsparcia dla platformy ARM wiąże się z ogromnym wysiłkiem wymaganym do zagwarantowania trwałego komercyjnego wsparcia ARM w obliczu szybko zmieniającej się technologii sprzętowej. Scene Builder został udostępniony na otwartej licencji BSD, a strategia polega teraz na integracji Scene Builder z narzędziami i platformami programistycznymi. Smith odnosi się w szczególności do startupu Gluon, który zajmuje się portami JavaFX i Scene Builder.

Ogólnie rzecz biorąc, Java konkuruje z wieloma innymi technologiami: po stronie serwera, na przykład z Node.js i Ruby on Rails , po stronie mobilnej z iOS oraz w obszarach mobilnych i komputerowych z HTML i JavaScript. Nie wiadomo jeszcze, czy JavaFX stanie się technologią dla interfejsów internetowych.

Niektórzy eksperci dostrzegają niszę dla JavaFX, w szczególności w obszarze potężnych klientów desktopowych z wyrafinowaną graficzną interakcją, w której może się na stałe zadomowić. Widzą mocne strony frameworka nie tylko w rozwoju hybrydowych aplikacji desktopowych. Każdy, kto tworzy klienta z bezpośrednim dostępem do zasobów lokalnych (system plików, zasoby szeregowe itp.), Jest w dobrych rękach dzięki JavaFX.

literatura

  • Anton Epple: JavaFX 8. Podstawy i zaawansowane techniki. dpunkt.verlag: Heidelberg, 2015.
  • Ralph Steyer: Wprowadzenie do JavaFX. Nowoczesne GUI dla RIA i aplikacji Java. Springer Vieweg: Wiesbaden, 2014.
  • Christian Ullenboom: Java to także wyspa. Wprowadzenie, szkolenie, praktyka. 11. wydanie, Galileo Press: Bonn, 2014, zwłaszcza s. 1009–1063.
  • Christian Ullenboom: standardowa biblioteka Java SE 8. Podręcznik dla programistów Java. Wydanie 2, 2014, Galileo Press: Bonn, 2014, zwłaszcza s. 1031-1076.

linki internetowe

Indywidualne referencje i uwagi

  1. Ullenboom: Java to także wyspa. Wydanie 11, 2014, s. 1011.
  2. Często zadawane pytania dotyczące JavaFX . Źródło 29 lutego 2016 r.
  3. ^ Przyszłość JavaFX i innych aktualizacji planów klienta Java . Źródło 17 listopada 2018 r.
  4. a b c Ullenboom: Java to także wyspa. Wydanie 11, 2014, s. 1011.
  5. JavaFX 1.0 jest na żywo ( Pamiątka po oryginale z 7 grudnia 2008 w Internet Archive ) Informacje: Link do archiwum został wstawiony automatycznie i nie został jeszcze sprawdzony. Sprawdź oryginalny i archiwalny link zgodnie z instrukcjami, a następnie usuń to powiadomienie.  @ 1@ 2Szablon: Webachiv / IABot / blogs.sun.com
  6. Wydanie JavaFX 1.3 ( Memento z 30 kwietnia 2011 w Internet Archive )
  7. ↑ Ilość javafx.com ( pamiątka z oryginałem od 29 października 2010 roku w Internet Archive ) Info: archiwum Link został wstawiony automatycznie i nie została jeszcze sprawdzona. Sprawdź oryginalny i archiwalny link zgodnie z instrukcjami, a następnie usuń to powiadomienie.  @ 1@ 2Szablon: Webachiv / IABot / javafx.com
  8. Innowacje w JavaFX 2.0 . Netzwelt , dostęp 13 października 2011
  9. a b Ullenboom: Java to także wyspa. Wydanie 11, 2014, s. 1012.
  10. Hendrik Ebbers: JavaFX8 - Co nowego? W: jaxenter (utworzony 20 marca 2014, dostęp: 12 grudnia 2016).
  11. JDK for ARM 8u33 - informacje o wydaniu . Wyrocznia . 16 lutego 2013 r. Pobrane 29 lutego 2016 r .: „ Począwszy od JDK 8u33, JavaFX Embedded jest usuwana z pakietu ARM i nie jest obsługiwana. "
  12. ^ Oracle Corporation: Aktualizacja planu obsługi klienta Java. Oracle Corporation, 11 maja 2020 r., Dostęp: 14 lutego 2021 r .
  13. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 166–167.
  14. Oracle: JavaFX Architecture In: http://docs.oracle.com (ostatnia zmiana w 2013 r., Dostęp 14 grudnia 2016 r.)
  15. Uwaga: Nie mylić z oprogramowaniem tajnych służb PRISM
  16. a b c Steyer: Wprowadzenie do JavaFX. 2014, s. 8.
  17. Gerrit Grunwald: Wizualizacja w Javie z JavaFX In: heise Developer (utworzony 28 czerwca 2013, dostęp 14 grudnia 2016).
  18. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 8–9.
  19. Uwaga: Metoda main () w zasadzie nie jest konieczna dla aplikacji JavaFX, podczas gdy jest centralnym punktem wejścia dla normalnej aplikacji Java. Jest generowany przez NetBeans tylko ze względów bezpieczeństwa, aby zagwarantować uruchomienie aplikacji w przypadku braku obsługi JavaFX na platformach docelowych. Sam Netbeans ignoruje metodę main (). Zobacz Steyer: Wprowadzenie do JavaFX. 2014, s. 29.
  20. Ullenboom: standardowa biblioteka Java SE 8. Wydanie 2 2014, s. 1032.
  21. Oracle: javafx.application - Class Application on docs.oracle.com (dostęp 11 grudnia 2016); Epple: JavaFX 8. 2015, s. 9–10.
  22. Uwaga : Powodem tego jest to, że metoda init - podobnie jak konstruktor klasy - jest nadal wywoływana przez wątek programu uruchamiającego aplikacji. Jednak elementy interfejsu użytkownika można tworzyć i modyfikować tylko w wątku aplikacji JavaFX. Zobacz Epple: JavaFX 8. 2015, s. 10.
  23. a b Steyer: Wprowadzenie do JavaFX. 2014, s. 29.
  24. Epple: JavaFX 8. 2015, s. 11.
  25. Szczegółowy opis klasy Stage, patrz Oracle: Class Stage na docs.oracle.com (dostęp 11 grudnia 2016). Zobacz także Epple: JavaFX 8. 2015, s. 11–13.
  26. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 29, 65.
  27. Epple: JavaFX 8. 2015, s. 13.
  28. Oracle: Class Scene na docs.oracle.com (dostęp 11 grudnia 2016).
  29. Ullenboom: standardowa biblioteka Java SE 8. Wydanie 2, 2014, s.1033.
  30. ^ Oracle: Class Group na docs.oracle.com (dostęp 11 grudnia 2016); Ullenboom: standardowa biblioteka Java SE 8. Wydanie 2, 2014, s. 1034-1035.
  31. Oracle: Class Control na docs.oracle.com (dostęp 11 grudnia 2016); Ullenboom: standardowa biblioteka Java SE 8. Wydanie 2, 2014, s. 1034.
  32. Ullenboom: standardowa biblioteka Java SE 8. Wydanie 2, 2014, s. 1036.
  33. Epple: JavaFX 8 2015, s. 43–44; Oracle: Using JavaFX UI Controls on docs.oracle.com (dostęp 11 grudnia 2016 r.)
  34. Jeff Friesen: Exploring JavaFX's Application class In: JavaWorld (utworzony 14 kwietnia 2016, dostęp 13 grudnia 2016).
  35. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 201.
  36. Uwaga: W przeciwieństwie do tego, oparte na konsoli lub starsze programy graficzne są często liniową lub deterministyczną sekwencją instrukcji i / lub danych wejściowych, które są przetwarzane jedna po drugiej.
  37. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 201.
  38. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 201.
  39. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 202-205.
  40. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 205–209.
  41. a b Ullenboom: 8. biblioteka standardowa Java SE. Wydanie 2, 2014, s. 1037.
  42. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 193–195; Ullenboom: standardowa biblioteka Java SE 8. Wydanie drugie 2014, s. 379–388; Epple: JavaFX 8. 2015, s. 22–23.
  43. a b Steyer: Wprowadzenie do JavaFX. 2014, s. 225.
  44. a b c d Oracle: JavaFX: Properties and Binding Tutorial w : docs.oracle.com (dostęp 13 grudnia 2016).
  45. Ullenboom: standardowa biblioteka Java SE 8. Wydanie drugie 2014, s. 806–807.
  46. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 228-231.
  47. Uwaga: jest to porównywalne z XAML (Extensible Application Markup Language) z platformy .NET firmy Microsoft.
  48. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 9–10; Ullenboom: standardowa biblioteka Java SE 8. Wydanie drugie 2014, s. 1062-1063; Ullenboom: Java to także wyspa. Wydanie 11, 2014, ss. 1013-1014.
  49. ^ Steyer: Wprowadzenie do JavaFX. 2014, s. 65–66.
  50. Oracle: Mastering FXML In: http://docs.oracle.com (aktualizacja 2014, dostęp 14 grudnia 2016).
  51. Narzędzie jest dostępne pod następującym adresem URL dla systemów Windows, OS X i Linux: http://gluonhq.com/labs/scene-builder/
  52. Simon Vienot: lista mailingowa openjfx-dev. „Scene Builder jest teraz open source!” . 3 grudnia 2013 r. Źródło 29 marca. 2016.
  53. ^ Gluon obsługuje Scene Builder . 4 marca 2015. Obejrzano 29 marca. 2016.
  54. Tom Schindl: FXGraph In: https://www.eclipse.org/ (ostatnia zmiana 9 grudnia 2013; dostęp 13 grudnia 2016).
  55. Ullenboom: Java to także wyspa. Wydanie 11, 2014, s. 1014.
  56. a b Shai Almog: Czy Oracle Spring powinno czyścić JavaFX? W: DZone (utworzony 22 listopada 2015, dostęp 14 grudnia 2016); zobacz także Michael Thomas: spoczywaj w pokoju, JavaFX? W: JAXenter (utworzony 24 listopada 2015, dostęp: 14 grudnia 2016).
  57. iJUG: iJUG prosi Oracle o wyraźne zobowiązanie do JavaFX ( pamiątka po oryginale z 23 września 2016 r. W Internet Archive ) Informacje: Link do archiwum został wstawiony automatycznie i nie został jeszcze sprawdzony. Sprawdź oryginalny i archiwalny link zgodnie z instrukcjami, a następnie usuń to powiadomienie. W: iJUG (utworzony 27 stycznia 2016; aktualizacja 2 lutego 2016; dostęp 14 grudnia 2016) @ 1@ 2Szablon: Webachiv / IABot / www.ijug.eu
  58. a b Hartmut Schlosser: Trudno, ale sprawiedliwie: Jaką przyszłość ma JavaFX? W: JAXenter (utworzony 22 marca 2016 r., Dostęp: 14 grudnia 2016 r.).
  59. JAXenter, Wywiad z Alexandrem Casallem: „Tylko Chuck Norris może robić hybrydowe aplikacje desktopowe” W: JAXenter (utworzony 21 kwietnia 2015, dostęp 14 grudnia 2016).