2012-09-27 39 views
0

我試圖讓我的對話框接受<Enter>的defaultButton和<ESC>來執行cancelButton。在Modal窗口/對話框中處理JavaFX KeyEvent

我有一些像這樣的代碼:

dialog1 = new Stage(StageStyle.UNDECORATED); 
dialog1.initModality(Modality.WINDOW_MODAL); 
dialog1.initOwner(primaryStage); 
dialog1.setScene(
    new Scene(
    HBoxBuilder.create().styleClass("modal-dialog").children(
     LabelBuilder.create().text("Tells user what to do...").build(), 
     ButtonBuilder.create().text("Next step").defaultButton(true).onAction(new EventHandler<ActionEvent>() { 
     @Override public void handle(ActionEvent actionEvent) { 
      // take action and close the dialog1. 
      // do "OK" actions here... 
      dialog1.close(); 
     } 
     }).build(), 
     ButtonBuilder.create().text("Cancel").cancelButton(true).onAction(new EventHandler<ActionEvent>() { 
     @Override public void handle(ActionEvent actionEvent) { 
      // abort action and close dialog1. 
      // do "CANCEL" actions here... 
      dialog1.close(); 
     } 
     }).build() 
    ).build() 
    , Color.TRANSPARENT 
) 
); 
dialog1.getScene().getStylesheets().add(getClass().getResource("ModalDialog.css").toExternalForm()); 

而且我想添加類似下面來處理鍵盤。是什麼簡單這樣可能嗎?

.onAction(new EventHandler<KeyEvent>() { 
    @Override public void handle(KeyEvent t) { 
    if (t.getCode() == KeyCode.ENTER) { 
     // do "OK" actions here 
     dialog1.close();      
    } else { 
     // do "CANCEL" actions here 
     dialog1.close();      
    } 
    } 
}).build()   

我的問題是,我看了看周圍的「節點」掛在此處理程序,但似乎無法找到一個。像TextInputBuilder,或類似的東西。我也不知道語法的確切格式,即使一個TextInputBuilder是創建正確的節點,所以如果你能告訴我該調用應該採用的確切形式,那會很棒。

我猜是這樣的:

dialog1.setScene(
    new Scene(
    HBoxBuilder.create().styleClass("modal-dialog").children(
     TextInputFieldBuilder.onAction(new EventHandler<KeyEvent>() { 
     @Override public void handle(KeyEvent t) { 
      if (t.getCode() == KeyCode.ENTER) { 
      // do "OK" actions here 
      dialog1.close();      
      } else { 
      // do "CANCEL" actions here 
      dialog1.close();      
      } 
     } 
     }).build(), 
     LabelBuilder.create().text("Tells user what to do...").build(), 
     // [ ... ] 

回答

1

我試圖讓我的對話框接受<Enter>爲defaultButton和<ESC>執行cancelButton。

這是defaultButtoncancelButton的默認行爲,所以平時沒有多餘的代碼將被要求這樣做。


如果,萬一,場景中的其他一些控制消耗和印刷機,你真的要改寫:

  1. 現場添加filter套住相關KeyEvent秒。
  2. 當您收到相應的按鈕時,調用fire事件。
  3. consume事件通過調用fire來處理它之後,事件將不會被路由到按鈕處理程序,從而導致事件被潛在地處理兩次。

請勿在已爲按鈕定義的按鍵事件處理程序中複製ok/cancel和對話框關閉的代碼。