Java Scene Builder?

2 Antworten

Neben Androheckers Antwort gibt es noch einen Ansatz, anstatt den Controller direkt in der FXML Datei anzugeben, was jedoch im Prinzip auf dasselbe hinaus läuft.

Du erstellst eine Klasse, welche das Interface: javafx.fxml.Initializable implementiert.

Anschließend kannst du deine FXML-Datei laden und die aktuelle Klasse beispielsweise als Controller verwenden:

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("MyLayout.fxml"));
fxmlLoader.setController(this);
Parent root = fxmlLoader.load();
Scene layout = new Scene(root);
...

Wenn ich im Builder z.b. Ein Textfeld erstelle[...]

Dann vergibst du im Scene-Builder oder in der FXML eine: fx:id.

<TextField text="Hallo Welt" fx:id="myText" />

Anschließend kannst du mit der @FXML Notation das Feld in deiner Controller-Klasse deklarieren:

@FXML
private TextField myText;

wobei die Variable vom Selben Typ wie deine Komponente der FXML sein muss und die Variable genauso heißen muss.

Durch die Implementation des Initializable-Interfaces erhälst du in deiner Klasse eine weitere Methode durch die implementation:

@Override
public void initialize(URL location, ResourceBundle resources) {...}

Diese Methode wird ausgeführt, wenn du den Controller zuweist. - Und somit stehen dir die Variablen ab genau diesem Zeitpunkt zur Verfügung.

Ich glaube du weist nicht so ganz, wie das funktioniert.

Wie du schon bemerkt hast verwendet der Scene Builder FXML Dateien (kann man auch manuell editieren), das dient dazu Code und Design zu trennen.
Jedes Mal wenn man eine FXML Datei lädt, werden die unter fx:controller gekennzeichneten Controller Klassen geladen.
In der Regel wird das immer mit dem Hauptcontainer gemacht.

In deinem Fall gibt es zwei Möglichkeiten. Felder des Controller-Objektes, die mit der Annotation @FXML gekennzeichnet werden, werden beim Laden auf die Node mit der gleichen id gesetzt (als fx:id in der FXML). Zusätzlich erstellt man eine Methode initialize(), welche auch die Annotation hat. In dieser kann man dann ganz normal auf die oben erstellte Node zugreifen und zum Beispiel den Text setzen.
In dem Fall gibt es eine schnellere Lösung, man erstellt im Controller eine Methode mit beliebigen Namen, ohne Parameter oder mit (ActionEvent), hier ist auch wieder die FXML Annotation nötig. In der FXML bei dem Textfeld setzt man dann onAction auf den Name der Methode plus ein # davor.