【发布时间】:2012-10-07 19:22:48
【问题描述】:
有什么方法可以从关联的类控制器中获取 FXML 加载文件的 Scene 对象。
我正在做这样的事情:
@FXML
private AnchorPane anchor;
Scene scene = anchor.getScene();
但我想要一个不引用 AnchorPane 控件的解决方案。
【问题讨论】:
有什么方法可以从关联的类控制器中获取 FXML 加载文件的 Scene 对象。
我正在做这样的事情:
@FXML
private AnchorPane anchor;
Scene scene = anchor.getScene();
但我想要一个不引用 AnchorPane 控件的解决方案。
【问题讨论】:
为什么不呢? Controller是一个抽象类,他不知道UI,除非你故意让他知道。
节点(包括 AnchorPane)是另一回事,它们几乎不存在于场景图之外。所以向 Node 询问他的父母或场景是完全可以的。
如果您仍想单独处理,还有以下方法:
您可以在加载程序之后创建自定义控制器并设置场景。请注意,在initialize() 调用它时它还没有初始化。
public class MyController {
private void Scene scene;
public void setScene(Scene scene) { this.scene = scene; }
}
// loading code
FXMLLoader fxmlLoader = new FXMLLoader();
AnchorPane root = (AnchorPane) fxmlLoader.load(getClass().getResource("MyApp.fxml"));
MyController myController = (MyController) fxmlLoader.getController();
myController.setScene(scene);
您可以创建一个自定义 fxml 控件,该控件将包含控制器,他可以自己调用 getScene()。在此处查看示例:https://stackoverflow.com/a/10718683/1054140
【讨论】:
我试过你的答案,但没有奏效,我在这里找到了原因:
JavaFX: How to get stage from controller during initialization?
评论后:
// loading code
不要使用静态加载方法
AnchorPane root=(AnchorPane) FXMLLoader.load(getClass().getResource("MyApp.fxml"));
而是使用实例化加载器的方法
AnchorPane root=(AnchorPane) fxmlLoaded.load(getClass().getResource("MyApp.fxml"));
【讨论】: