9

有什么方法可以从关联的类控制器中获取 FXML 加载文件的场景对象。

我正在做这样的事情:

@FXML
private AnchorPane anchor; 

Scene scene = anchor.getScene();

但我想要一个不引用 AnchorPane 控件的解决方案。

4

2 回答 2

13

为什么不?Controller是一个抽象类,除非你故意让他知道,否则他不知道UI。

节点(包括 AnchorPane)是另一回事,它们几乎不存在于场景图之外。因此,向 Node 询问他的父母或场景是完全可以的。

如果您仍想单独处理,还有以下方法:

  1. 您可以在加载程序之后创建自定义控制器并设置场景。请注意,在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);
    
  2. 您可以创建一个自定义 fxml 控件,该控件将包含控制器,他可以getScene()自己调用。在此处查看示例:https ://stackoverflow.com/a/10718683/1054140

于 2012-10-17T14:16:51.280 回答
3

我试过你的答案,但没有用,我在这里找到了原因:
JavaFX:如何在初始化期间从控制器获取阶段?
评论后:

// loading code 

不要使用静态加载方法

AnchorPane root=(AnchorPane) FXMLLoader.load(getClass().getResource("MyApp.fxml"));

而是使用实例化加载器的方法

AnchorPane root=(AnchorPane) fxmlLoaded.load(getClass().getResource("MyApp.fxml"));
于 2015-08-19T13:56:02.513 回答