JavaFX
| JavaFX
| |
|---|---|
|
| |
| Grundlæggende data
| |
| Udvikler | Oracle |
| Nuværende version |
14 ( 10. marts 2020 ) |
| operativ system | Windows , macOS , Linux |
| programmeringssprog | Java |
| kategori | Ramme |
| Licens | GPL med GPL -linkende undtagelse |
| OpenJFX på java.net og openjfx.io | |
JavaFX er en ramme til oprettelse af tværplatforme Java - applikationer . Det er en Java -specifikation fra Oracle og har til formål at lette professionel oprettelse og distribution af interaktivt , multimedieindhold og grafiske brugergrænseflader (GUI'er) på tværs af alle Java -platforme .
Indtil 2014 var AWT og Swing standardløsninger til grafiske applikationer under Java. Disse blev dog ved med at gå i år. Der var huller inden for medier og animation , som nu er efterspurgt med moderne grafiske grænseflader. I stedet for at investere i den videre udvikling af AWT / Swing besluttede Oracle at ombygge GUI -niveauet fuldstændigt med JavaFX.
JavaFX er særligt til en scenediagram (engl. Scenegraf ), der administrerer de enkelte komponenter i en GUI. Med FXML muliggør det også en deklarativ beskrivelse af grafiske grænseflader på XML -basis. Den Scene Builder er et grafisk værktøj, der forenkler oprettelsen af FXML filer. Derudover kan webteknologier som CSS bruges til designet ved at integrere dem i FXML -koden.
Da JavaFX tilbyder alle API'er til moderne grænseflader og ikke er afhængig af AWT / Swing, danner det en komplet mediestak. JavaFX har direkte adgang til alle 2D / 3D -færdigheder i moderne grafikprocessorer . Så alt kan programmeres med JavaFX, der tidligere helst var implementeret med Flash .
Den JavaFX runtime miljø var en del af hver x86 Java SE installation fra version Java SE Runtime 7 Opdatering 6 til 10.
Udviklingshistorie
Historien om JavaFX er ikke særlig ligetil. Oprindeligt ønskede Sun / Oracle at placere JavaFX som en Flash -erstatning på Internettet, men kombinationen af HTML5 og CSS3 og JavaScript var for attraktiv. I dag er det hovedsageligt et GUI -værktøjskasse til klassiske klientprogrammer .
Version 1
JavaFX blev annonceret i maj 2007 og præsenteret på JavaOne -udviklerkonferencen i maj året efter . Den 4. december 2008 udgav Sun officielt JavaFX 1.0 som et udviklerkit til Windows og macOS . JavaFX 1.0 -udgivelsen dukkede op sammen med programmeringssproget JavaFX Script . Dette sprog gjorde det let at bygge hierarkiske objektgrafer og tilbød en god syntaks for objektbinding, som tilstande kunne synkroniseres med.
Version 1.2 blev udgivet i juni 2009. Det indeholdt blandt andet brugerdefinerede brugergrænsefladekontroller, yderligere layoutklasser (Tile, Stack, Flow, ClipView, Panel), understøttelse af RSS / Atom -feeds. Det er ikke bagudkompatibelt. Linux og Solaris er kun blevet understøttet siden denne version . Version 1.3 (kodenavn SoMa) blev udgivet den 22. april 2010. Den mest oplagte innovation er en til tider enorm stigning i ydelsen. Også nyt er JavaFX TV, en officiel CSS API til design af JavaFX -kontroller, nogle nye, ønskede kontroller og understøttelse af 3D. Version 1.3.1 blev frigivet den 21. august 2010 og forbedrede statuslinjen ved opstart og fejlfinding i Netbeans 6.9.1.
Version 2
JavaFX 2.0 dukkede op som annonceret i tredje kvartal af 2011. Denne version bruger ikke JavaFX Script, "fordi Oracle ikke ønskede at bygge et andet programmeringssprog, men et rent Java API, som udviklere derefter kunne adressere fra forskellige eksisterende scriptsprog." Det er derfor, de eksisterende JavaFX Script API'er portes til Java. Hardwaregengivelse er også blevet optimeret i JavaFX 2.0, så spil og komplekse 3D -repræsentationer nu skal være mulige. JavaFX 2.0 gengiver HTML- og JavaScript -indhold ved hjælp af WebKit -biblioteket. I løbet af offentliggørelsen af den nye version annoncerede Oracle, at det ville fortsætte med at udvikle JavaFX som et open source -projekt inden for rammerne af OpenJDK .
JavaFX udviklede sig mere og mere til alternativet Swing / AWT. JavaFX 2.2 blev frigivet i august 2012. Dette blev integreret i JRE / JDK 7 Update 6. Trinet var usædvanligt, fordi der aldrig var foretaget så store tilføjelser som en opdatering i JRE / JDK.
Udviklingen mod Open Source resulterede i OpenJFX, som sammen med OpenJDK gør det muligt at bygge et helt gratis Java -system med en GUI -stak under GPL .
Version 8
Med overgangen til Java 8 -udgivelsen fik JavaFX frigivelsen til at springe fra 2 til nu 8. JavaFX 8 bringer nogle innovationer med sig. For eksempel tilbyder den lambdas som en ny sprogkonstruktion. En af de store innovationer er også JavaFX-UI-Toolkit, som leveres med Java 8 som det anbefalede UI-Toolkit. Med FXML tilbyder værktøjssættet bl.a. et XML -baseret sprog til oprettelse af brugergrænseflader.
Med version 8u33 blev Oracles ARM -understøttelse af JavaFX afbrudt. Derfor er JavaFX ikke længere inkluderet i de officielle Java -distributioner til ARM.
Køreplan
"Mobile first" og "Web first" motiverer Oracle til at stoppe supporten til JavaFX, sandsynligvis i marts 2025. Yderligere udvikling vil derefter finde sted som et separat open source -modul, som Oracle allerede arbejder med interesserede parter til.
arkitektur
Arkitekturen i JavaFX er helt ny og er især ikke baseret på Swing eller AWT. Dette betyder dog også, at JavaFX og AWT / Swing ikke let kan blandes (selvom der er løsninger). JavaFX tilbyder en komplet API til moderne grænseflader. De vigtigste pakker af denne API er:
| Pakke | beskrivelse |
|---|---|
| javafx.animation | Klasser til animation baseret på overgange |
| javafx.applikation | Klasserne for den grundlæggende livscyklus for en applikation |
| javafx.samlinger | Essentielle JavaFX -samlinger inklusive hjælpeprogrammer |
| javafx.event | Den grundlæggende ramme for JavaFX -begivenheder og deres håndtering |
| javafx.fxml | Klasser til indlæsning af et hierarki af objekter fra en markup -struktur, f.eks. FXML |
| javafx.geometry | Klasser til geometriske operationer på todimensionale objekter |
| javafx.scene | Grundklasserne for JavaFX Scene Graph API og forældrepakken for de enkelte komponenter og elementer. Den indeholder delpakker som lærred, diagram, kontrol, effekt, billede, input, layout, medier, maling, form, tekst, transform, web osv. |
| javafx.stage | Containerklasser på topniveau til JavaFX-indhold |
| javafx.util | Forskellige forsyningsselskaber og hjælpeklasser |
Følgende grafik viser arkitekturen i JavaFX, da den officielt er repræsenteret af Oracle:
Som med alle Java -applikationer har JavaFX også Java Virtual Machine (JVM) på det laveste niveau , som er ansvarlig for udførelsen af Java -bytecode . Normalt udføres hvert startet Java -program i sin egen virtuelle maskine (VM).
De tilsvarende udviklingsværktøjer til Java eller JavaFX findes i Java SE Development Kit (eller bare Java Development Kit, JDK for kort). Baseret på dette er der mange udvidelser, hvoraf nogle har været brugt med Java i meget lang tid, f.eks. Java 2D til at tegne todimensionale former.
Prisme er den nye gengivelsesmotor, der gør brug af grafikhardwaren (hvis den understøttes). Blandt andet gør den også egenskaber ved Java 2D og forskellige grafiske effekter såsom skygger, refleksioner, transformationer eller animationer til rådighed på et højt niveau. Det gengives med OpenGL under Linux og macOS , mens Direct3D bruges under Windows . Hvis grafikhardwaren ikke er understøttet, et software fallback er til Java 2D brugt.
The Glass Windowing Toolkit giver lavt niveau operativsystem rutiner såsom vindue management, timere eller ledelse begivenhed. Det fungerer som et platformafhængigt lag, der forbinder JavaFX-platformen med operativsystemet.
Det medier motor er baseret på GStreamer og tilbyder omfattende support til lyd og video. Den Web Engine giver webindhold skal indlejres i JavaFX applikationer. Dette inkluderer HTML-gengivelse baseret på WebKit- motoren, hardware-afhængig gengivelse via prisme og mulighed for DOM-adgang og manipulation af DOM.
Den Quantum Toolkit links Prism, Glas Windowing Toolkit, Medier Motor og Web Motor og gør dem ensartet tilgængelig for JavaFX API'er. JavaFX API og Quantum Toolkit indkapsler detaljerne i de lavere niveauer og skjuler dem for brugeren. I princippet behøver en JavaFX -udvikler ikke at vide, hvordan de lavere niveauer fungerer.
Opbygning af et JavaFX -program
JavaFX livscyklus
JavaFX applikationer udvide basen klassen Application , livscyklusovervejelser metoder såsom init(), start()eller stop() arvet . Disse metoder kan (eller skal) tilsidesættes i JavaFX -applikationen . JavaFX -launcheren sørger for, at disse kaldes i overensstemmelse hermed. Så JavaFX programmer kræver ingen mainmetode: egen statiske main(String[])metode dirigerer den statiske launch(String[])metode Application- klasse på og giver hende alle opkald parametre . Da klassemetoden launch(...)ved, hvilken klasse den blev kaldt ind, opretter den en forekomst af denne klasse og kalder derefter livscyklusmetoderne.
Livscyklussen for et JavaFX -program er som følger:
- Når programmet starter, den JavaFX runtime først konstruerer en instans af den
Applicationklasse. - Nu
init()udføres metoden for den oprettede forekomst. Denne metode er implementeret som tom som standard og behøver ikke nødvendigvis at blive overskrevet. For eksempel kan opkaldsparametrene læses op her. Der må dog endnu ikke oprettes nogen UI -elementer her. - Dernæst
start(javafx.stage.Stage)kaldes metoden , som skal tilsidesættes af ethvert JavaFX -program. JavaFX overfører et trin til metoden, som stort set svarer til opgaven med en hovedcontainer og bedst kan sammenlignes med startvinduet. - JavaFX -runtime venter nu, indtil applikationen afsluttes. Dette kan gøres som følger:
- ved at kalde metoden
Platform.exit() - ved at lukke det sidste vindue og sætte attributten
implicitExittil platform tiltrue.
- ved at kalde metoden
- Nu kalder runtime
stop()metoden, før Java -processen stoppes. Igen behøver denne metode ikke nødvendigvis at blive overskrevet.
Scenen
Den start(...)metode er en Stagepass. Den parameter af start(...)er derfor af den type javafx.stage.Stage. Denne klasse er JavaFX -beholderen på øverste niveau, der altid konstrueres af platformen - som en parameter for start(...)metoden. Dette kan bedst sammenlignes med startvinduet . Yderligere faseobjekter kan også oprettes i et program .
Scenen kan bruges til at lave et antal scener eller (engl. Scener ) til at præsentere. Navngivningen af basisklasserne Stageog Sceneligner teatret: Scenen er scenen, der er angivet på scenen. Det danner rammen om det egentlige indhold.
Som med et vindue er der mange indstillingsmuligheder for et sceneobjekt ved hjælp af f.eks. Passende metoder
setWidth(double value)og angivsetHeight(double value)scenens højde og bredde, og-
setTitle(java.lang.String value)indstiller titlen på vinduet.
Det StageStylebestemmer udseendet af vinduet. Standardværdien er DECORATEDden, der viser et vindue med en kant og kontrolelementer afhængigt af operativsystemet og en hvid baggrund. De fleste egenskaber ved et Stage-objekt er dog skrivebeskyttet, fordi de ændres af den underliggende platform.
Scenen
En eller flere scener af typen præsenteres normalt på scenen javafx.scene.Scene. Denne klasse er containeren for alt indhold i en scenediagram, der administrerer de enkelte komponenter i en GUI .
Fra grafteoriens synspunkt for scenegrafen er et rodfæstet træ bestående af noder (tysk knude findes). Som indre noder er der forældreknudepunkter, der kan indeholde yderligere noder (noder) som børn. Et ark (Engl. Bladknude ) har imidlertid ingen yderligere børn. Bladene repræsenterer nu de synlige elementer i GUI'en (f.eks. Knapper, tekstvinduer og skydere), overordnet knytter de usynlige strukturelementer (f.eks.BorderPane, HBox og VBox). En applikation skal have rodnoden (engl. Root node ) for at scenegrafen skal angive. Dette er noget som det oprindelse, hvorfra hele scenen udvikler sig. Der er et argument for konstruktøren af et Sceneobjekt til dette. De Sceneskal være objekter skabes og ændres i JavaFX ansøgning tråd .
Dette Sceneer også forbindelsen mellem vinduet fra operativsystemet og scenediagrammet. Hvis vinduet for eksempel er forstørret, forsøger forsøget Sceneat videregive denne ændring til rodnoden: isResizableFor at gøre dette kalder det metoden på rodnoden for at finde ud af, om noden ønsker at reagere på størrelsesændringer. Hvis noden truevender tilbage, ændrer Sceneden den til den nye størrelse, den falseefterlader den ved.
Med kommandoen stage.setScene(scene)kommer Scenescenediagrammet på scenen via klassen . Alle grafiske objekter i en JavaFX -applikation er til stede på ethvert tidspunkt, dvs. H. de eksisterer ikke bare på tegningstidspunktet.
Noder
Alle objekter i scenediagrammet er af typen Node. Disse danner derfor indholdet af scenediagrammet. Hver knude og hvert element i scenediagrammet er til gengæld en undertype af den abstrakte klasse Node.
En underklasse af Nodeer Parent. Forældreknuderne er grundklassen for alle noder, der indeholder yderligere noder som børn, dvs. er containere. Der er underklasser af forældre:
- Klassen
Groupkombinerer flere elementer i en knude. Det gør det f.eks. Muligt at anvende transformationer og effekter på gruppen og delegere derfra til alle elementer (børn) i gruppen. DenGroupknude kører enObservableListfor børn. MetodengetChildren()kan bruges til at hente listen over børn, som derefter kan tilføjes ved hjælp afgetChildren().add(element)yderligere elementer. ManGrouper ligeglad med børnenes positioner og kan ikke justeres via CSS. - Klassen
Regiondanner basisklassen for alle kontroller og layout og udvider basisklassen med mange muligheder for styling via CSS. DerfraRegioner en lavere klassePane, som er børnene gennem offentlige metoder til ydersiden. Den afledte klasseBorderPaneer for eksempel placeret over børnene ( øverst ), venstre ( venstre ), højre ( højre ), nedenunder ( nederst ) og midten (i midten ). - Klassen
Controlforlænger klassenRegion. Det er grundklassen for komponenter, der tillader brugerinput i en eller anden form. Dette omfatter f.eks. Knapper eller etiketter. Hver kontrolkomponent kan igen redigeres optisk ved hjælp af CSS.
JavaFX kommer - ligesom Swing - med et sæt standardkomponenter i pakken javafx.scene.controlog har Controlsom en basisklasse. Følgende oversigt viser de vigtigste kontroller, der er tilgængelige i JavaFX:
| Styring | brug |
|---|---|
| Etiket | Den Etiketten er en af de enkleste kontroller. Den består af en tekst og enhver anden knude til erklæring. Et billede bruges ofte til dette. |
| Hyperlink | Svarer til et HTML - hyperlink og vises som standard som blå understreget tekst. |
| Knap | Der kan trykkes på en knap . Udvælgelsesstatus bevares. |
| Radio knap | En valgknap til individuelt valg fra en gruppe radioknapper . Valgstatus bevares, indtil der vælges en anden knap i samme gruppe. |
| ToggleKnap | En valgknap, der findes i to tilstande: valgt og ikke valgt. Opfører sig som en CheckBox eller en RadioButton. |
| CheckBox | Et afkrydsningsfelt er et markeringsfelt med tre mulige tilstande: udefineret, markeret og ikke markeret. Valgstatus bevares, indtil den ændres. |
| ChoiceBox | En udvælgelsesliste til valg af et enkelt element fra en fortrinsvis kort liste. |
| Tekstfelt | Enkelt linje frit tekstfelt med markørstyring og valg. |
| TextArea | Fritekstfelt med flere linjer med markørstyring og valg. |
| ListView | Standardkomponent til visning af lister over objekter. |
| TableView | En tabelkomponent, der består af en række kolonner (TableColumns). Individuelle celler er repræsenteret som TableCell. |
| TitledPane | En delvis dialog, der kan åbnes og lukkes. |
| ScrollPane | Tjener til at forskyde og præsentere et afsnit med vandret og lodret rullepanel ( rullepanel ). |
I første omgang er kontroller bare noder, der kan føjes til SceneGraph og derefter vises. Selvfølgelig giver de tilsvarende klasser til UI -kontroller forskellige specifikke egenskaber og metoder til at understøtte typiske interaktioner med brugere.
Programeksempler
Hej JavaFX World!
Følgende programeksempel viser et typisk Hello World -program i 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);
}
}
Klassen stammer Mainfra klassen Application. Den egen main(...)metode videresendes til launch(...)metoden i applikationsklassen. I den oprettede instans af Applicationklassen init()udføres metoden først , som forbliver tom her som standard .
Dernæst start(...)udføres metoden, som, som her, skal tilsidesættes af alle JavaFX -applikationer. JavaFX passerer den metode, Stageder kan sammenlignes med startvinduet. start()Følgende trin udføres nu inden for metoden:
- Der
labeloprettes en enkel etiketkontrol . Teksten, der skal vises "Hello JavaFX World!" Sendes direkte til konstruktøren her. - Nu oprettes et
StackPanenavnroot. Dette placerer alle underordnede elementer oven på hinanden i den rækkefølge, de tilføjes. Som standard er komponenterne centreret i StackPane. Detroot.getChildren().add(label)tidligere oprettedeLabel labeltilføjes nu via . - Nu er der
Scene sceneoprettet en, der derefter kanStageindlæses på . Ansøgningen skal angive en rodknude til scenediagrammet. I dette eksempel er detterootobjektets typeStackPane. Desuden får konstruktøren en bestemt skærmstørrelse ( ). - I det næste trin er
primaryStage.setTitle("Hello JavaFX World!")titlen på programvinduet også indstillet til "Hej JavaFX World!". Vigtigst er dog tildelingen af scenen,sceneder refererer til det faktiske indhold. Denshow()metode forsøger nu at få vist vinduet ved at indstille synlighed tiltrue.
Livets cyklus
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);
}
}
Programmet leverer nogenlunde følgende output:
- Main () -metoden, kaldet i trådtråden [main, 5, main]
- Init () -metoden, kaldet i trådtråden [JavaFX-Launcher, 5, main]
- Start () -metoden, kaldet i trådtråden [JavaFX Application Thread, 5, main]
- Stop () -metoden, kaldet i trådtråden [JavaFX Application Thread, 5, main]
Den main(...)fremgangsmåde til CycleOfLifeopkald Application.launch(...)og en forekomst af Applicationunderklasse skabes i JavaFX ansøgning tråd . Den init()metode kaldes i JavaFX Launcher tråd , som er den tråd, der starter programmet. At udføre start()og stop()metoder, JavaFX skaber en tråd kaldet JavaFX anvendelse Tråd . Oprettelse af Stageog Sceneobjekter og ændringer af scenediagrammet skal finde sted inden for denne JavaFX -applikationstråd .
Eventhåndtering
Eventhåndteringen af JavaFX er den deraf følgende videreudvikling af begivenhedshåndteringen under AWT og Swing eller Java selv, men også på nettet. Moderne grafiske programmer er meget begivenhedsorienterede. Du har derfor brug for mekanismer, der reagerer på forekomsten af begivenheder.
Ralph Steyer forklarer den grundlæggende idé om hændelseshåndtering som følger:
- Et objekt kan affyre et hændelsesobjekt, og et andet objekt registrerer sig selv for en reaktion på det (en såkaldt hændelseslytter), f.eks. I tilfælde af en gnist, hvor en sender sender en besked med sin radio på en bestemt frekvens og en modtager sender sin radio indstillet til den frekvens, modtager beskeden. På nøjagtig samme måde kan modtageren reagere på en besked om en begivenhed eller ignorere meddelelsen. Den specifikke hændelseshåndtering afgøres derfor i lytterobjektet.
JavaFX -begivenheder
Pakken javafx.eventindeholder de relevante klasser og grænseflader til hændelseshåndtering i JavaFX. Dybest set en konkret hændelse en instans af klassen javafx.event.Eventeller en af dens underklasser såsom DragEvent, KeyEvent, MouseEventeller ScrollEvent.
Når en hændelse opstår, bruges en intern mekanisme til at bestemme, hvilken knude der er målet for et hændelsesobjekt. For musebegivenheder er målet f.eks. Knuden på placeringen af musemarkøren. Fra det valgte hændelsesmål er der en hændelsesforsendelseskæde, der går op til roden af scenediagrammet.
Der gøres altid et forsøg på at håndtere begivenheden i det inderste element, hvor den fandt sted. Dette kræver en passende event -handler (eller en anden håndteringsstruktur). Herefter videresendes elementet i hændelsesobjektet til det næsthøjeste objekt i træet osv. Man taler i denne sammenhæng med hændelsesbobler, da hændelsesobjektet som en boble (Engl. Bubble ) til roden af scenediagrammet stiger. Hvis dette ikke kan behandles til roden, vil det blive ødelagt. Dette er ganske reglen, da mange hændelser som f.eks. At flytte musemarkøren et par millimeter ikke tvinger en specifik reaktion fra applikationen.
Begivenhedsbehandler
Hvis en node i ruten for hændelsesobjektet har registreret en hændelseshandler, forbruges hændelsen. Programmørens opgave er derfor at fange begivenheden i overensstemmelse hermed og at implementere reaktionen på den. Eventbehandlere implementerer stort set EventHandlergrænsefladen, hvilket handle()tvinger en metode, der er beskrevet der, til at blive overskrevet . Det er her, den faktiske reaktion på den begivenhed, der er sket, hører hjemme. Denne metode indeholder derefter et hændelsesobjekt af den relevante type som parameter.
De følgende to metoder tilbyder en generel måde at tilføje eller afregistrere en hændelseshandler til et nodeobjekt:
-
addEventHandler(EventType<T>, EventHandler<? super T>)for at tilføje en handler -
removeEventHandler(EventType<T>, EventHandler<? super T>)for at logge af en handler.
Den første parameter angiver den specifikke hændelse, som du vil reagere på, og den anden parameter angiver selve hændelseshandleren.
Ofte oprettes og registreres hændelsesbehandleren som en anonym klasse , hvor handle()metoden implementeres direkte for at levere de ønskede handlinger. For det første Button btnkunne det se sådan ud:
btn.addEventHandler(ActionEvent.ACTION, new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// do something here
}
});
Som et lambda -udtryk kan det se sådan ud:
btn.addEventHandler(ActionEvent.ACTION, (event) -> {
// do something here
});
Derudover tilbyder komponentklasserne også deres egne setter -metoder til specifikke begivenheder, der har følgende format:
setOnEventType(EventHandler handler)
Dette angiver EventTypebegivenhedstypen. For eksempel er der Buttonfølgende metode setOnAction(EventHandler<ActionEvent>):
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// do something here
}
});
Dynamiske datastrukturer med ændringsmeddelelser
I JavaFX individuelle værdier ikke kun observierbar men også dynamiske datastrukturer , der er i pakken javafx.collectionser: ObservableList, ObservableMapog ObservableSeter afledt af hver Observable grænseflade , og tilføje hver fremgangsmåde tilføjer til passende ChangeListenerregister. Så de nye datastrukturer udvide java.utildatastrukturer List, Setog Mapog kan rapportere ændringer.
For ObservableListeksempel er der en grænseflade til en, ListChangeListenerder reagerer på ændringer i den observerede liste. Klassen ListChangeListener.Changerepræsenterer en ændring, der foretages i en sådan liste. Med
observableList.addListener(new ListChangeListener(){/* do something here */});
lytteren registreres derefter for ændringer af listen.
Egenskaber og databinding
Egenskaber og databinding er to kraftfulde sprogmekanismer i JavaFX, der kan bruges til at skabe relationer mellem variabler. Normalt bruges de til (gensidigt) at opdatere værdier. For eksempel betjener brugeren en skyder, der styrer bredden af et rektangel, og afhængigt af værdisættet skal widthværdien af datamodellen opdateres og arealet af rektanglet genberegnes. For at sammenligne dataene med hinanden er der derfor begrebet egenskaber og databinding.
I JavaFX er egenskaber de grundlæggende byggesten til behandling og kommunikation af værdiændringer. De danner grundlaget for bekvem databinding. En ejendom er en datacontainer, der også muliggør ændringsmeddelelser. Andre klasser, der er interesseret i ændringer, kan registrere sig som lyttere. En binding omtales også som afhængighed eller afhængighed .
Bindings -API'erne er opdelt i to kategorier i JavaFX:
- API'et på højt niveau: Giver en nem måde at oprette bindinger på i de fleste situationer. Især er kodeudfyldelse givet til dette i IDE'er såsom NetBeans.
- Lav-niveau API: Denne API er meget fleksibel, slank og hurtig og tilbyder udvidede muligheder, hvis API på højt niveau ikke er nok.
Pakkens javafx.beans.propertyforskellige ejendom klasser er definerede, såsom til indkapsling af int, long, float, double, booleanog String. Ejendommene implementerer grænsefladen Observableeller til meddelelse om ændringer ObservableValue<T>. For eksempel bruges i stedet for den primitive datatype dobbelt en ny type, DoublePropertyder double"ombryder" den primitive type . Ud over getter- og settermetoderne har JavaFX -egenskaberne også en ekstra metode, der ender med en egenskab og returnerer egenskabsobjektet.
Følgende eksempel kommer fra Java -dokumentationen fra Oracle og definerer en klasse kaldet Bill(tysk faktura ), der implementerer en enkelt egenskab kaldet amountDue(tysk forfaldsbeløb ):
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;
}
}
Den amountDueobjekt er en instans af klassen javafx.beans.property.DoubleProperty. For at indkapsle det privatemarkeres det som. Ifølge navngivningskonventionen for adgang til ejendomme er der følgende metoder:
- Den
getAmountDue()metode er standard getter, deramountDuereturnerer den aktuelle værdi af ejendommen. Returværdien af denne metode erdouble(og ikke nogetDoubleProperty). Getter -metoden skalfinalerklæres som. - Den
setAmountDue(double)metode er ogsåfinalangivet med og muliggør værdien af egenskaben, der skal indstilles eksternt. Dit parameter er ogsådouble. - Den
amountDueProperty()metode fastsættes getter af ejendommen og returnerer selve ejendommen. Det er en ny konvention, der består af ejendommens navn (her beløbDue ) og ordet ejendom .
Ejendomme er af særlig interesse, hvis man observerer deres ændringer. I Java-hændelsesmodellen er der såkaldte hændelsesudløsere ( hændelseskilder ), såsom knapper eller skyder. Disse hændelser kan stamme fra brugere af den grafiske brugergrænseflade, men kan også spores tilbage til deres egne udløsere. Udover begivenhedstriggerne er der en række interesserede parter, såkaldte lyttere, der ønsker at blive informeret, når en bestemt begivenhed opstår. I dette tilfælde er der en ChangeListener( javafx.beans.value.ChangeListener) addListener()for ejendommene, som kan føjes til ejendommen via den metode , der returneres med den tilsvarende getter -metode.
For at illustrere en ChangeListener oprettes Mainen forekomst af electricalBillklassen Bill(se ovenfor) i Java -dokumentationen i klassen :
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);
}
}
Outputtet vises i konsollen Elregningen er ændret! . Lytteren bemærkede, electricBill.setAmountDue(100.00)at værdien af egenskaben amountDue blev ændret, og den tilhørende meddelelse blev changed(...)udsendt via metoden.
API'erne på højt niveau er den nemmeste og hurtigste måde at bruge bindinger på. De består af to dele: Fluent API og Binding -klassen. Fluent API giver mange metoder til afhængige objekter, mens klassen Binding tilbyder statiske fabriksmetoder.
I det følgende eksempel er to heltal bundet på en sådan måde, at deres værdier altid automatisk føjes til summen 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());
}
}
Der er tre variabler i alt, nemlig de to afhængige variabler num1og num2og bindingen sum. De afhængige variabler er begge af typen, IntegerPropertyog selve bindingen er af typen NumberBinding. sumSå værdien af ændringer ændres automatisk, hvis num1eller num2ændres.
Deklarative GUI -beskrivelser
Grundlæggende kan grafiske grænseflader konfigureres ved hjælp af et program -API, eller de kan angives i en deklarativ beskrivelse. I tilfælde af deklarative grænseflader beskrives komponenternes placering i en ekstern ressourcefil.
FXML
Ud over muligheden for at opbygge scenediagrammet ved hjælp af programkoden, tilbyder JavaFX også muligheden for at konfigurere objekterne ved hjælp af XML . Med FXML giver JavaFX et let at lære, deklarativt sprog, der tillader en alternativ definition af grafiske grænseflader udelukkende via XML. Da XML er struktureret hierarkisk, kan den grundlæggende hierarkiske struktur for et GUI i containere og komponenter kortlægges meget godt på XML -basis. Dette gør det også lettere at adskille layoutet rent fra koden. Derudover kan webteknologier som CSS (Cascading Style Sheets), JavaScript men også andre sprog som Groovy bruges der ved at være integreret i XML -koden og linket til den.
Klassen javafx.fxml.FXMLLoaderog dens klassemetode load(...)bruges til at indlæse en FXML -ressource . Her skal den relative sti til *.fxmlfilen sendes som parameter. Nu kan den angivne fil indlæses som en ressource, og et objekt af typen javafx.scene.Parentkan genereres fra den. Dette sendes som en parameter til konstruktøren af Scene -objektet.
Java -dokumentationen illustrerer forskellen mellem kode og FXML ved hjælp af følgende enkle eksempel:
Følgende programkode bygger en grafisk brugergrænseflade, som består af en med den ene mærket SidetitelBorderPane øverst og en med etiketten Nogle data her i midten :
LabelLabel
BorderPane border = new BorderPane();
Label toppanetext = new Label("Page Title");
border.setTop(toppanetext);
Label centerpanetext = new Label ("Some data here");
border.setCenter(centerpanetext);
Den samme grænseflade er beskrevet i FXML som følger:
<BorderPane>
<top>
<Label text="Page Title"/>
</top>
<center>
<Label text="Some data here"/>
</center>
</BorderPane>
Den hierarkiske struktur af overfladen kan derfor repræsenteres meget godt i det hierarkisk strukturerede markeringssprog FXML. Dette gør det lettere at tilføje komponenter og bygge omridset af en GUI.
Scenebyggeren
JavaFX Scene Builder er et grafisk værktøj, der forenkler oprettelsen af FXML -filer. Med værktøjet kan GUI -elementer designes uden programmeringskendskab. Brugeren kan bruge træk og slip til visuelt at designe og generere XML -strukturer fra FXML.
Oracle har stoppet udviklingen af værktøjet og frigivet programmets kildekode under en BSD-lignende licens. Som følge heraf overtog Gluon vedligeholdelse og kommerciel support.
FXGraph
FXGraph er en simpel DSL ( Domain Specific Language ) til at definere objektgrafen, som implementeres i FXML i baggrunden. FXGraph kommer fra e (fx) clipse -projektet, en JavaFX -understøttelse i Eclipse . FXGraph er mere kompakt end FXML og minder vagt om JSON .
kritik
Tidligere Sun -medarbejder og Codename One -grundlægger Shai Almog vidner om, at JavaFX ikke vil have en lys fremtid. Han opdeler JavaFX-brugere i tre kategorier: virksomheder med store investeringer i Swing, studerende og vanvittige fans. Ifølge Almog er det svært at bygge et livligt fællesskab på dette fundament . Derudover sender Oracle ikke klare signaler om sit fremtidige engagement i JavaFX. Samlet set bebrejder han tre hovedårsager til manglen på fremtidig JavaFX:
- Oracle selv bruger ikke JavaFX eller bruger det ikke i tilstrækkeligt omfang: Selv Swing-baserede produkter bevæger sig ikke i retning af JavaFX. Derudover har Scene Builder ikke været distribueret af Oracle selv i nogen tid.
- JavaFX har aldrig fået den samme effekt som Swing. Hovedmålgruppen for JavaFX, nemlig Swing -udviklerne, har ikke skiftet til den nye teknologi.
- Arbejdsmarkedet ser dyster ud: På karrieresitet dice.com fandt Almog kun 28 job, der krævede JavaFX -viden, i modsætning til 198 stillinger til Swing, 2333 til Android og 16752 til Java EE (pr. 22. november 2015).
Efter at understøttelse af ARM Embedded Platform og udviklingen af Scene Builder af Oracle blev afbrudt, forlangte iJUG -foreningen (sammenslutning af tyske Java -brugergrupper) en eksplicit forpligtelse til JavaFX fra Oracle. Som et resultat gjorde Don Smith (Oracle Senior Director Product Management) det klart, at JavaFX fortsat ville være den anbefalede teknologi til udvikling af rige klienter, og at den ville blive videreudviklet i denne henseende. Manglen på støtte til ARM -platformen har at gøre med den store indsats, der kræves for at garantere bæredygtig kommerciel ARM -support i betragtning af den hurtigt skiftende hardwareteknologi. Scene Builder er blevet gjort tilgængelig under den åbne BSD -licens, og strategien er nu at integrere Scene Builder i værktøjer og udviklingsplatforme. Smith henviser især til opstarten Gluon, der omhandler JavaFX -porte og Scene Builder.
Samlet set konkurrerer Java med mange andre teknologier: på serversiden, for eksempel med Node.js og Ruby on Rails , på mobilsiden med iOS og i mobil- og desktop -områderne med HTML og JavaScript. Tiden har endnu ikke vist, om JavaFX vil etablere sig som en teknologi til webgrænseflader.
Nogle eksperter ser en niche for JavaFX især inden for området kraftfulde desktop -klienter med sofistikeret grafisk interaktion, hvor den kan etablere sig permanent. De ser rammernes styrker ikke mindst i udviklingen af hybrid desktop -applikationer. Enhver, der udvikler en klient med direkte adgang til lokale ressourcer (filsystem, serielle ressourcer osv.) Er i gode hænder med JavaFX.
litteratur
- Anton Epple: JavaFX 8. Grundlæggende og avancerede teknikker. dpunkt.verlag: Heidelberg, 2015.
- Ralph Steyer: Introduktion til JavaFX. Moderne GUI'er til RIA'er og Java -applikationer. Springer Vieweg: Wiesbaden, 2014.
- Christian Ullenboom: Java er også en ø. Introduktion, træning, øvelse. 11. udgave, Galileo Press: Bonn, 2014, især s. 1009-1063.
- Christian Ullenboom: Java SE 8 standardbibliotek. Java Developer's Guide. 2. udgave, 2014, Galileo Press: Bonn, 2014, især s. 1031-1076.
Weblinks
- Oracle: Java Platform, Standard Edition (Java SE) 8 Java -dokumentation fra Oracle
- Jonathan Giles, Jasper Potts og Richard Bair: fx erfaring Samling af links til artikler, der beskriver JavaFX -innovationer
- Christian Ullenboom, blandt andre: Java Blog Talrige artikler om Java og JavaFX
Individuelle referencer og kommentarer
- ↑ Ullenboom: Java er også en ø. 11. udgave, 2014, s. 1011.
- ↑ JavaFX ofte stillede spørgsmål . Hentet 29. februar 2016.
- ^ Fremtiden for JavaFX og andre opdateringer til Java -klientkøreplaner . Hentet 17. november 2018.
- ↑ a b c Ullenboom: Java er også en ø. 11. udgave, 2014, s. 1011.
- ↑ JavaFX 1.0 er live ( Memento af den originale fra December 7th 2008 i den Internet Archive ) Info: Den arkiv link blev indsat automatisk, og er endnu ikke blevet kontrolleret. Kontroller venligst det originale og arkivlink i henhold til instruktionerne, og fjern derefter denne meddelelse.
- ↑ JavaFX 1.3 -udgivelse ( Memento fra 30. april 2011 i internetarkivet )
- ↑ javafx.com ( Memento af den oprindelige fra den 29. oktober 2010 i den Internet Archive ) Info: Den arkiv link blev indsat automatisk, og er endnu ikke blevet kontrolleret. Kontroller venligst det originale og arkivlink i henhold til instruktionerne, og fjern derefter denne meddelelse.
- ↑ Innovationer i JavaFX 2.0 . Netzwelt , adgang 13. oktober 2011
- ↑ a b Ullenboom: Java er også en ø. 11. udgave, 2014, s. 1012.
- ↑ Hendrik Ebbers: JavaFX8 - Hvad er nyt? I: jaxenter (oprettet den 20. marts 2014, tilgået den 12. december 2016).
- ↑ JDK til ARM 8u33 udgivelsesnoter . Oracle . 16. februar 2013. Hentet den 29. februar 2016: “ Fra og med JDK 8u33 fjernes JavaFX Embedded fra ARM -pakken og understøttes ikke. "
- ^ Oracle Corporation: Java Client Roadmap Update. Oracle Corporation, 11. maj 2020, tilgås 14. februar 2021 .
- ^ Steyer: Introduktion til JavaFX. 2014, s. 166–167.
- ↑ Oracle: JavaFX Architecture I: http://docs.oracle.com (sidst ændret 2013, åbnet 14. december 2016)
- ↑ Bemærk: Må ikke forveksles med den hemmelige servicesoftware PRISM
- ↑ a b c Steyer: Introduktion til JavaFX. 2014, s.8.
- ↑ Gerrit Grunwald: Visualisering i Java med JavaFX In: heise Developer (oprettet 28. juni 2013, åbnet 14. december 2016).
- ^ Steyer: Introduktion til JavaFX. 2014, s. 8–9.
- ↑ Bemærk: Hovedmetoden () er dybest set ikke nødvendig for et JavaFX -program, mens det er det centrale indgangspunkt for et normalt Java -program. Det genereres kun af NetBeans af sikkerhedsmæssige årsager for at garantere starten af applikationen i tilfælde af mangel på JavaFX -understøttelse på målplatforme. Netbeans ignorerer selv hovedmetoden (). Se Steyer: Introduktion til JavaFX. 2014, s. 29.
- ↑ Ullenboom: Java SE 8 standardbibliotek. 2. udgave 2014, s. 1032.
- ↑ Oracle: javafx.application - Class Application på docs.oracle.com (åbnet 11. december 2016); Epple: JavaFX 8. 2015, s. 9-10.
- ↑ Bemærk : Årsagen til dette er, at init -metoden - ligesom konstruktøren af klassen - stadig kaldes af programmets launcher -tråd. UI -elementer må dog kun oprettes og ændres i JavaFX -applikationstråden. Se Epple: JavaFX 8. 2015, s. 10.
- ↑ a b Steyer: Introduktion til JavaFX. 2014, s. 29.
- ↑ Epple: JavaFX 8. 2015, s. 11.
- ↑ For en detaljeret beskrivelse af Stage -klassen, se Oracle: Class Stage på docs.oracle.com (åbnet 11. december 2016). Se også Epple: JavaFX 8. 2015, s. 11–13.
- ^ Steyer: Introduktion til JavaFX. 2014, s. 29, 65.
- ↑ Epple: JavaFX 8. 2015, s. 13.
- ↑ Oracle: Class Scene på docs.oracle.com (åbnet 11. december 2016).
- ↑ Ullenboom: Java SE 8 standardbibliotek. 2. udgave, 2014, s. 1033.
- ^ Oracle: Class Group på docs.oracle.com (åbnet 11. december 2016); Ullenboom: Java SE 8 standardbibliotek. 2. udgave, 2014, s. 1034-1035.
- ↑ Oracle: Class Control på docs.oracle.com (åbnet 11. december 2016); Ullenboom: Java SE 8 standardbibliotek. 2. udgave, 2014, s. 1034.
- ↑ Ullenboom: Java SE 8 standardbibliotek. 2. udgave, 2014, s. 1036.
- ^ Epple: JavaFX 8 2015, s. 43-44; Oracle: Brug af JavaFX UI Controls på docs.oracle.com (åbnet 11. december 2016)
- ↑ Jeff Friesen: Udforskning af JavaFX's applikationsklasse I: JavaWorld (oprettet 14. april 2016, åbnet 13. december 2016).
- ^ Steyer: Introduktion til JavaFX. 2014, s. 201.
- ↑ Bemærk: I modsætning hertil er konsolbaserede eller ældre grafiske programmer ofte en lineær eller deterministisk sekvens af instruktioner og / eller input, der behandles efter hinanden.
- ^ Steyer: Introduktion til JavaFX. 2014, s. 201.
- ^ Steyer: Introduktion til JavaFX. 2014, s. 201.
- ^ Steyer: Introduktion til JavaFX. 2014, s. 202-205.
- ^ Steyer: Introduktion til JavaFX. 2014, s. 205-209.
- ↑ a b Ullenboom: Java SE 8. standardbibliotek. 2. udgave, 2014, s. 1037.
- ^ Steyer: Introduktion til JavaFX. 2014, s. 193-195; Ullenboom: Java SE 8 standardbibliotek. 2. udgave 2014, s. 379–388; Epple: JavaFX 8. 2015, s. 22-23.
- ↑ a b Steyer: Introduktion til JavaFX. 2014, s. 225.
- ↑ a b c d Oracle: JavaFX: Egenskaber og bindingsvejledning I: docs.oracle.com (åbnet 13. december 2016).
- ↑ Ullenboom: Java SE 8 standardbibliotek. 2. udgave 2014, s. 806–807.
- ^ Steyer: Introduktion til JavaFX. 2014, s. 228-231.
- ↑ Bemærk: Dette kan sammenlignes med XAML (Extensible Application Markup Language) fra Microsofts .NET framework.
- ^ Steyer: Introduktion til JavaFX. 2014, s. 9-10; Ullenboom: Java SE 8 standardbibliotek. 2. udgave 2014, s. 1062-1063; Ullenboom: Java er også en ø. 11. udgave, 2014, s. 1013-1014.
- ^ Steyer: Introduktion til JavaFX. 2014, s. 65–66.
- ↑ Oracle: Mastering FXML In: http://docs.oracle.com (Opdatering 2014, adgang 14. december 2016).
- ^ Værktøjet er tilgængeligt på følgende URL til Windows, OS X og Linux: http://gluonhq.com/labs/scene-builder/
- ↑ Simon Vienot: openjfx-dev postliste. "Scene Builder er nu open source!" . 3. december 2013. Hentet den 29. mar. 2016.
- ^ Gluon understøtter Scene Builder . 4. mar 2015. Adgang 29. mar. 2016.
- ↑ Tom Schindl: FXGraph I: https://www.eclipse.org/ (sidst ændret den 9. december 2013; tilgås den 13. december 2016).
- ↑ Ullenboom: Java er også en ø. 11. udgave, 2014, s. 1014.
- ↑ a b Shai Almog: Skal Oracle Spring Clean JavaFX ren? I: DZone (oprettet 22. november 2015, adgang 14. december 2016); se også Michael Thomas: hvil i fred, JavaFX? I: JAXenter (oprettet 24. november 2015, adgang 14. december 2016).
- ↑ iJUG: iJUG beder Oracle til at lave en klar forpligtelse til JavaFX ( minde om den oprindelige fra September 23, 2016 i Internet Archive ) Info: Den arkiv link blev indsat automatisk, og er endnu ikke blevet kontrolleret. Kontroller venligst det originale og arkivlink i henhold til instruktionerne, og fjern derefter denne meddelelse. I: iJUG (oprettet 27. januar 2016; opdatering 2. februar 2016; adgang 14. december 2016)
- ↑ a b Hartmut Schlosser: Hårdt, men fair: Hvilken fremtid har JavaFX? I: JAXenter (oprettet den 22. marts 2016, åbnet den 14. december 2016).
- ↑ JAXenter, Interview med Alexander Casall: "Kun Chuck Norris kan gøre hybride desktop applikationer" In: JAXenter (oprettet den 21. april 2015 åbnes den 14. december 2016).