首页 > 解决方案 > JavaFX中控制器和主类之间的通信?

问题描述

我正在使用 IntelliJ,有些人可能知道,有一个 Main.java、Controller.java 和 FXML.fxml 文件的有序模板项目结构。

我想使用它,我试图通过单击 FXML 文档中定义的按钮在 2 个场景之间切换。我想知道,当通过单击按钮调用控制器时,我如何能够更改位于 Main.java 中的阶段。当然,可以在 Main.java 中将 Stage 和 Scene 设置为静态,但是很难从控制器调用它。 这确实有效,但在控制器中看起来很糟糕

看看 我对 FX 还是很陌生,尽管可能有比我选择的更好的可能性。我想知道我是否应该在 Controller 中声明 Stage 阶段和 Scenes。

谢谢!

标签: javafx

解决方案


我会将一个可运行的切换场景作为参数传递给控制器​​。

首先,不要在 FXML 文件中定义控制器,而是像这样在 Main 类中定义它。

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getRessource("Scene1.fxml");
fxmlLoader.setController(new Controller());
scene1 = fxmlLoader.load();

这允许您将参数传递给控制器​​的构造函数。所以知道传递一个 Runnable 作为参数来切换场景。像这样:

代替 :

new Controller()

new Controller(() -> {
    //Code to switch scenes
});

PS 这是一个 lambda 表达式。您可以改为将内容移动到单独的方法并将该方法作为参数传递。

最后,让你的控制器类看起来像这样

/*
 * The method to run when the button is pressed. Passed in as a parameter when the controller was created
 */
private final Runnable switchScenes;

public Controller(Runnable switchScenes) {
    this.switchScenes = switchScenes;
}

@FXML
public void handleSwitchButton(){
    switchScenes.run();
}

这使得以下内容。当按钮被按下时,switchScenes Runnable 被执行。这个 Runnable 是作为构造函数中的参数从主类传递给控制器​​的 Runnable。Runnable 包含切换场景的代码。注意:这需要 Java 8。对于 Java 7,您可以使用带有匿名类的接口。

另一方面,我建议切换根而不是场景(也就是只有一个场景,你调用 scene.setRoot())。这为您提供了更大的灵活性(例如,您可以在切换时添加淡入淡出过渡)。


推荐阅读