Warum tut man @FXML bei Javafxcontrollerklasssn

berserkerdq2

Bekanntes Mitglied
Wenn ich z.B. einem Button den ich zuvor erstellt habe ein Event zugügen will mache ich ja zuvor @FXML und dann Button a = new…, warum?
 
Beste Antwort
Kurz: wenn Du eine Variable oder Methode mit der Annotation @FXML annotierst (jetzt kennst Du auch gleich die richtigen Begriffe), stellst Du eine Verbindung zwischen dem Code und der FXML-Datei her.

Dazu muss man wissen, dass man in Java Annotationen definieren kann, um damit Typen, Variablen oder Methoden mit Zusatzinformationen zu versehen, die für Java selbst keine Bedeutung haben. Vielmehr können diese Zusatzinformationen von Tools bzw. Bibliotheken ausgewertet werden, was dann genutzt wird, um z. B. Abhängigkeiten zu injizieren oder Code zu generieren.

Ganz grob: Der FXMLLoader liest also die FXML-Datei, erzeugt die UI-Objekte und den Controller und injiziert die UI-Objekte in den Controller - und zwar in die mit...

mihe7

Top Contributor
Kurz: wenn Du eine Variable oder Methode mit der Annotation @FXML annotierst (jetzt kennst Du auch gleich die richtigen Begriffe), stellst Du eine Verbindung zwischen dem Code und der FXML-Datei her.

Dazu muss man wissen, dass man in Java Annotationen definieren kann, um damit Typen, Variablen oder Methoden mit Zusatzinformationen zu versehen, die für Java selbst keine Bedeutung haben. Vielmehr können diese Zusatzinformationen von Tools bzw. Bibliotheken ausgewertet werden, was dann genutzt wird, um z. B. Abhängigkeiten zu injizieren oder Code zu generieren.

Ganz grob: Der FXMLLoader liest also die FXML-Datei, erzeugt die UI-Objekte und den Controller und injiziert die UI-Objekte in den Controller - und zwar in die mit @FXML annotierten Variablen.
 
Beste Antwort

KonradN

Super-Moderator
Mitarbeiter
Evtl. noch als Ergänzung: dieses @FXML ist teilweise auch einfach nur ein Zeichen für den Entwickler, das besagt, dass etwas im FXML benutzt wurde. Damit er es nicht einfach so umbenennt (Wobei das im Refactoring bei IntellJ auch das fxml anpassen würde.)

Ein @FXML erlaubt, dass ein Feld, in das ja das Control injected wird, auch private sein kann. Wenn man das Control aber public macht, dann könnte man das @FXML auch weglassen.

Kleines Beispiel:
FXML:
XML:
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>


<AnchorPane prefHeight="127.0" prefWidth="209.0" xmlns="http://javafx.com/javafx/17.0.2-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="de.kneitzel.MainWindow">
   <children>
      <Button fx:id="button" layoutX="44.0" layoutY="70.0" mnemonicParsing="false" onAction="#onButtonClick" text="Button" />
      <TextField fx:id="textField" layoutX="14.0" layoutY="24.0" />
   </children>
</AnchorPane>

Controler:
Java:
package de.kneitzel;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TextField;

import java.net.URL;
import java.util.ResourceBundle;

public class MainWindow implements Initializable {

    @FXML
    private TextField textField;
    public Button button;
    
    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        if (button == null) {
            textField.setText("Button is null");
        } else {
            textField.setText("Button is not null");
        }
    }

    public void onButtonClick(ActionEvent actionEvent) {

    }
}

Damit kann man ja einfach mal etwas herum spielen. Wenn man das so startet, dann hat man im Textfeld "Button is not null". Ändert man das public (egal ob private, package private oder protected), dann bleibt button null.

Das Gleiche gilt bei den Methoden. Macht man die Methode onButtonClick nicht public, dann wird diese nicht gefunden und man bekommt direkt eine Exception: javafx.fxml.LoadException: Error resolving onAction='#onButtonClick', either the event handler is not in the Namespace or there is an error in the script.

Setzt man @FXML vor die Elemente, dann müssen diese nicht mehr public sein.

Aber so wie bei dem @Override sollte natürlich klar sein: Man sollte es immer setzen, alleine damit eben diese Beziehung zwischen fxml und Controller deutlich wird. Man hat halt wirklich eine starke Abhängigkeit zwischen diesen Elementen und die sollte in beide Richtungen direkt erkennbar sein!
 

Ähnliche Java Themen

Neue Themen


Oben