JavaFX:如何在初始化期间从控制器获取阶段? [英] JavaFX: How to get stage from controller during initialization?

查看:372
本文介绍了JavaFX:如何在初始化期间从控制器获取阶段?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从我的控制器类处理阶段事件(即隐藏)。所以我要做的就是通过

 添加一个监听器((阶段)myPane.getScene()。getWindow()) .setOn * whatIwant *(......); 

但问题是初始化是在



之后立即开始的

 父root = FXMLLoader.load(getClass()。getResource(MyGui.fxml)); 

之前

 场景场景=新场景(根); 
stage.setScene(场景);

因此.getScene()返回null。



<我自己发现的唯一解决方法是向myPane.sceneProperty()添加一个监听器,当它变为非null时,我得到场景,添加到它的.windowProperty()我的!该死!我最终检索阶段的监听器处理。这一切都以设置所需的听众来举办舞台活动而告终。
我认为听众太多了。
这是解决我问题的唯一方法吗?

解决方案

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



之后我将调用 load()直接传递给控制器​​:

  FXMLLoader loader = new FXMLLoader(getClass()。getResource(MyGui.fxml)); 
父root =(父)loader.load();
MyController controller =(MyController)loader.getController();
controller.setStageAndSetupListeners(stage); //或者你想做什么


I want to handle stage events (i.e. hiding) from my controller class. So all I have to do is to add a listener via

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

but the problem is that initialization starts right after

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

and before

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

thus .getScene() returns null.

The only workaround I found by myself is to add a listener to myPane.sceneProperty(), and when it becomes not null I get scene, add to it's .windowProperty() my !goddamn! listener handling which I finally retrieve stage. And it all ends with setting desired listeners to stage events. I think there are too many listeners. Is it the only way to solve my problem?

解决方案

You can get the instance of the controller from the FXMLLoader after initialization via getController(), but you need to instanciate an FXMLLoader instead of using the static methods then.

I'd pass the stage after calling load() directly to the controller afterwards:

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

这篇关于JavaFX:如何在初始化期间从控制器获取阶段?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆