如何在FXML控制器上使用场景

时间:2014-09-25 23:51:45

标签: javafx fxml

@FXML
private Pane pane;

@Override
public void initialize(URL location, ResourceBundle resources) {
    pane.getScene().setOnKeyPressed(....);
}

我想在FXMLController类上设置场景事件,我该怎么办?

1 个答案:

答案 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);
        }
    }
    // ...
}