2017-05-24 1 views
0

私はJavaFX API内にバグがありましたが、わかりません。次のスニペットは正常に動作しますが、alert.show();またはalert.showAndWait();を追加すると、3つの異なるアラートダイアログが開きます。ここで、コードは次のとおりです。ここでJavaFX Alertが複数の警告を開くのを止める方法?

private void datePickerOnHiding(JFXDatePicker datePicker, JFXCheckBox chkBox) { 
     int counter = 0; 
     boolean entered = false; 

     if (datePicker.getValue().isBefore(LocalDate.now()) ||datePicker.getValue().isEqual(LocalDate.now())) { 
      if ((eventHiddenCounter % 2) == 0) { 
       System.out.println("HAHA");//Testing 
       txtfMessage.setVisible(true); 
       txtfMessage.setText("Please select a future date."); 
       Alert alert = new Alert(AlertType.WARNING, "Please select a future date."); 
       alert.showAndWait(); 
       datePicker.setValue(null); 

       counter ++; 
       entered = true; 
      } 
     } else { 
      txtfMessage.setVisible(false); 
      chkBox.setSelected(true); 
     } 

     //Testing 
     System.out.println("" + eventHiddenCounter + ": " + ((eventHiddenCounter % 2) == 0)); 
     System.out.println("COUNTER: " + counter + "\nENTERED: " + entered); 
     entered = false; 
     eventHiddenCounter ++; 
} 

がコメントアウトalert.showAndWaitとの出力に含まです:

HAHA
0:真
COUNTER:1
ENTERED:真

ここでは、含まれている(バグ):

HAHA
HAHA
HAHA
0:
真 COUNTER:入力された1
:真
1:
偽 COUNTER:入力された1
:真
2:真
COUNTER: 1
ENTERED:true

私はかなり困惑しています - なぜこれが起こっているのですか?それを回避するには何ができますか?

ちなみに、目標は、現在の日付と同じかそれより前の日付をユーザーが選択しないようにすることです。

答えて

0

私はDayCellsを使用したくない日を無効にしました。

参照:
http://o7planning.org/en/11085/javafx-datepicker-tutorial
javafx datepicker how to customize

私は最初のものを使用しました。

編集:繰り返しを引き起こしていたものがわかりました。

終了イベントリスナーでアラートダイアログが閉じられた後、シーンにフォーカスが移動します。私はフォーカスが失われたリスナー(同じ条件のもとで発射される)のための同様の(読んでも同じ)対話を持っているので、対話は起源が異なるにもかかわらず同じように見えた。本質的に、フォーカスはフォーカスリスナーを使用してノードとの間で振動し続け、1つのエラーに対して多数の警告ポップアップが発生しました。

閉じるリスナーアラートのアラートタイプを変更した後で間違いを認識しました。

シンプルな修正 - 私はexternalRequestブール型フラグを作成し、イベントハンドラを変更して、externalRequestフラグがtrueの場合は何もしません。魅力のように働いた。

0

日付選択ツールがポップアップを作成し、アラートもポップアップウィンドウです。

最も可能性が高い理由は(私は何も考えていないので確信が持てません)datePickerOnHiding()が呼び出されているかどうかは分かりませんが、2つのポップアップに競合状態があります。アラートを表示しようとすると、再度非表示にしようとしているため、datePickerOnHiding()がトリガーされています。

ユーザーが無効な値を選択しないようにするには、の後にこのメソッドをトリガーする必要があります。これは、日付ピッカーのポップアップが既に閉じられているためです。

+0

これは、日付ピッカーに限定されないことを確認できます。私は、閉鎖イベント中にアラートを使用するときに同じ問題を抱えています。今回は、Alertをドラッグして、その背後にある別の権利を見つけました。不思議なことに、私はこれがAPIバグだと確信しています。 – PujitM

+0

私はその声明を取り消すでしょう。 終了イベントリスナーでアラートダイアログが閉じられた後、フォーカスが移動しました。私はフォーカスが失われたリスナーのために非常に似たような対話をしているので、彼らは同じだと思いました。 閉じるリスナーアラートのアラートタイプを変更した後に間違いを認識しました。 – PujitM

+0

@PujitM私は実際にあなたが話していたものをかなり失ってしまった。私が知る限り、 'onHiding'イベントの代わりに' onHidden'イベントを使用すると、おそらく問題はなくなります。これは、あなたが 'Alert'をブロックしていて、その警告が親ウィンドウが見えるようにしようとしているからです。これはおそらく、コンボボックスがまだ隠れている間に別のリクエストを隠すことを引き起こしたでしょう。 – Jai

関連する問題