@FXML
private Pane pane;
@Override
public void initialize(URL location, ResourceBundle resources) {
pane.getScene().setOnKeyPressed(....);
}
我想在FXMLController类上设置场景事件,我该怎么办?
答案 0 :(得分:0)
不会在窗格上设置场景,直到FXML的根元素添加到场景图中。在控制器中,您无法控制何时会发生这种情况,但必须在initialize()
方法完成后进行。
这里最好的方法是找到一些注册事件的方法;例如你真的想在现场注册它吗:你可以在FXML生成的节点图的根元素上注册吗?
如果您确实需要从控制器访问场景,则需要使用其中一个节点的scene属性注册一个侦听器,并在初始化场景时设置按下的键处理程序。要真正防弹,您应该处理可能在某个时候从场景中移除窗格的可能性。
public void initialize() {
EventHandler<KeyEvent> sceneKeyPressedHandler = ... ;
pane.sceneProperty().addListener((ov, oldScene, newScene) -> {
if (oldScene != null) {
oldScene.removeEventHandler(KeyEvent.KEY_PRESSED, sceneKeyPressedHandler);
}
if (newScene != null) {
newScene.addEventHandler(KeyEvent.KEY_PRESSED, sceneKeyPressedHandler);
}
}
// ...
}