簡體   English   中英

我應該如何從外部調用 JavaFX 中“主要”class 中包含的方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM