JavaFX ステージで、フォーカスがテキストフィールドから離れたときにユーザー入力を検証したいと考えています。ユーザー入力が有効な年齢 (0 ~ 120) でない場合、ControlsFX ダイアログを使用したダイアログとエラー メッセージが表示されます。
コードは次のとおりです。
participantAgeTextField.focusedProperty()
.addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> ov,
Boolean oldPropertyValue, Boolean newPropertyValue)
{
if( !newPropertyValue ) { // lost focus
if( !participantAgeTextField.getText().isEmpty() ) {
if ( participantAgeTextField.getText().matches("^\\d+$")) {
int val = Integer.
parseInt(participantAgeTextField.getText());
if( val <= 0 ) {
val = 1;
} else if( val > 120 ) {
val = 120;
}
participantAgeTextField.setText(""+val);
} else {
participantAgeTextField.setText("");
Dialogs.create()
.owner(null)
.title("Error")
.masthead(null)
.message("You must enter a valid age!")
.showError();
}
}
}
}
});
ユーザーが無効な値を入力し、ウィンドウ (ステージ) の右上隅にある [X] ボタンをクリックしてウィンドウを閉じようとした場合を除いて、これは正常に機能します。
この場合、アプリケーションは「ハング」します。(奇妙なことに、Windows でのみ発生し、Linux では発生しません)。
フォーカスがウィンドウの「X」に変わったときにメッセージを表示しないなど、修正を探していました。しかし、これを検出する方法が見つかりませんでした。
これを修正する方法の他のアイデアは大歓迎です!
ヨリス
編集 おそらく ControlsFX がクラッシュを引き起こします。Javafx 8u25 を使用しているため、JavaFX ダイアログ (8u40 で導入) を使用できません。どんな代替案も歓迎します!
EDIT 2 ControlsFX ダイアログを使用せずに、DVarga が提案するように「手動で」エラー メッセージを作成することで、クラッシュを回避できます。ただし、これにより、ウィンドウが閉じられた後にエラー メッセージが表示されます。それを防ぐ方法についてのアイデアはありますか?