JavaFX类控制器场景引用

9
有没有办法从相关的类控制器中获取FXML加载文件的场景对象?
我的做法如下:
@FXML
private AnchorPane anchor; 

Scene scene = anchor.getScene();

但我希望有一种不涉及AnchorPane控件的解决方案。

2个回答

13

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

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

如果您仍想单独处理这个问题,则有以下方法:

  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);
  • 你可以创建一个自定义的fxml控件,该控件将包括控制器,而他只需要调用getScene()方法即可。这里有一个示例:https://dev59.com/sWkw5IYBdhLWcg3wrsnn#10718683


  • 1
    @netskink,已经为您修复了。 - Sergey Grinev
    FXMLLoader.load()是静态方法,因此fxmlLoader.getController()将返回null。我该如何解决? - Nishan Senevirathna

    3
    我尝试了你的答案,但是它没有起作用。我在这里找到了原因:
    JavaFX:如何在初始化期间从控制器获取舞台?
    在评论之后。
    // loading code 
    

    不要使用静态加载方法。
    AnchorPane root=(AnchorPane) FXMLLoader.load(getClass().getResource("MyApp.fxml"));
    

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

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

    这有何不同于已经发布的答案?那个答案使用的是实例方法,而不是静态加载方法。 - Aaron D
    1
    @AaronD,我编辑了被接受的答案以进行更正,为了未来阅读它的用户。很可能是在发布答案时打错了字。 - Uluk Biy
    哦,谢谢,虽然您错过了一个FXML加载器的条目,但我已经修复了。 - Sergey Grinev

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接