...
|
Den komplette FXML-koden er vist til venstre. Import-linjene øverst trengs for å kunne bruke navn tilsvarende Java-klasser lenger ned i fila. F.eks. vil Circle egentlig referere til java-klassen javafx.scene.shape.Circle. Java-koden antar her at FXML-fila ligger i samme mappe som java-fila. |
...
Til hver FXML-tag eller node kan det knyttes en id, altså et unikt navn (må sikres av utvikleren), helt analogt med id-tag'en i HTML. Dette angis i FXML-en med fx:id="...", f.eks. <circle fx:id="headCircle"/>, hvor alle id-er må være forskjellig i én fil. (fx-prefikset må være deklarert tidligere med xmlns:fx="http://javafx.com", typisk i ytterste tag, som vist i koden over.) Men merk at det kun er kun elementene en må ha ta tak i senere, som trenger id, så en trenger ikke finne på så mange id-er pr. fil.
Når en FMXL-fil først er lastet inn, så får en i utgangspunktet kun en referanse til det ytterste objektet, også gjerne kalt rot-noden. For å få tak i et objekt med en bestemt id lenger ned i strukturen, så kan en kalle metoden lookup(String id) på rot-noden. F.eks. vil rootNode.lookup("#headCircle") returnere noden under rootNode med id-en headCircle. Det er også mulig å søke etter noder eller strukturer av bestemte typer, men det er mindre praktisk siden en ofte har mange objekter av samme type.
Den typiske kode-strukturen vil være:
- Ett felt pr. JavaFX-objekt en vil ha tak i, gjerne med samme navn id-en, f.eks. Circle headCircle;
- En initialiseringsmetode med én linje pr. felt/objekt, hvor en slår opp objektet med lookup-metoden og setter feltet, f.eks. headCircle = (Circle) rootNode.lookup("#headCircle").
Siden dette er et så vanlig mønster, så kan FXML-mekanismen automatisere oppslag og setting av feltene. Denne automatikken krever to ting:
FXML-fila må lastes inn av et eget FXMLLoader-objekt, som må få vite hvilket objekt som håndteres av automatikken. Dette objektet settes med setController-metoden, f.eks. slik (hentet fra eksempel-koden lenger ned):
Code Block FXMLLoader fxmlLoader = new FXMLLoader(); fxmlLoader.setController(this); Parent root = (Parent) fxmlLoader.load(this.getClass().getResourceAsStream("StickMan2.fxml"));
Feltene som skal settes automatisk annoteres med @FXML, så det er tydelig at feltet skal håndteres av automatikken, f.eks.
Code Block @FXML Circle headCircle;
Reagere på input fra brukeren
...