2017-05-24 4 views
0

Ich glaube, ich habe einen Fehler in der JavaFX API gefunden, aber ich bin mir nicht sicher. Das folgende Snippet verhält sich also normal, aber wenn ich ein alert.show(); oder alert.showAndWait(); hinzufüge, öffnet das Programm drei verschiedene Alarmdialoge. Hier ist der Code:Wie kann JavaFX Alert beim Öffnen mehrerer Alerts gestoppt werden?

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 ++; 
} 

Hier ist der Ausgang mit dem alert.showAndWait auf Kommentar:

HAHA
0: true
COUNTER: 1
ENTERED: true

es hier ist mit enthalten (der Fehler):

HAHA
HAHA
HAHA
0: true
COUNTER: 1
ENTERED: true
1: false
COUNTER: 1
ENTERED: true
2: true
COUNTER: 1
EINGEGEBEN: wahr

Ich bin ziemlich perplex - warum passiert das und was kann ich tun, um es zu umgehen?

Übrigens ist es das Ziel, zu verhindern, dass der Benutzer ein Datum gleich oder vor dem aktuellen Tag auswählt.

Antwort

0

Jais Antwort ist hilfreich, aber ich habe nur die Tage deaktiviert, die ich nicht mit DayCells verwenden wollte.

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

habe ich die erste.

Edit: Ich fand heraus, was die Wiederholung verursacht hat.

Der Fokus verschiebt sich in der Szene, nachdem der Alert-Dialog im Listener für schließende Ereignisse geschlossen wurde. Ich habe einen ähnlichen (lese: gleichen) Dialog für einen fokus-verlorenen Hörer (sie feuern unter den gleichen Bedingungen), so dass die Dialoge trotz unterschiedlicher Ursprünge gleich aussahen.Im Wesentlichen oszillierte der Fokus von und zu dem Knoten mit dem Fokus-Listener und verursachte zahlreiche Alarm-Popups für einen Fehler.

Ich erkannte meinen Fehler nach dem Ändern des AlertType des Schließen Listener Alert.

Einfache Lösung - ich machte eine externalRequest boolesche Flag, und ich änderte die focusListener Event-Handler, um nichts zu tun, wenn die externalRequest Flag wahr war. Lief wie am Schnürchen.

0

Die Datumsauswahl erstellt ein Popup und Ihre Warnung ist auch ein Popup-Fenster.

Der wahrscheinlichste Grund (ich nicht sicher sein kann, weil ich keine Ahnung, wie datePickerOnHiding() genannt wird) ist, dass die beiden Popups Racebedingung haben. Wenn Sie versuchen, die Warnung anzuzeigen, lösen Sie das datePickerOnHiding() aus, weil es versucht, sich erneut zu verbergen.

Wenn Sie den Benutzer davon abhalten möchten, ungültige Werte auszuwählen, müssen Sie diese Methode auslösen nach Das Popup-Fenster datepicker ist bereits geschlossen (d. H. Verborgen).

+0

Ich kann bestätigen, dass dies nicht auf Datumsauswahl beschränkt ist. Ich habe das gleiche Problem bei der Verwendung von Benachrichtigungen während einer Abschlussveranstaltung. Dieses Mal zog ich die Warnung herum, um ein anderes Recht dahinter zu finden. Neugierig, und ich bin mir ziemlich sicher, dass dies ein API-Bug an diesem Punkt ist. – PujitM

+0

Warten Ich werde diese Aussage aufheben. Es stellt sich heraus, dass sich der Fokus verschoben hat, nachdem der Alert-Dialog im Listener für abschließende Ereignisse geschlossen wurde. Ich habe einen sehr ähnlichen Dialog für einen Fokus-verlorenen Hörer, daher dachte ich, dass sie die gleichen wären. Ich erkannte meinen Fehler nach dem Ändern des AlertType des Schließen Listener Alert. – PujitM

+0

@PujitM Ich bin wirklich ziemlich verloren in dem, worüber du geredet hast. Soweit ich weiß, wäre Ihr Problem wahrscheinlich weg, wenn Sie das Ereignis "onHidden" anstelle des Ereignisses "onHiding" verwenden würden. Dies liegt daran, dass Sie eine blockierende "Warnung" verwendet haben und diese Warnung versucht, sicherzustellen, dass das übergeordnete Fenster sichtbar ist. Dies führte wahrscheinlich dazu, dass die Combobox eine weitere Anfrage zum Verstecken erhielt, während sie sich noch im "Versteck" -Zustand befand. – Jai

Verwandte Themen