JavaFX类控制器场景参考

时间:2012-10-17 13:53:42

标签: java javafx-2 javafx fxml

有没有办法从关联的类控制器获取FXML加载文件的Scene对象。

我正在做这样的事情:

@FXML
private AnchorPane anchor; 

Scene scene = anchor.getScene();

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

2 个答案:

答案 0 :(得分:13)

为什么不呢?控制器是一个抽象类,除非你故意让他知道,否则他不会知道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

答案 1 :(得分:3)

我尝试了你的答案,但它没有用,我在这里找到了原因:
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"));