1

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 が提案するように「手動で」エラー メッセージを作成することで、クラッシュを回避できます。ただし、これにより、ウィンドウが閉じられた後にエラー メッセージが表示されます。それを防ぐ方法についてのアイデアはありますか?

4

1 に答える 1