我应该如何从外部调用 JavaFX 中 "Main" class 中包含的方法?
How should I externally call a method contained in the "Main" class in JavaFX?
我有一个名为 changeScene() 的方法,我希望能够从单独的控制器调用该方法 class。比如初始场景按下"settings"按钮,初始场景fxml文件的controllerclass需要调用Main.changeScene( "settings.fxml")。
Main 的当前代码 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;
}
}
假设您的 FXML 控制器 class 对于 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 可以访问初级阶段(即您命名的 "window")。如果将 changeScene 函数移动到 AbstractController,那么所有扩展 AbstractController 的控制器都可以访问 changeScene()。不要忘记更新 changeScene() 以便为每个加载的 FXML 文件调用 SetPrimaryStage,就像在 Main::start
中一样
我有一个名为 changeScene() 的方法,我希望能够从单独的控制器调用该方法 class。比如初始场景按下"settings"按钮,初始场景fxml文件的controllerclass需要调用Main.changeScene( "settings.fxml")。
Main 的当前代码 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;
}
}
假设您的 FXML 控制器 class 对于 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 可以访问初级阶段(即您命名的 "window")。如果将 changeScene 函数移动到 AbstractController,那么所有扩展 AbstractController 的控制器都可以访问 changeScene()。不要忘记更新 changeScene() 以便为每个加载的 FXML 文件调用 SetPrimaryStage,就像在 Main::start
中一样