JavaFX中Controller和Main类之间的通信?

时间:2018-06-14 20:08:17

标签: javafx

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

我想使用它,我试图通过单击FXML文档中定义的按钮在2个场景之间切换。我想知道,当通过单击按钮调用Controller时,我如何能够更改Main.java中的阶段。当然,可以在Main.java中使Stage和Scene静态,但是很难从控制器中调用它。 This does work but it looks awful in the Controller

Take a look 我对FX很陌生,虽然可能有比我选择的更好的可能性。我想知道我是否应该在Controller中声明舞台舞台和场景。

谢谢!

1 个答案:

答案 0 :(得分:0)

我会传递一个runnable,它将场景作为参数切换到Controller。

首先,不要在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
});

P.S。这是一个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())。这为您提供了更大的灵活性(例如,您可以在切换时添加淡入淡出过渡)。