【问题标题】:JavaFX class controller scene referenceJavaFX 类控制器场景参考
【发布时间】:2012-10-07 19:22:48
【问题描述】:

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

我正在做这样的事情:

@FXML
private AnchorPane anchor; 

Scene scene = anchor.getScene();

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

【问题讨论】:

    标签: java javafx-2 javafx fxml


    【解决方案1】:

    为什么不呢? 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

    【讨论】:

    • @netskink,为你修好了
    • FXMLLoader.load() 是静态方法,因此 fxmlLoader.getController() 将返回 null。我该如何解决这个问题?
    【解决方案2】:

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

    【讨论】:

    • 这与已经发布的答案有何不同?答案是使用实例方法,而不是静态加载方法。
    • @AaronD,为了将来阅读它的用户,我编辑了接受的答案以更正它。很可能是发布答案时打错了。
    • 哦,谢谢,虽然你错过了 fxmlLoader 的一个条目,但我已经修复了。
    猜你喜欢
    • 1970-01-01
    • 2014-11-02
    • 2014-11-21
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多