2016-08-01 29 views
5

現在、JavaFXを使用してダイアログを作成しています。 Dialog自体は非常にうまくいきましたが、今はテキストフィールドに記入するのを忘れたときにユーザーに警告する入力検証を追加しようとしています。 ここで私の質問が来る:ダイアログが結果コンバータの内部で閉じるのを防ぐことは可能ですか?このように: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コンバータ内部でスローされた場合、ダイアログが近いdosn'tことに気づいたが、これはこの問題を解決するための良い方法であるように思われません。

このように問題を解決できない場合は、this postに記載されているようにボタンを無効にすることができます。しかし、私はボタンを有効にしておき、メッセージを表示することを好むでしょう。

ありがとうございます!あなたが実際のJavadocで説明されるダイアログでデータ検証を管理することになっている方法

答えて

12

、私は引用:

ダイアログ検証/インターセプトボタンアクションいくつかの状況では

それがすることが望ましいですダイアログの一部が内部的に一貫するまでダイアログが閉じることを防ぎます(例えば、ダイアログ内の フォームはすべてのフィールドが有効な状態にあります)。これを行うには、 ダイアログ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を返す場合はダイアログが閉じられ、そうでない場合はダイアログが開いたままになるようにイベントが消費されます –