JavaFX - Affectation dynamique du contrôleur à fxml

C'est une histoire quand il y a de rares cas où vous souhaitez changer dynamiquement le traitement du contrôleur (gestion des événements, etc.) tout en partageant fxml.

la mise en oeuvre

common.fxml

javafx.jpg

HogeController


package sample.javafx;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

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

public class HogeController implements Initializable {
    @FXML
    private Label label;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        this.label.setText("Hoge");
    }
}

Main.java


package sample.javafx;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/common.fxml"));
        
        loader.setController(new HogeController());
        
        Parent root = loader.load();
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

** Résultat d'exécution ** javafx.jpg

Mise en œuvre 2

FugaController.java


package sample.javafx;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;

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

public class FugaController implements Initializable {
    @FXML
    private Label label;

    @Override
    public void initialize(URL location, ResourceBundle resources) {
        this.label.setText("Fuga");
    }
}

Main.java


package sample.javafx;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/common.fxml"));
        
        loader.setController(new FugaController()); //★ Changer de contrôleur
        
        Parent root = loader.load();
        Scene scene = new Scene(root);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

** Résultat d'exécution **

javafx.jpg

La description

Main.java


        FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/common.fxml"));
        
        loader.setController(new FugaController()); //★ Changer de contrôleur
        
        Parent root = loader.load();

--Instantiate FXMLLoader avec new et attribuer une instance de contrôleur arbitraire avecsetController ()avant load ()

Recommended Posts

JavaFX - Affectation dynamique du contrôleur à fxml
Attribuer les résultats de l'évaluation aux variables Java