我想从控制器类处理舞台事件(即隐藏)。所以我要做的就是通过添加一个监听器

((Stage)myPane.getScene().getWindow()).setOn*whatIwant*(...);


但问题是初始化是在之后立即开始的

Parent root = FXMLLoader.load(getClass().getResource("MyGui.fxml"));


和之前

Scene scene = new Scene(root);
stage.setScene(scene);


因此.getScene()返回null。

我自己发现的唯一解决方法是在myPane.sceneProperty()中添加一个侦听器,当它变为非null时,我得到了场景,将其添加到.windowProperty()中,我的天哪!侦听器处理,这是我终于检索到的阶段。最后,设置所需的侦听器来安排事件。
我认为听众太多。
这是解决我的问题的唯一方法吗?

最佳答案

初始化后,可以通过FXMLLoadergetController()获取控制器的实例,但是您需要实例化FXMLLoader而不是使用静态方法。

之后,我直接将load()调用到控制器后,我将通过该阶段:

FXMLLoader loader = new FXMLLoader(getClass().getResource("MyGui.fxml"));
Parent root = (Parent)loader.load();
MyController controller = (MyController)loader.getController();
controller.setStageAndSetupListeners(stage); // or what you want to do

10-07 23:48