Java Scene Builder?
Hallo, ich habe Netbeans + Scene Builder für FX installiert. Ich bin neu mit Scene Builder, jedoch kann ich Javafx. Aber jetzt meine Frage: Wenn ich im Builder z.b. Ein Textfeld erstelle, wo muss ich dann im code die funktion z.b. für die Abfrage wenn enter gedrückt ist was im Textfeld steht. Also in die main class oder fxml class oder die andere java class????? Bitte um HILFE danke :)
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.