我正在使用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中声明舞台舞台和场景。
谢谢!
答案 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())。这为您提供了更大的灵活性(例如,您可以在切换时添加淡入淡出过渡)。