gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:27:16 27 4
gpt4 key购买 nike

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

主类的当前代码(没有错误):

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 非常了解。

最佳答案

我见过使用 JavaFX 处理此类问题的最佳方法是创建一个由 FXML Controller 扩展的 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 Controller 类是 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的 Controller 都将有权访问changeScene()。不要忘记更新changeScene()来为每个加载的FXML文件调用SetPrimaryStage,就像Main::start中一样

关于java - 我应该如何在JavaFX中外部调用 "Main"类中包含的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62127540/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com