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:

Javafx-architecture.svg

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 applikasjonens 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 mainmetode: 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:

  1. Når programmet starter, JavaFX kjøretids bygger først en forekomst av den Applicationklasse.
  2. 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.
  3. 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.
  4. 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 implicitExittil Platform på true.
  5. Nå kaller kjøretiden stop()metoden før Java- prosessen stoppes. Igjen trenger ikke denne metoden nødvendigvis overskrives.

Scenen

Scenen danner rammen for det faktiske innholdet. Sceneklassen styrer scenegrafen. Dette er et rotfestet tre som består av noder. Overordnede noder inneholder ytterligere noder, mens bladnodene representerer de synlige elementene i GUI (knapp, tekstfelt, glidebryter osv.).

Den start(...)metoden er et Stagepass. 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 Stageog Sceneligner 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 spesifiser setHeight(double value)høyden og bredden på scenen, og
  • setTitle(java.lang.String value) angir tittel på vinduet.

Det StageStylebestemmer utseendet til vinduet. Standardverdien er DECORATEDden 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 Sceneobjekt for dette. De Scenegjenstander må opprettes og endres i JavaFX søknad tråden .

Dette Sceneer 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: isResizableFor å gjøre dette, kaller den metoden på rotnoden for å finne ut om noden vil reagere på størrelsesendringer. Hvis noden truekommer tilbake, vil den endre Sceneden til den nye størrelsen, den falselar den være.

Med kommandoen stage.setScene(scene)kommer Scenescenediagrammet 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

Hierarki av nodeklassene i JavaFX.

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 Nodeer Parent. Overordnede noder er basisklassen for alle noder som inneholder flere noder som barn, dvs. er containere. Det er underklasser av foreldre:

  • Klassen Groupkombinerer 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. Den Groupnode går en ObservableListfor barn. Metoden getChildren()kan brukes til å hente frem barnelisten, som deretter kan legges til ved hjelp av getChildren().add(element)ytterligere elementer. Man Groupbryr seg ikke om barnas stillinger og kan ikke justeres via CSS.
  • Klassen Regiondanner basisklassen for alle kontroller og oppsett og utvider basisklassen med mange muligheter for styling via CSS. Derfra Regioner en lavere klasse Pane, som er barna gjennom offentlige metoder på utsiden. Den avledede klassen BorderPane, for eksempel, plassert over barna ( øverst ), venstre ( venstre ), høyre ( høyre ), nedenfra ( nederst ) og sentrum ( midt ).
  • Klassen Controlutvider klassen Region. 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.controlog har Controlsom 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 Mainer Applicationavledet fra klassen . Den egen main(...)metoden videresender til launch(...)metoden i Application-klassen. I den opprettede forekomsten av Applicationklassen 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 Stagesom kan sammenlignes med startvinduet. start()Følgende trinn utføres nå innenfor metoden:

  • En enkel etikettkontroll labelopprettes. Teksten som skal vises "Hello JavaFX World!" Blir sendt direkte til konstruktøren her.
  • StackPaneer det rootopprettet et navn . Dette plasserer alle underordnede elementer oppå hverandre i den rekkefølgen de blir lagt til. Som standard er komponentene sentrert i StackPane. Det root.getChildren().add(label)tidligere opprettede er nå Label labellagt til via .
  • Nå er det Scene sceneopprettet en som deretter kan Stagelastes på . Applikasjonen må spesifisere en rotnode for scenediagrammet. I dette eksemplet er dette rootobjektet av typen StackPane. 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 scenen scenesom refererer til det faktiske innholdet. Den show()metoden forsøker nå å vise vinduet ved å sette synlighet til true.

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 CycleOfLifetelefonsamtaler Application.launch(...), og en forekomst av Applicationunderklassen 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 Stageog Sceneobjekter 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.eventinneholder relevante klasser og grensesnitt for håndtering av hendelser i JavaFX. I utgangspunktet, et konkret arrangement en forekomst av klassen javafx.event.Eventeller et av dens subklasser slik som DragEvent, KeyEvent, MouseEventeller 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 EventHandlergrensesnittet, 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 btnse 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 EventTypetypen arrangement. For eksempel er Buttondet 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.collectionser: ObservableList, ObservableMapog ObservableSeter avledet fra hver observerbart grensesnitt , og legge til hver metode bidrar til den aktuelle ChangeListenerregister. Så de nye datastrukturer utvide java.utildatastrukturer List, Setog Mapog kan rapportere endringer.

For ObservableListeksempel er det et grensesnitt for et ListChangeListenersom reagerer på endringer i den observerte listen. Klassen ListChangeListener.Changerepresenterer 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å widthverdien 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.propertyforskjellige styrkeklasse defineres, slik som for innkapsling av int, long, float, double, booleanog String. Egenskapene implementerer grensesnittet Observableeller for varsling om endringer ObservableValue<T>. For eksempel, i stedet for den primitive datatypen dobbel, brukes en ny type DoublePropertysom 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 amountDuegjenstand er en instans av klassen javafx.beans.property.DoubleProperty. For å kapsle det, er det privatemerket som. I henhold til navnekonvensjonen for tilgang til egenskaper er følgende metoder tilgjengelige:

  • Den getAmountDue()metoden er standard getter som amountDuereturnerer den nåværende verdien av eiendommen. Returverdien til denne metoden er double(og ikke noe DoubleProperty). Getter-metoden bør finalerklæres som.
  • Den setAmountDue(double)metoden er også finalerklæ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 Mainen forekomst av electricalBillklassen 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 num1og num2og obligasjonen sum. De avhengige variablene er begge av typen IntegerPropertyog selve obligasjonen er av type NumberBinding. sumSå verdien av endringer automatisk hvis num1eller num2endres.

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.FXMLLoaderog dens klassemetode load(...)brukes til å laste inn en FXML-ressurs . Her må den relative banen til *.fxmlfilen sendes som parameter. Nå kan den spesifiserte filen lastes inn som en ressurs, og et objekt av typen javafx.scene.Parentkan 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 : LabelLabel

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

Individuelle referanser og kommentarer

  1. Ullenboom: Java er også en øy. 11. utgave, 2014, s. 1011.
  2. Vanlige spørsmål om JavaFX . Hentet 29. februar 2016.
  3. ^ Fremtiden for JavaFX og andre Java Client-veikartoppdateringer . Hentet 17. november 2018.
  4. a b c Ullenboom: Java er også en øy. 11. utgave, 2014, s. 1011.
  5. 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.  @1@ 2Mal: Webachiv / IABot / blogs.sun.com
  6. JavaFX 1.3-utgivelse ( Memento fra 30. april 2011 i Internet Archive )
  7. 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.  @1@ 2Mal: Webachiv / IABot / javafx.com
  8. Innovasjoner i JavaFX 2.0 . Netzwelt , åpnet 13. oktober 2011
  9. a b Ullenboom: Java er også en øy. 11. utgave, 2014, s. 1012.
  10. Hendrik Ebbers: JavaFX8 - Hva er nytt? I: jaxenter (opprettet 20. mars 2014, åpnet 12. desember 2016).
  11. 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. "
  12. ^ Oracle Corporation: Java Client Roadmap Update. Oracle Corporation, 11. mai 2020, åpnet 14. februar 2021 .
  13. ^ Steyer: Introduksjon til JavaFX. 2014, s. 166–167.
  14. Oracle: JavaFX Architecture In: http://docs.oracle.com (sist endret 2013, åpnet 14. desember 2016)
  15. Merk: Ikke forveksles med PRISM for hemmelig tjeneste
  16. a b c Steyer: Introduksjon til JavaFX. 2014, s.8.
  17. Gerrit Grunwald: Visualisering i Java med JavaFX In: heise Developer (opprettet 28. juni 2013, åpnet 14. desember 2016).
  18. ^ Steyer: Introduksjon til JavaFX. 2014, s. 8–9.
  19. 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.
  20. Ullenboom: Java SE 8 standardbibliotek. 2. utgave 2014, s. 1032.
  21. Oracle: javafx.application - Klassesøknaddocs.oracle.com (åpnet 11. desember 2016); Epple: JavaFX 8. 2015, s. 9-10.
  22. 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.
  23. a b Steyer: Introduksjon til JavaFX. 2014, s.29.
  24. Epple: JavaFX 8. 2015, s.11.
  25. For en detaljert beskrivelse av Stage-klassen, se Oracle: Class Stagedocs.oracle.com (åpnet 11. desember 2016). Se også Epple: JavaFX 8. 2015, s. 11–13.
  26. ^ Steyer: Introduksjon til JavaFX. 2014, s. 29, 65.
  27. Epple: JavaFX 8. 2015, s. 13.
  28. Oracle: Class Scenedocs.oracle.com (åpnet 11. desember 2016).
  29. Ullenboom: Java SE 8 standardbibliotek. 2. utgave, 2014, s. 1033.
  30. ^ Oracle: Class Groupdocs.oracle.com (åpnet 11. desember 2016); Ullenboom: Java SE 8 standardbibliotek. 2. utgave, 2014, s. 1034-1035.
  31. Oracle: Klasse Styredocs.oracle.com (vist 11.12.2016); Ullenboom: Java SE 8 standardbibliotek. 2. utgave, 2014, s. 1034.
  32. Ullenboom: Java SE 8 standardbibliotek. 2. utgave, 2014, s. 1036.
  33. Epple: JavaFX 8 2015, s. 43-44; Oracle: Bruke JavaFX UI-kontrollerdocs.oracle.com (åpnet 11. desember 2016)
  34. Jeff Friesen: Utforske JavaFXs applikasjonsklasse I: JavaWorld (opprettet 14. april 2016, åpnet 13. desember 2016).
  35. ^ Steyer: Introduksjon til JavaFX. 2014, s. 201.
  36. 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.
  37. ^ Steyer: Introduksjon til JavaFX. 2014, s. 201.
  38. ^ Steyer: Introduksjon til JavaFX. 2014, s. 201.
  39. ^ Steyer: Introduksjon til JavaFX. 2014, s. 202-205.
  40. ^ Steyer: Introduksjon til JavaFX. 2014, s. 205-209.
  41. a b Ullenboom: Java SE 8. standardbibliotek. 2. utgave, 2014, s. 1037.
  42. ^ 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.
  43. a b Steyer: Introduksjon til JavaFX. 2014, s. 225.
  44. a b c d Oracle: JavaFX: Properties and Binding Tutorial In: docs.oracle.com (åpnet 13. desember 2016).
  45. Ullenboom: Java SE 8 standardbibliotek. 2. utgave 2014, s. 806–807.
  46. ^ Steyer: Introduksjon til JavaFX. 2014, s. 228-231.
  47. Merk: Dette kan sammenlignes med XAML (Extensible Application Markup Language) fra Microsofts .NET-rammeverk.
  48. ^ 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.
  49. ^ Steyer: Introduksjon til JavaFX. 2014, s. 65–66.
  50. Oracle: Mastering FXML In: http://docs.oracle.com (Oppdater 2014, åpnet 14. desember 2016).
  51. Verktøyet er tilgjengelig på følgende URL for Windows, OS X og Linux: http://gluonhq.com/labs/scene-builder/
  52. Simon Vienot: openjfx-dev-postliste. "Scene Builder er nå åpen kildekode!" . 3. desember 2013. Hentet 29. mars. 2016.
  53. ^ Gluon støtter Scene Builder . 4. mars 2015. Tilgang 29. mars. 2016.
  54. Tom Schindl: FXGraph In: https://www.eclipse.org/ (sist endret 9. desember 2013, tilgjengelig på 13 desember 2016).
  55. Ullenboom: Java er også en øy. 11. utgave, 2014, s. 1014.
  56. 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).
  57. 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) @1@ 2Mal: Webachiv / IABot / www.ijug.eu
  58. a b Hartmut Schlosser: Hard, men rettferdig: Hvilken fremtid har JavaFX? I: JAXenter (opprettet 22. mars 2016, åpnet 14. desember 2016).
  59. JAXenter, intervju med Alexander Casall: "Only Chuck Norris can do hybrid desktop applications" I: JAXenter (opprettet 21. april 2015, åpnet 14. desember 2016).