我应该如何在外部调用JavaFX中“ Main”类中包含的方法?

我有一个名为changeScene()的方法,希望能够从单独的控制器类中调用。例如,当在初始场景上按下“设置”按钮时,初始场景的fxml文件的控制器类需要调用 Main .changeScene(“ settings.fxml”)。

Main类的当前代码(无错误):

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类添加一个构造函数,以使其可初始化并以这种方式调用该方法,但是我怀疑这是最好的解决方案。感谢您的事先帮助,JavaFX非常了解我。

iCMS 回答:我应该如何在外部调用JavaFX中“ Main”类中包含的方法?

我所见过的用JavaFX处理此类问题的最好方法是创建一个FController扩展的AbstractController类。

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;
    }
}

假设您的FXML控制器类是MainPage.fxml的 MainController.java ,请对其进行更新以扩展AbstractController,然后按如下所示更新Main :: start函数:

        FXMLLoader loader = new FXMLLoader(getClass().getResource("/Scenes/MainPage.fxml"));
        Parent root = (Parent)loader.load();
        AbstractController controller = (AbstractController)loader.getController();
        controller.setPrimaryStage(window);

这时,您的MainController可以访问主要阶段(即您命名的“窗口”)。如果将changeScene函数移动到AbstractController,则所有扩展AbstractController的控制器将有权访问changeScene()。不要忘记更新changeScene()来为每个加载的FXML文件调用SetPrimaryStage,就像在Main :: start

中一样
本文链接:https://www.f2er.com/2230171.html

大家都在问