JavaFX
JavaFX | |
---|---|
Grunnleggende data
| |
utvikler | Oracle |
Gjeldende versjon |
14 ( 10. mars 2020 ) |
operativsystem | Windows , macOS , Linux |
programmeringsspråk | Java |
kategori | Rammeverk |
Tillatelse | GPL med unntak for GPL-kobling |
OpenJFX på java.net og openjfx.io |
JavaFX er et rammeverk for å lage plattform Java - applikasjoner . Det er en Java-spesifikasjon fra Oracle og tar sikte på å legge til rette for profesjonell oppretting og distribusjon av interaktivt , multimediainnhold og grafiske brukergrensesnitt (GUI) over alle Java-plattformer .
Fram til 2014 var AWT og Swing standardløsninger for grafiske applikasjoner under Java. Disse gikk imidlertid frem i år. Det var hull i media- og animasjonsområdet , som nå er etterspurt med moderne grafiske grensesnitt. I stedet for å investere i den videre utviklingen av AWT / Swing, bestemte Oracle seg for å utvikle GUI-nivået fullstendig med JavaFX.
JavaFX er spesielt et scenegraf (engl. Scene graph ) som styrer de enkelte komponentene i et GUI. Med FXML muliggjør det også en deklarativ beskrivelse av grafiske grensesnitt på XML- basis. The Scene Builder er et grafisk verktøy som forenkler opprettelsen av FXML filer. I tillegg kan webteknologier som CSS også brukes til designet ved å legge dem inn i FXML-koden.
Siden JavaFX tilbyr alle API-er for moderne grensesnitt og ikke er avhengig av AWT / Swing, danner det en komplett mediestabel. JavaFX har direkte tilgang til alle 2D / 3D-ferdigheter i moderne grafikkprosessorer . Så alt kan programmeres med JavaFX som tidligere helst ble implementert med Flash .
Den JavaFX runtime miljø var en del av hver x86 Java SE installasjon fra versjon Java SE Runtime 7 Update 6 til 10 år.
Utviklingshistorie
Historien til JavaFX er ikke spesielt grei. Opprinnelig ønsket Sun / Oracle å posisjonere JavaFX som en Flash- erstatning på Internett, men kombinasjonen av HTML5 og CSS3 og JavaScript var for attraktiv. I dag er det hovedsakelig et GUI-verktøy for klassiske klientapplikasjoner .
Versjon 1
JavaFX ble kunngjort i mai 2007 og presentert på JavaOne- utviklerkonferansen i mai året etter . 4. desember 2008 ga Sun offisielt ut JavaFX 1.0 som et utviklersett for Windows og macOS . JavaFX 1.0-utgivelsen dukket opp sammen med programmeringsspråket JavaFX Script . Dette språket gjorde det enkelt å bygge hierarkiske objektgrafer og tilbød en god syntaks for objektbinding, som stater kunne synkroniseres med.
Versjon 1.2 ble utgitt i juni 2009. Den inneholdt blant annet tilpassbare UI-kontroller, ekstra layoutklasser (Tile, Stack, Flow, ClipView, Panel), støtte for RSS / Atom-feeder. Den er ikke bakoverkompatibel. Linux og Solaris har bare blitt støttet siden denne versjonen . Versjon 1.3 (kodenavn SoMa) ble utgitt 22. april 2010. Den mest åpenbare innovasjonen er en til tider enorm økning i ytelse. Også nytt er JavaFX TV, et offisielt CSS API for design av JavaFX-kontroller, noen nye, ønskede kontroller og støtte for 3D. Versjon 1.3.1 ble utgitt 21. august 2010 og forbedret fremdriftslinjen ved oppstart og feilsøking i Netbeans 6.9.1.
Versjon 2
JavaFX 2.0 dukket opp som kunngjort i tredje kvartal 2011. Denne versjonen bruker ikke JavaFX Script, "fordi Oracle ikke ønsket å bygge et annet programmeringsspråk, men et rent Java API som utviklere da kunne adressere fra forskjellige eksisterende skriptspråk." JavaFX Skript-API-er portet til Java. Gjengivelse av maskinvare er også optimalisert i JavaFX 2.0 slik at spill og komplekse 3D-representasjoner nå skal være mulig. JavaFX 2.0 gjengir HTML- og JavaScript-innhold ved hjelp av WebKit- biblioteket. Da den nye versjonen ble utgitt, kunngjorde Oracle at de ville fortsette å utvikle JavaFX som et open source-prosjekt som en del av OpenJDK .
JavaFX utviklet seg mer og mer til alternativet Swing / AWT. JavaFX 2.2 ble utgitt i august 2012. Dette ble integrert i JRE / JDK 7 Update 6. Trinnet var uvanlig fordi slike store tillegg aldri hadde blitt gjort som en oppdatering i JRE / JDK.
Utviklingen mot Open Source resulterte i OpenJFX, som sammen med OpenJDK gjør det mulig å bygge et helt gratis Java-system med en GUI-stabel under GPL .
Versjon 8
Med overgangen til Java 8-utgivelsen fikk JavaFX utgivelsen til å hoppe fra 2 til nå 8. JavaFX 8 bringer noen nyvinninger med seg. For eksempel tilbyr den lambdas som en ny språkkonstruksjon. En av de store innovasjonene er også JavaFX-UI-Toolkit, som leveres med Java 8 som anbefalt UI-Toolkit. Med FXML tilbyr verktøysettet blant annet. et XML- basert språk for å lage brukergrensesnitt.
Med versjon 8u33 ble Oracles ARM- støtte for JavaFX avviklet. Derfor er JavaFX ikke lenger inkludert i de offisielle Java-distribusjonene for ARM.
Veikart
"Mobile first" og "Web first" motiverer Oracle til å avvikle støtten for JavaFX, sannsynligvis i mars 2025. Videreutvikling vil da finne sted som en egen open source-modul, som Oracle allerede jobber med interesserte parter for.
arkitektur
Arkitekturen til JavaFX er helt ny og er spesielt ikke basert på Swing eller AWT. Dette betyr imidlertid også at JavaFX og AWT / Swing ikke bare kan blandes (selv om det finnes løsninger for det). JavaFX tilbyr et komplett API for moderne grensesnitt. De viktigste pakkene til dette API-et er:
Pakke | beskrivelse |
---|---|
javafx.animasjon | Klasser for animasjon basert på overganger |
javafx.application | Klassene for den grunnleggende livssyklusen til en applikasjon |
javafx.collections | Viktige JavaFX-samlinger inkludert verktøy |
javafx.event | Det grunnleggende rammeverket for JavaFX-hendelser og håndtering av dem |
javafx.fxml | Klasser for lasting av et hierarki av objekter fra en markeringsstruktur som FXML |
javafx.geometry | Klasser for geometriske operasjoner på todimensjonale objekter |
javafx.scene | Basisklassene for JavaFX Scene Graph API og overordnet pakke til de enkelte komponentene og elementene. Den inneholder underpakker som lerret, diagram, kontroll, effekt, bilde, input, layout, media, maling, form, tekst, transform, web etc. |
javafx.stage | Toppnivå beholderklasser for JavaFX-innhold |
javafx.util | Ulike verktøy og hjelpeklasser |
Følgende grafikk viser arkitekturen til JavaFX slik den er offisielt representert av Oracle:
Som med alle Java-applikasjoner har JavaFX også Java Virtual Machine (JVM) på det laveste nivået , som er ansvarlig for å utføre Java- bytecode . Normalt kjøres hvert startede Java-program i sin egen virtuelle maskin (VM).
De tilsvarende utviklingsverktøyene for Java eller JavaFX er gitt i Java SE Development Kit (eller bare Java Development Kit, kort sagt JDK). Basert på dette er det mange utvidelser, hvorav noen har blitt brukt med Java i veldig lang tid, for eksempel Java 2D for tegning av todimensjonale former.
Prism er den nye gjengivelsesmotoren som bruker grafikkmaskinvaren (hvis den støttes). Blant annet gjør den også egenskaper til Java 2D og forskjellige grafiske effekter som skygger, refleksjoner, transformasjoner eller animasjoner tilgjengelig på høyt nivå. Den blir gjengitt med OpenGL under Linux og macOS , mens Direct3D brukes under Windows . Hvis grafikkmaskinvaren ikke støttes, brukes en programvare- tilbakeslag til Java 2D.
Den Glassvindus Toolkit gir lavt nivå operativsystem rutiner , slik som administrering av vinduer timere eller hendelsesbehandling. Det fungerer som et plattformavhengig lag som forbinder JavaFX-plattformen med operativsystemet.
Den medier Motoren er basert på GStreamer og tilbyr omfattende støtte for lyd og video. Den web-motoren gjør det mulig for innebygging av webinnhold i JavaFX applikasjoner. Dette inkluderer HTML-gjengivelse basert på WebKit- motoren, maskinvareavhengig gjengivelse via Prism og muligheten for DOM-tilgang og manipulering av DOM.
The Quantum Toolkit lenker Prism, Glass Vindus Toolkit, Media Engine og Web Engine og gjør dem jevnt tilgjengelig for JavaFX APIer. JavaFX API og Quantum Toolkit innkapsler detaljene på de lavere nivåene og skjuler dem for brukeren. I prinsippet trenger ikke en JavaFX-utvikler å vite hvordan de lavere nivåene fungerer.
Struktur av et JavaFX-program
JavaFX livssyklus
JavaFX anvendelser utvide basisklassen Application
, livssyklus metoder , slik som init()
, start()
eller stop()
arvet . Disse metodene kan (eller må) overstyres i JavaFX-applikasjonen . JavaFX-bæreraketten passer på at disse blir kalt tilsvarende. Så JavaFX-applikasjoner krever ingen main
metode: Den egen statiske main(String[])
metoden leder den statiske launch(String[])
metoden for Application
- klasse videre og gir henne alle samtaleparametere . Siden klassemetoden launch(...)
vet hvilken klasse den ble kalt til, oppretter den en forekomst av den klassen og kaller deretter livssyklusmetodene.
Livssyklusen til et JavaFX-program er som følger:
- Når programmet starter, JavaFX kjøretids bygger først en forekomst av den
Application
klasse. init()
Metoden for den opprettet forekomsten er nå utført. Denne metoden er implementert som tom ved standard og trenger ikke nødvendigvis å være overskrevet. For eksempel kan anropsparametrene leses ut her. Imidlertid kan ingen UI-elementer ennå opprettes her.- Deretter
start(javafx.stage.Stage)
kalles metoden , som må overstyres av ethvert JavaFX-program. JavaFX overfører et trinn til metoden, som omtrent tilsvarer oppgaven til en hovedcontainer og best kan sammenlignes med startvinduet. - JavaFX-kjøretiden venter nå til applikasjonen avsluttes. Dette kan gjøres som følger:
- ved å kalle metoden
Platform.exit()
- ved å lukke det siste vinduet og sette attributtet
implicitExit
til Platform påtrue
.
- ved å kalle metoden
- Nå kaller kjøretiden
stop()
metoden før Java- prosessen stoppes. Igjen trenger ikke denne metoden nødvendigvis overskrives.
Scenen
Den start(...)
metoden er et Stage
pass. Den parameter av start(...)
er derfor av den type som javafx.stage.Stage
. Denne klassen er JavaFX-container på toppnivå som alltid er konstruert av plattformen - som en parameter for start(...)
metoden. Dette kan best sammenlignes med startvinduet . Andre stadium gjenstander kan også opprettes i et program .
Scenen kan brukes til å lage en rekke scener eller (Engl. Scenes ) å presentere. Navngivningen av basisklassene Stage
og Scene
ligner på teatret: Scenen er scenen som er oppført på scenen. Det danner rammen for det faktiske innholdet.
Som med et vindu, er det mange innstillingsalternativer for et sceneobjekt ved hjelp av passende metoder, for eksempel
setWidth(double value)
og spesifisersetHeight(double value)
høyden og bredden på scenen, og-
setTitle(java.lang.String value)
angir tittel på vinduet.
Det StageStyle
bestemmer utseendet til vinduet. Standardverdien er DECORATED
den som viser et vindu med en kant og kontroller avhengig av operativsystem og en hvit bakgrunn. De fleste egenskapene til et Stage-objekt er imidlertid skrivebeskyttet fordi de endres av den underliggende plattformen.
Scenen
En eller flere scener av typen presenteres vanligvis på scenen javafx.scene.Scene
. Denne klassen er beholderen for alt innhold i et scenediagram som administrerer de enkelte komponentene i en GUI .
Fra grafteori synspunktet til scenegrafen er et rotfestet tre som består av noder (tysk node eksisterer). Som indre noder er det foreldrenoder som kan inneholde ytterligere noder (noder) som barn. Et ark (Engl. Leaf node ) har imidlertid ikke flere barn. Bladene representerer nå de synlige elementene i brukergrensesnittet (f.eks. Knapper, tekstvinduer og glidebrytere), overordnede noder de usynlige strukturelle elementene (f.eks. BorderPane, HBox og VBox). Et program må ha rotnoden (engl. Root node ) for scenegrafen å spesifisere. Dette er noe som opprinnelsen som hele scenen utvikler seg fra. Det er et argument for konstruktøren av et Scene
objekt for dette. De Scene
gjenstander må opprettes og endres i JavaFX søknad tråden .
Dette Scene
er også koblingen mellom vinduet som leveres av operativsystemet og scenediagrammet. Hvis for eksempel vinduet blir forstørret, prøver Scene
å overføre denne endringen til rotnoden: isResizable
For å gjøre dette, kaller den metoden på rotnoden for å finne ut om noden vil reagere på størrelsesendringer. Hvis noden true
kommer tilbake, vil den endre Scene
den til den nye størrelsen, den false
lar den være.
Med kommandoen stage.setScene(scene)
kommer Scene
scenediagrammet på scenen via klassen . Alle grafiske objekter i et JavaFX-program er til stede når som helst, dvs. H. de eksisterer ikke bare på tegningstidspunktet.
Noder
Alle objekter i motivgrafen er av typen Node
. Disse danner derfor innholdet i scenegrafen. Hver node og hvert element i scenegrafen er i sin tur en undertype av abstraktklassen Node
.
En underklasse av Node
er Parent
. Overordnede noder er basisklassen for alle noder som inneholder flere noder som barn, dvs. er containere. Det er underklasser av foreldre:
- Klassen
Group
kombinerer flere elementer i en node. Det gjør det mulig for eksempel å bruke transformasjoner og effekter på gruppen og delegere den til alle elementene (barn) i gruppen. DenGroup
node går enObservableList
for barn. MetodengetChildren()
kan brukes til å hente frem barnelisten, som deretter kan legges til ved hjelp avgetChildren().add(element)
ytterligere elementer. ManGroup
bryr seg ikke om barnas stillinger og kan ikke justeres via CSS. - Klassen
Region
danner basisklassen for alle kontroller og oppsett og utvider basisklassen med mange muligheter for styling via CSS. DerfraRegion
er en lavere klassePane
, som er barna gjennom offentlige metoder på utsiden. Den avledede klassenBorderPane
, for eksempel, plassert over barna ( øverst ), venstre ( venstre ), høyre ( høyre ), nedenfra ( nederst ) og sentrum ( midt ). - Klassen
Control
utvider klassenRegion
. Det er basisklassen for komponenter som tillater brukerinngang i en eller annen form. Dette inkluderer for eksempel knapper eller etiketter. Hver kontrollkomponent kan i sin tur redigeres optisk ved hjelp av CSS.
JavaFX kommer - som Swing - med et sett med standardkomponenter i pakken javafx.scene.control
og har Control
som basisklasse. Følgende oversikt viser de viktigste kontrollene som er tilgjengelige i JavaFX:
Kontroll | bruk |
---|---|
Merkelapp | Den etiketten er en av de enkleste kontroller. Den består av en tekst og en hvilken som helst annen node for erklæring. Et bilde brukes ofte til dette. |
Hyperkobling | Tilsvarer en HTML - hyperkobling og vises som standard som blå understreket tekst. |
Knapp | Du kan trykke på en knapp . Valgstatusen beholdes. |
Radioknapp | En valgknapp for individuelt valg fra en gruppe radioknapper . Valgstatusen beholdes til en annen knapp i samme gruppe er valgt. |
Veksle-knapp | En alternativknapp som finnes i to tilstander: valgt og ikke valgt. Oppfører seg som en CheckBox eller en RadioButton. |
Sjekk boksen | En avkrysningsrute er en avkrysningsrute med tre mulige tilstander: udefinert, avkrysset og ukontrollert. Valgstatusen beholdes til den endres. |
ChoiceBox | En utvalgsliste for å velge et enkelt element fra en helst kort liste. |
Tekstfelt | Enkeltlinje fritekstfelt med markørkontroll og valg. |
TextArea | Flerlinjes fritekstfelt med markørkontroll og valg. |
Listevisning | Standard komponent for visning av lister over objekter. |
TableView | En tabellkomponent som består av en serie kolonner (TableColumn). Individuelle celler er representert som TableCell. |
TitledPane | En delvis dialog som kan åpnes og lukkes. |
ScrollPane | Serverer for å forskyve og presentere en seksjon med horisontal og vertikal rullefelt ( rullefelt ). |
I utgangspunktet er kontroller bare noder som kan legges til i SceneGraph og deretter vises. Selvfølgelig gir de tilsvarende klassene for UI-kontroller forskjellige spesifikke egenskaper og metoder for å støtte typiske interaksjoner med brukere.
Programeksempler
Hei 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 Main
er Application
avledet fra klassen . Den egen main(...)
metoden videresender til launch(...)
metoden i Application-klassen. I den opprettede forekomsten av Application
klassen blir init()
metoden først utført, som forblir tom her som standard .
Deretter start(...)
kjøres metoden, som, som her, må overstyres av alle JavaFX-applikasjoner. JavaFX passerer metoden en Stage
som kan sammenlignes med startvinduet. start()
Følgende trinn utføres nå innenfor metoden:
- En enkel etikettkontroll
label
opprettes. Teksten som skal vises "Hello JavaFX World!" Blir sendt direkte til konstruktøren her. - Nå
StackPane
er detroot
opprettet et navn . Dette plasserer alle underordnede elementer oppå hverandre i den rekkefølgen de blir lagt til. Som standard er komponentene sentrert i StackPane. Detroot.getChildren().add(label)
tidligere opprettede er nåLabel label
lagt til via . - Nå er det
Scene scene
opprettet en som deretter kanStage
lastes på . Applikasjonen må spesifisere en rotnode for scenediagrammet. I dette eksemplet er detteroot
objektet av typenStackPane
. I tillegg får konstruktøren en spesifikk skjermstørrelse ( ). - I neste trinn
primaryStage.setTitle("Hello JavaFX World!")
er tittelen på applikasjonsvinduet også satt til “Hello JavaFX World!”. Det viktigste er imidlertid tildelingen av scenenscene
som refererer til det faktiske innholdet. Denshow()
metoden forsøker nå å vise vinduet ved å sette synlighet tiltrue
.
Livets syklus
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 omtrent følgende resultater:
- Main () -metoden, kalt i tråden [main, 5, main]
- Init () -metoden, kalt i trådtråden [JavaFX-Launcher, 5, main]
- Start () -metoden, kalt i trådtråden [JavaFX Application Thread, 5, main]
- Stop () -metoden, kalt i trådtråden [JavaFX Application Thread, 5, main]
Den main(...)
metode for CycleOfLife
telefonsamtaler Application.launch(...)
, og en forekomst av Application
underklassen er opprettet i den JavaFX søknad tråden . Den init()
metoden kalles i det JavaFX launcher tråden , som er den tråd som starter programmet. For å utføre start()
og stop()
metodene oppretter JavaFX en tråd kalt JavaFX Application Thread . Opprettelsen av Stage
og Scene
objekter og modifikasjoner av scenegrafen må skje innenfor denne JavaFX-applikasjonstråden .
Hendelsesbehandling
Hendelseshåndteringen av JavaFX er den påfølgende videreutviklingen av hendelseshåndteringen under AWT og Swing eller Java selv, men også på nettet. Moderne grafiske programmer er veldig hendelsesorienterte. Du trenger derfor mekanismer som reagerer på hendelsen.
Ralph Steyer forklarer den grunnleggende ideen om håndtering av hendelser som følger:
- Et objekt kan skyte et hendelsesobjekt, og et annet objekt registrerer seg for en reaksjon på det (en såkalt hendelseslytter), for eksempel i tilfelle en gnist, der en sender sender en melding med radioen på en bestemt frekvens og en mottaker sender radioen innstilt på den frekvensen, mottar meldingen. På nøyaktig samme måte kan mottakeren reagere på en melding om en hendelse eller ignorere meldingen. Den spesifikke hendelseshåndteringen avgjøres derfor i lytterobjektet.
JavaFX-hendelser
Pakken javafx.event
inneholder relevante klasser og grensesnitt for håndtering av hendelser i JavaFX. I utgangspunktet, et konkret arrangement en forekomst av klassen javafx.event.Event
eller et av dens subklasser slik som DragEvent
, KeyEvent
, MouseEvent
eller ScrollEvent
.
Når en hendelse inntreffer, brukes en intern mekanisme for å bestemme hvilken node som er målet for et hendelsesobjekt. For mushendelser, for eksempel, er målet noden der musepekeren befinner seg. Fra det valgte hendelsesmålet er det en hendelsessendingskjede som går opp til roten til scenediagrammet.
Det blir alltid gjort et forsøk på å håndtere hendelsen i det innerste elementet der den skjedde. Dette krever en passende hendelsesbehandler (eller annen håndteringsstruktur). Etter det videresendes elementet til hendelsen til det nest høyeste objektet i treet osv. Man snakker i denne sammenhengen om hendelsesbobling, da hendelsesobjektet som en boble (Engl. Bubble ) til roten til scenegrafen stiger. Hvis dette ikke kan behandles til roten, vil det bli ødelagt. Dette er ganske regelen, da mange hendelser som å flytte musepekeren noen få millimeter ikke tvinger en spesifikk reaksjon fra applikasjonen.
Arrangementsbehandler
Hvis en node i ruten til hendelsesobjektet har registrert en hendelsesbehandler, forbrukes hendelsen. Programmørens oppgave er derfor å fange arrangementet deretter og å implementere reaksjonen på det. Eventbehandlere implementerer i utgangspunktet EventHandler
grensesnittet, som handle()
tvinger en metode som er beskrevet der, til å bli overskrevet . Det er her den faktiske reaksjonen på hendelsen som har skjedd hører hjemme. Denne metoden inneholder deretter et hendelsesobjekt av den aktuelle typen som parameter.
Følgende to metoder gir en generell måte å legge til eller avregistrere en hendelsesbehandler til et nodeobjekt:
-
addEventHandler(EventType<T>, EventHandler<? super T>)
for å legge til en handler -
removeEventHandler(EventType<T>, EventHandler<? super T>)
for å logge av en handler.
Den første parameteren spesifiserer den spesifikke hendelsen du vil reagere på, og den andre parameteren spesifiserer selve hendelsesbehandleren.
Ofte blir hendelsesbehandleren opprettet og registrert som en anonym klasse , med handle()
metoden implementert direkte for å gi de ønskede handlingene. For en kan det Button
btn
se ut slik:
btn.addEventHandler(ActionEvent.ACTION, new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// do something here
}
});
Som et lambdauttrykk kan det se ut slik:
btn.addEventHandler(ActionEvent.ACTION, (event) -> {
// do something here
});
I tillegg tilbyr komponentklassene også sine egne settermetoder for spesifikke hendelser, som har følgende format:
setOnEventType(EventHandler handler)
Dette indikerer EventType
typen arrangement. For eksempel er Button
det følgende metode setOnAction(EventHandler<ActionEvent>)
:
btn.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
// do something here
}
});
Dynamiske datastrukturer med endringsvarsler
I JavaFX individuelle verdier ikke bare observierbar men også dynamiske datastrukturer som er i pakken javafx.collections
er: ObservableList
, ObservableMap
og ObservableSet
er avledet fra hver observerbart grensesnitt , og legge til hver metode bidrar til den aktuelle ChangeListener
register. Så de nye datastrukturer utvide java.util
datastrukturer List
, Set
og Map
og kan rapportere endringer.
For ObservableList
eksempel er det et grensesnitt for et ListChangeListener
som reagerer på endringer i den observerte listen. Klassen ListChangeListener.Change
representerer en endring som gjøres i en slik liste. Med
observableList.addListener(new ListChangeListener(){/* do something here */});
lytteren blir deretter registrert for endringer i listen.
Egenskaper og databinding
Egenskaper og databinding er to kraftige språkmekanismer i JavaFX som kan brukes til å skape forhold mellom variabler. Vanligvis brukes de til (gjensidig) oppdatering av verdier. For eksempel bruker brukeren en glidebryter som styrer bredden på et rektangel, og avhengig av verdisettet, må width
verdien til datamodellen oppdateres og området til rektangelet beregnes på nytt. For å sammenligne dataene med hverandre, er det derfor begrepet egenskaper og databinding.
I JavaFX er egenskaper de grunnleggende byggesteinene for behandling og formidling av verdiendringer. De danner grunnlaget for praktisk databinding. En eiendom er en databeholder som også muliggjør endringsvarsler. Andre klasser som er interessert i endringer kan registrere seg som lyttere. En obligasjon blir også referert til som avhengighet eller avhengighet .
De bindende API-ene er delt inn i to kategorier i JavaFX:
- API på høyt nivå: Gir en enkel måte å lage bindinger for de fleste situasjoner. Spesielt er kodefullføring gitt for dette i IDEer som NetBeans.
- API på lavt nivå: Denne API-en er veldig fleksibel, mager og rask og tilbyr utvidede alternativer hvis API-et på høyt nivå ikke er nok.
Pakken javafx.beans.property
forskjellige styrkeklasse defineres, slik som for innkapsling av int
, long
, float
, double
, boolean
og String
. Egenskapene implementerer grensesnittet Observable
eller for varsling om endringer ObservableValue<T>
. For eksempel, i stedet for den primitive datatypen dobbel, brukes en ny type DoubleProperty
som double
"bryter" den primitive typen . I tillegg til getter- og settermetodene har JavaFX-egenskapene også en tilleggsmetode som ender med en egenskap og returnerer eiendomsobjektet.
Følgende eksempel kommer fra Java-dokumentasjonen fra Oracle og definerer en klasse kalt Bill
(tysk faktura ) som implementerer en enkelt eiendom kalt amountDue
(tysk forfall ):
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 amountDue
gjenstand er en instans av klassen javafx.beans.property.DoubleProperty
. For å kapsle det, er det private
merket som. I henhold til navnekonvensjonen for tilgang til egenskaper er følgende metoder tilgjengelige:
- Den
getAmountDue()
metoden er standard getter somamountDue
returnerer den nåværende verdien av eiendommen. Returverdien til denne metoden erdouble
(og ikke noeDoubleProperty
). Getter-metoden børfinal
erklæres som. - Den
setAmountDue(double)
metoden er ogsåfinal
erklært som og tillater at verdien av egenskapen som skal stilles inn utenfra. Parameteren din er ogsådouble
. - Den
amountDueProperty()
Metoden definerer getter av egenskapen og returnerer den egenskap selv. Det er en ny konvensjon som består av navnet på eiendommen (her amountDue ) og ordet eiendom .
Eiendommer er av spesiell interesse når man observerer endringene. I Java-hendelsesmodellen er det såkalte hendelsesutløsere ( hendelseskilder ), for eksempel knapper eller glidebrytere. Disse hendelsene kan stamme fra brukere av det grafiske grensesnittet, men kan også spores tilbake til deres egne utløsere. I tillegg til hendelsesutløserne er det en rekke interesserte parter, såkalte lyttere, som ønsker å bli informert når en bestemt begivenhet inntreffer. I dette tilfellet er det en ChangeListener
( javafx.beans.value.ChangeListener
) addListener()
for egenskapene, som kan legges til eiendommen via metoden som returneres med den tilsvarende gettermetoden.
For å illustrere en ChangeListener opprettes Main
en forekomst av electricalBill
klassen Bill
(se ovenfor) i Java-dokumentasjonen 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);
}
}
Utgangen vises i konsollen Elektrisk regning har endret seg! . Lytteren la merke til at electricBill.setAmountDue(100.00)
verdien til egenskapen amountDue ble endret, og den tilsvarende meldingen ble sendt changed(...)
ut via metoden.
APIene på høyt nivå er den enkleste og raskeste måten å bruke bindinger på. De består av to deler: Fluent API og Binding-klassen. Fluent API gir mange metoder for avhengige objekter, mens Binding-klassen tilbyr statiske fabrikkmetoder.
I det følgende eksemplet er to heltall bundet på en slik måte at deres verdier alltid blir lagt 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());
}
}
Det er totalt tre variabler, nemlig de to avhengige variablene num1
og num2
og obligasjonen sum
. De avhengige variablene er begge av typen IntegerProperty
og selve obligasjonen er av type NumberBinding
. sum
Så verdien av endringer automatisk hvis num1
eller num2
endres.
Deklarative GUI-beskrivelser
I utgangspunktet kan grafiske grensesnitt settes opp ved hjelp av et program-API, eller de kan spesifiseres i en deklarativ beskrivelse. Når det gjelder deklarative grensesnitt, er arrangementet av komponentene beskrevet i en ekstern ressursfil.
FXML
I tillegg til muligheten for å bygge scenegrafen ved hjelp av programkoden, tilbyr JavaFX også muligheten for å konfigurere objektene ved hjelp av XML . Med FXML gir JavaFX et lettlært, deklarativt språk som tillater en alternativ definisjon av grafiske grensesnitt rent via XML. Siden XML er strukturert hierarkisk, kan den grunnleggende hierarkiske strukturen til en GUI i containere og komponenter kartlegges veldig bra på XML-basis. Dette gjør det også lettere å skille layoutet fra koden på en ren måte. I tillegg kan webteknologier som CSS (Cascading Style Sheets), JavaScript, men også andre språk som Groovy brukes der ved å bli innebygd i XML-koden og lenke til den.
Klassen javafx.fxml.FXMLLoader
og dens klassemetode load(...)
brukes til å laste inn en FXML-ressurs . Her må den relative banen til *.fxml
filen sendes som parameter. Nå kan den spesifiserte filen lastes inn som en ressurs, og et objekt av typen javafx.scene.Parent
kan genereres fra den. Dette sendes som en parameter til konstruktøren av Scene-objektet.
Java-dokumentasjonen illustrerer forskjellen mellom kode og FXML ved hjelp av følgende enkle eksempel:
Følgende programkode bygger et grafisk brukergrensesnitt, som består av en med den ene sidetittelenBorderPane
øverst og en med etiketten Noen data her i sentrum :
Label
Label
BorderPane border = new BorderPane();
Label toppanetext = new Label("Page Title");
border.setTop(toppanetext);
Label centerpanetext = new Label ("Some data here");
border.setCenter(centerpanetext);
Samme grensesnitt er beskrevet i FXML som følger:
<BorderPane>
<top>
<Label text="Page Title"/>
</top>
<center>
<Label text="Some data here"/>
</center>
</BorderPane>
Den hierarkiske strukturen på overflaten kan derfor representeres veldig bra i det hierarkisk strukturerte markeringsspråket FXML. Dette gjør det lettere å legge til komponenter og bygge omrisset av en GUI.
Scenebyggeren
JavaFX Scene Builder er et grafisk verktøy som forenkler opprettelsen av FXML-filer. Med verktøyet kan GUI-elementer utformes uten kunnskap om programmering. Brukeren kan bruke dra og slipp for å visuelt designe og generere XML-strukturer fra FXML.
Oracle har sluttet å utvikle verktøyet og gitt ut programmets kildekode under en BSD-lignende lisens. Som et resultat overtok Gluon vedlikehold og kommersiell støtte.
FXGraph
FXGraph er et enkelt DSL ( Domain Specific Language ) for å definere objektgrafen, som er implementert i FXML i bakgrunnen. FXGraph kommer fra e (fx) clipse-prosjektet, en JavaFX-støtte i Eclipse . FXGraph er mer kompakt enn FXML og minner vagt om JSON .
kritikk
Tidligere Sun-ansatt og Kodenavn One-grunnlegger Shai Almog bekrefter at JavaFX ikke vil ha en lys fremtid. Han deler JavaFX-brukere i tre kategorier: selskaper med store investeringer i Swing, studenter og døffe fans. Ifølge Almog er det vanskelig å bygge et livlig samfunn på dette fundamentet . I tillegg sender Oracle ingen klare signaler om fremtidig forpliktelse til JavaFX. Samlet sett skylder han på tre hovedårsaker til mangelen på en fremtid for JavaFX:
- Oracle bruker ikke JavaFX eller bruker det i tilstrekkelig grad: Selv Swing-baserte produkter beveger seg ikke i retning av JavaFX. I tillegg har ikke Scene Builder blitt distribuert av Oracle selv på en stund.
- JavaFX har aldri fått samme innvirkning som Swing. Hovedmålgruppen til JavaFX, nemlig Swing-utviklerne, har ikke byttet til den nye teknologien.
- Arbeidsmarkedet ser dystert ut: På karrieresiden dice.com fant Almog bare 28 jobber som krevde JavaFX-kunnskap, i motsetning til 198 ledige stillinger for Swing, 2333 for Android og 16752 for Java EE (per 22. november 2015).
Etter at støtte for ARM Embedded Platform og utviklingen av Scene Builder fra Oracle ble avviklet, krevde iJUG-foreningen (Association of German Java User Groups) en eksplisitt forpliktelse til JavaFX fra Oracle. Som et resultat gjorde Don Smith (Oracle Senior Director Product Management) det klart at JavaFX fortsatt vil være den anbefalte teknologien for utvikling av rike kunder, og at den vil bli videreutviklet i denne forbindelse. Mangelen på støtte for ARM-plattformen har å gjøre med den store innsatsen som kreves for å garantere bærekraftig kommersiell ARM-støtte med tanke på den raskt skiftende maskinvareteknologien. Scene Builder er gjort tilgjengelig under den åpne BSD-lisensen, og strategien er nå å integrere Scene Builder i verktøy og utviklingsplattformer. Smith refererer spesielt til oppstarten Gluon, som tar for seg JavaFX-porter og Scene Builder.
Samlet sett 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 skrivebordsområdene med HTML og JavaScript. Tiden har ennå ikke fortalt om JavaFX vil etablere seg som en teknologi for webgrensesnitt.
Noen eksperter ser en nisje for JavaFX spesielt innen kraftige stasjonære klienter med sofistikert grafisk interaksjon, der den kan etablere seg permanent. De ser styrkene til rammeverket ikke minst i utviklingen av hybrid desktop-applikasjoner. Alle som utvikler en klient med direkte tilgang til lokale ressurser (filsystem, serielle ressurser, etc.) er i gode hender med JavaFX.
litteratur
- Anton Epple: JavaFX 8. Grunnleggende og avanserte teknikker. dpunkt.verlag: Heidelberg, 2015.
- Ralph Steyer: Introduksjon til JavaFX. Moderne GUIer for RIA og Java-applikasjoner. Springer Vieweg: Wiesbaden, 2014.
- Christian Ullenboom: Java er også en øy. Introduksjon, trening, praksis. 11. utgave, Galileo Press: Bonn, 2014, spesielt s. 1009-1063.
- Christian Ullenboom: Java SE 8 standardbibliotek. Håndboken for Java-utviklere. 2. utgave, 2014, Galileo Press: Bonn, 2014, spesielt s. 1031-1076.
weblenker
- Oracle: Java Platform, Standard Edition (Java SE) 8 Java-dokumentasjon fra Oracle
- Jonathan Giles, Jasper Potts og Richard Bair: FX-opplevelse Samling av lenker til artikler som beskriver JavaFX-innovasjoner
- Christian Ullenboom, blant andre: Java Blog Tallrike artikler om Java og JavaFX
Individuelle referanser og kommentarer
- ↑ Ullenboom: Java er også en øy. 11. utgave, 2014, s. 1011.
- ↑ Vanlige spørsmål om JavaFX . Hentet 29. februar 2016.
- ^ Fremtiden for JavaFX og andre Java Client-veikartoppdateringer . Hentet 17. november 2018.
- ↑ a b c Ullenboom: Java er også en øy. 11. utgave, 2014, s. 1011.
- ↑ JavaFX 1.0 er live ( Memento av den opprinnelige fra 07.12.2008 i Internet Archive ) Omtale: The arkivet koblingen ble satt inn automatisk og har ennå ikke blitt sjekket. Vennligst sjekk originalen og arkivlenken i henhold til instruksjonene, og fjern deretter denne meldingen.
- ↑ JavaFX 1.3-utgivelse ( Memento fra 30. april 2011 i Internet Archive )
- ↑ javafx.com ( Memento av den opprinnelige fra 29 oktober 2010 i Internet Archive ) Omtale: The arkivet koblingen ble satt inn automatisk og har ennå ikke blitt sjekket. Vennligst sjekk originalen og arkivlenken i henhold til instruksjonene, og fjern deretter denne meldingen.
- ↑ Innovasjoner i JavaFX 2.0 . Netzwelt , åpnet 13. oktober 2011
- ↑ a b Ullenboom: Java er også en øy. 11. utgave, 2014, s. 1012.
- ↑ Hendrik Ebbers: JavaFX8 - Hva er nytt? I: jaxenter (opprettet 20. mars 2014, åpnet 12. desember 2016).
- ↑ JDK for utgivelsesmerknader for ARM 8u33 . Oracle . 16. februar 2013. Hentet 29. februar 2016: “ Fra og med JDK 8u33 blir JavaFX Embedded fjernet fra ARM-pakken og støttes ikke. "
- ^ Oracle Corporation: Java Client Roadmap Update. Oracle Corporation, 11. mai 2020, åpnet 14. februar 2021 .
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 166–167.
- ↑ Oracle: JavaFX Architecture In: http://docs.oracle.com (sist endret 2013, åpnet 14. desember 2016)
- ↑ Merk: Ikke forveksles med PRISM for hemmelig tjeneste
- ↑ a b c Steyer: Introduksjon til JavaFX. 2014, s.8.
- ↑ Gerrit Grunwald: Visualisering i Java med JavaFX In: heise Developer (opprettet 28. juni 2013, åpnet 14. desember 2016).
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 8–9.
- ↑ Merk: Hovedmetoden () er i utgangspunktet ikke nødvendig for et JavaFX-program, mens det er det sentrale inngangspunktet for et vanlig Java-program. Den genereres bare av NetBeans av sikkerhetsmessige årsaker, for å garantere starten på applikasjonen i tilfelle mangel på JavaFX-støtte på målplattformene. Netbeans ignorerer selv hovedmetoden (). Se Steyer: Introduksjon til JavaFX. 2014, s.29.
- ↑ Ullenboom: Java SE 8 standardbibliotek. 2. utgave 2014, s. 1032.
- ↑ Oracle: javafx.application - Klassesøknad på docs.oracle.com (åpnet 11. desember 2016); Epple: JavaFX 8. 2015, s. 9-10.
- ↑ Merk : Årsaken til dette er at init-metoden - akkurat som konstruktøren i klassen - fremdeles blir kalt av applikasjonens starttråd. UI-elementer kan imidlertid bare opprettes og endres i JavaFX-applikasjonstråden. Se Epple: JavaFX 8. 2015, s. 10.
- ↑ a b Steyer: Introduksjon til JavaFX. 2014, s.29.
- ↑ Epple: JavaFX 8. 2015, s.11.
- ↑ For en detaljert beskrivelse av Stage-klassen, se Oracle: Class Stage på docs.oracle.com (åpnet 11. desember 2016). Se også Epple: JavaFX 8. 2015, s. 11–13.
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 29, 65.
- ↑ Epple: JavaFX 8. 2015, s. 13.
- ↑ Oracle: Class Scene på docs.oracle.com (åpnet 11. desember 2016).
- ↑ Ullenboom: Java SE 8 standardbibliotek. 2. utgave, 2014, s. 1033.
- ^ Oracle: Class Group på docs.oracle.com (åpnet 11. desember 2016); Ullenboom: Java SE 8 standardbibliotek. 2. utgave, 2014, s. 1034-1035.
- ↑ Oracle: Klasse Styre på docs.oracle.com (vist 11.12.2016); Ullenboom: Java SE 8 standardbibliotek. 2. utgave, 2014, s. 1034.
- ↑ Ullenboom: Java SE 8 standardbibliotek. 2. utgave, 2014, s. 1036.
- ↑ Epple: JavaFX 8 2015, s. 43-44; Oracle: Bruke JavaFX UI-kontroller på docs.oracle.com (åpnet 11. desember 2016)
- ↑ Jeff Friesen: Utforske JavaFXs applikasjonsklasse I: JavaWorld (opprettet 14. april 2016, åpnet 13. desember 2016).
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 201.
- ↑ Merk: I motsetning til dette er konsollbaserte eller eldre grafiske programmer ofte en lineær eller deterministisk sekvens av instruksjoner og / eller innganger som behandles etter hverandre.
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 201.
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 201.
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 202-205.
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 205-209.
- ↑ a b Ullenboom: Java SE 8. standardbibliotek. 2. utgave, 2014, s. 1037.
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 193-195; Ullenboom: Java SE 8 standardbibliotek. 2. utgave 2014, s. 379–388; Epple: JavaFX 8. 2015, s. 22-23.
- ↑ a b Steyer: Introduksjon til JavaFX. 2014, s. 225.
- ↑ a b c d Oracle: JavaFX: Properties and Binding Tutorial In: docs.oracle.com (åpnet 13. desember 2016).
- ↑ Ullenboom: Java SE 8 standardbibliotek. 2. utgave 2014, s. 806–807.
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 228-231.
- ↑ Merk: Dette kan sammenlignes med XAML (Extensible Application Markup Language) fra Microsofts .NET-rammeverk.
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 9-10; Ullenboom: Java SE 8 standardbibliotek. 2. utgave 2014, s. 1062-1063; Ullenboom: Java er også en øy. 11. utgave, 2014, s. 1013-1014.
- ^ Steyer: Introduksjon til JavaFX. 2014, s. 65–66.
- ↑ Oracle: Mastering FXML In: http://docs.oracle.com (Oppdater 2014, åpnet 14. desember 2016).
- ↑ Verktøyet er tilgjengelig på følgende URL for Windows, OS X og Linux: http://gluonhq.com/labs/scene-builder/
- ↑ Simon Vienot: openjfx-dev-postliste. "Scene Builder er nå åpen kildekode!" . 3. desember 2013. Hentet 29. mars. 2016.
- ^ Gluon støtter Scene Builder . 4. mars 2015. Tilgang 29. mars. 2016.
- ↑ Tom Schindl: FXGraph In: https://www.eclipse.org/ (sist endret 9. desember 2013, tilgjengelig på 13 desember 2016).
- ↑ Ullenboom: Java er også en øy. 11. utgave, 2014, s. 1014.
- ↑ a b Shai Almog: Bør Oracle Spring Clean JavaFX? I: DZone (opprettet 22. november 2015, åpnet 14. desember 2016); se også Michael Thomas: hvil i fred, JavaFX? I: JAXenter (opprettet 24. november 2015, åpnet 14. desember 2016).
- ↑ iJUG: iJUG spør Oracle å gjøre en klar forpliktelse til JavaFX ( minnesmerke av den opprinnelige fra 23 september 2016 i Internet Archive ) Omtale: The arkivet koblingen ble satt inn automatisk og har ennå ikke blitt sjekket. Vennligst sjekk originalen og arkivlenken i henhold til instruksjonene, og fjern deretter denne meldingen. I: iJUG (opprettet 27. januar 2016; oppdatering 2. februar 2016; åpnet 14. desember 2016)
- ↑ a b Hartmut Schlosser: Hard, men rettferdig: Hvilken fremtid har JavaFX? I: JAXenter (opprettet 22. mars 2016, åpnet 14. desember 2016).
- ↑ JAXenter, intervju med Alexander Casall: "Only Chuck Norris can do hybrid desktop applications" I: JAXenter (opprettet 21. april 2015, åpnet 14. desember 2016).