[英]How should I externally call a method contained in the “Main” class in JavaFX?
我有一個名為 changeScene() 的方法,我希望能夠從單獨的 controller class 調用它。 例如,當在初始場景上按下“設置”按鈕時,初始場景的fxml文件的controller class需要調用Main .changeScene("settings.fxml")。
主 class 的當前代碼(無錯誤):
public class Main extends Application {
private Stage window;
private Scene home, editor;
public static void main(String[] args){
launch(args);
}
@Override
public void start(Stage stage) throws Exception {
window = stage;
Parent root = FXMLLoader.load(getClass().getResource("/Scenes/MainPage.fxml"));
home = new Scene(root, 640, 400);
window.setTitle("Home");
window.setScene(home);
window.show();
}
//Method I want to be able to call externally
public void changeScene(String fxml) throws Exception{
Parent pane = FXMLLoader.load(
getClass().getResource(fxml));
Scene scene = new Scene(pane);
window.getScene().setRoot(pane);
}
}
我最初的想法是簡單地向 Main class 添加一個構造函數,以使其可初始化並以這種方式調用該方法,但我懷疑這是最好的解決方案。 提前感謝您的幫助,我對 JavaFX 非常了解。
我見過用 JavaFX 處理此類問題的最佳方法是創建一個 AbstractController class ,讓您的 FXML 控制器擴展。
AbstractController.java
/**
* Class for controllers to extend in order to get access to the primary stage
*/
public abstract class AbstractController
{
/**
* The primary stage accessible by derived classes.
*/
protected Stage primaryStage;
/**
* Sets the primary stage.
*
* @param primaryStage the primary stage for the application
*/
public void setPrimaryStage(Stage primaryStage)
{
this.primaryStage = primaryStage;
}
}
Assuming your FXML controller class is MainController.java for MainPage.fxml, update it to extend AbstractController and then update your Main::start function like so:
FXMLLoader loader = new FXMLLoader(getClass().getResource("/Scenes/MainPage.fxml"));
Parent root = (Parent)loader.load();
AbstractController controller = (AbstractController)loader.getController();
controller.setPrimaryStage(window);
此時,您的 MainController 可以訪問主要階段(即您命名的“窗口”)。 如果將 changeScene function 移動到 AbstractController,則所有擴展 AbstractController 的控制器都可以訪問 changeScene()。 不要忘記更新 changeScene() 以為每個加載的 FXML 文件調用 SetPrimaryStage,就像在 Main::start 中一樣
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.