-1
@FXML
private Pane pane;
@Override
public void initialize(URL location, ResourceBundle resources) {
pane.getScene().setOnKeyPressed(....);
}
我想在FXMLController類上設置場景事件,我應該怎麼做?如何使用FXML控制器上的場景
@FXML
private Pane pane;
@Override
public void initialize(URL location, ResourceBundle resources) {
pane.getScene().setOnKeyPressed(....);
}
我想在FXMLController類上設置場景事件,我應該怎麼做?如何使用FXML控制器上的場景
直到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);
}
}
// ...
}