2014-09-25 48 views
-1
@FXML 
private Pane pane; 

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

我想在FXMLController類上設置場景事件,我應該怎麼做?如何使用FXML控制器上的場景

回答

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); 
     } 
    } 
    // ... 
} 
相關問題