Schlagwort-Archiv: JavaFX

JavaFX 8: FXML-Controller initialisieren ohne Initializable

JavaFX-Controller

In JavaFX-Anwendungen ist der Controller das P in MVC und stellt die Verbindung zwischen FXML-View und Java-Model her.

Nach Instanziierung des Controllers (entweder durch den FXMLLoader oder programmatisch) erfolgt die Injection der mit @FXML annotierten GUI-Elemente. Danach kann optional eine zusätzliche Initialisierung des Controllers erfolgen, der Controller muß dazu lediglich das Interface Initializable implementieren, und das Ganze sieht in dann etwa so aus:

public class YourController implements Initializable {

    @FXML
    Button doStuffButton;

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

}

Die Methode initialize wird nach Instanziierung des Controllers und nach Injection der @FXML-Elemente aufgerufen. Benötigt man die Parameter später noch, werden sie üblicherweise in Instanzvariablen übernommen:

    URL location;
    ResourceBundle resources;

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

Soweit das Standardvorgehen.

Vereinfachung

Es gibt in JavaFX 8 nun mehrere Möglichkeiten, diesen Code zu vereinfachen.

kein Interface

Die Klasse ist nicht verpflichtet, tatsächlich explizit das Interface Initializable zu implementieren, es genügt, wenn die entsprechende Methode vorhanden ist, also

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

@Override muß dann natürlich verschwinden.

keine Parameter

Werden die beiden Parameter location und resources eigentlich gar nicht benötigt, können sie aus der Signatur verschwinden, Hauptsache, die Methode behält ihren Namen und hat auch sonst keine weiteren Parameter:

    public void initialize() { ... }

Am Verhalten ändert sich nichts, die Methode wird immer noch direkt nach Instanziierung und Injection automatisch aufgerufen.

keine Methode

Schließlich gibt es noch eine dritte Vereinfachungsmöglichkeit.

Wird die initialize-Methode lediglich dazu benötigt, die beiden Parameter location und resources in Instanzvariablen zu übernehmen, dann kann sie auch gleich komplett weggelassen werden. Die beiden Attribute müssen lediglich exakt diese Namen tragen und zusätzlich mit @FXML annotiert werden:

    @FXML
    URL location;

    @FXML
    ResourceBundle resources;

Das genügt. Wird der Controller instanziiert, dann werden neben all den anderen Injections nun auch diese beiden Attribute passend befüllt.

So kann also der Controllercode um ein paar unnötige Zeilen gekürzt werden, die ja ohnehin immer wieder die gleichen wären, aber natürlich muß dann nicht nur der Schreiber, sondern auch der spätere Leser des Codes um diese Möglichkeiten wissen.