2016-08-01 76 views
5

我正在使用JavaFX創建一個對話框。對話框它自我工作得很好,但現在我試圖添加一個輸入驗證,當用戶忘記填寫文本字段時會警告用戶。 這裏來了我的問題:是否有可能阻止對話框在結果轉換器內關閉?就像這樣:阻止JavaFX對話框關閉

ButtonType buttonTypeOk = new ButtonType("Okay", ButtonData.OK_DONE); 
dialog.getDialogPane().getButtonTypes().add(buttonTypeOk); 

dialog.setResultConverter((ButtonType param) -> { 

    if (valid()) { 
     return ... 
    } else { 
     Alert alert = new Alert(Alert.AlertType.WARNING); 
     alert.setHeaderText("Pleas fill all fields!"); 
     alert.showAndWait(); 
     //prevent dialog from closing 
    } 

}); 

我注意到,對話不到風度接近,如果錯誤拋出的resault轉換器內部但這並不似乎是解決這個問題的好辦法。

如果通過這種方式無法解決問題,我可以按照this post中所述禁用按鈕。但我寧願保持啓用按鈕並顯示一條消息。

預先感謝您!

回答

12

你應該如何在一個對話框來管理數據驗證在Javadoc實際上是解釋,我引述:

對話框驗證/攔截按鈕操作

在某些情況下,希望阻止對話框關閉 ,直到對話框的某些方面內部保持一致(例如對話框中的 表單中的所有字段均處於有效狀態)。爲此, 對話API的用戶應該熟悉 DialogPane.lookupButton(ButtonType)方法。通過在ButtonType 傳遞(即已經在按鈕類型列表中設置),用戶將 返回的節點是典型的類型按鈕(但是這取決於 如果DialogPane.createButton(ButtonType)方法已經 覆蓋)。使用此按鈕,用戶可以添加一個事件過濾器,該按鈕在按鈕執行其常規事件處理之前調用該事件過濾器,因此用戶可以通過使用事件來阻止事件處理。這裏有一個 簡化的例子:

final Button btOk = (Button) dlg.getDialogPane().lookupButton(ButtonType.OK); 
btOk.addEventFilter(
    ActionEvent.ACTION, 
    event -> { 
     // Check whether some conditions are fulfilled 
     if (!validateAndStore()) { 
      // The conditions are not fulfilled so we consume the event 
      // to prevent the dialog to close 
      event.consume(); 
     } 
    } 
); 

換句話說,你應該事件過濾器添加到您的按鈕,消耗的情況下,要求都不能滿足的情況下,這將防止被關閉對話框。

更多詳情here

+0

什麼是validateAndStore()方法?它應該做什麼? –

+1

@EdvBeq這個方法不存在,它只是爲了展示這個想法。只有一種自定義方法可以驗證輸入數據,如果驗證成功,可能會執行其他操作。如果它返回true,則對話框將被關閉,否則事件將被消耗,使對話框保持打開狀態 –