FX - fxml に Controller を動的に割り当てる
fxml は共通にしつつ、コントローラ処理(イベントハンドリングとか)を動的に切り替えたいみたいなことが、まれにあったりなかったりしたときの話。
実装
common.fxml
- fxml ではコントローラを割り当てないようにしておく
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();
}
}
実装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()); // ★コントローラを変更
Parent root = loader.load();
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
}
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()); // ★コントローラを変更
Parent root = loader.load();
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}
}
実行結果
説明
Main.java
FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/common.fxml"));
loader.setController(new FugaController()); // ★コントローラを変更
Parent root = loader.load();
-
FXMLLoader
を new
でインスタンス生成して、load()
する前に setController()
で任意のコントローラインスタンスを割り当てる
Main.java
FXMLLoader loader = new FXMLLoader(this.getClass().getResource("/common.fxml"));
loader.setController(new FugaController()); // ★コントローラを変更
Parent root = loader.load();
FXMLLoader
を new
でインスタンス生成して、load()
する前に setController()
で任意のコントローラインスタンスを割り当てるAuthor And Source
この問題について(FX - fxml に Controller を動的に割り当てる), 我々は、より多くの情報をここで見つけました https://qiita.com/opengl-8080/items/22a3ce0332b5c7c9ba5c著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .