javafx - JavaFX中控制器和主类之间的通信?
问题描述
我正在使用 IntelliJ,有些人可能知道,有一个 Main.java、Controller.java 和 FXML.fxml 文件的有序模板项目结构。
我想使用它,我试图通过单击 FXML 文档中定义的按钮在 2 个场景之间切换。我想知道,当通过单击按钮调用控制器时,我如何能够更改位于 Main.java 中的阶段。当然,可以在 Main.java 中将 Stage 和 Scene 设置为静态,但是很难从控制器调用它。 这确实有效,但在控制器中看起来很糟糕
看看 我对 FX 还是很陌生,尽管可能有比我选择的更好的可能性。我想知道我是否应该在 Controller 中声明 Stage 阶段和 Scenes。
谢谢!
解决方案
我会将一个可运行的切换场景作为参数传递给控制器。
首先,不要在 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())。这为您提供了更大的灵活性(例如,您可以在切换时添加淡入淡出过渡)。
推荐阅读
- amazon-rds - 在创建快照期间重新启动 aws rds
- c# - 将值列表从 mvc 模型分组到 html 表
- r - 小鼠:拆分估算数据以进行进一步分析
- javascript - Puppeteer - 在框架内运行函数
- angularjs - 添加到重复列表后编辑嵌套选择选项
- hyperlink - shinydashboard:如何将 menusubitem 放在超链接之外
- sql-server - 如何将组合信息从一个表显示到另一个表?
- javascript - 让一个 div 在悬停时替换另一个
- machine-learning - 将我的图像数据集划分为 Mask_RCNN 的训练/验证的最佳配给是多少?
- c# - C# 命名空间、导入的类和编辑