我相信我在JavaFX API中遇到了一个错误,但我不确定。因此,以下代码段正常运行,但是当我添加alert.show();
或alert.showAndWait();
时,程序会打开三个不同的警报对话框。这是代码:
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:true
这里包含它(错误):
HAHA
HAHA
HAHA
0:真实 COUNTER:1
ENTERED:真实的 1:假
COUNTER:1
ENTERED:真实的 2:真实 COUNTER:1
ENTERED:true
我很困惑 - 为什么会发生这种情况,我该怎样做才能绕过它呢?
顺便说一句,目标是阻止用户选择等于当天或之前的日期。
答案 0 :(得分:0)
日期选择器会创建一个弹出窗口,您的警报也是一个弹出窗口。
最可能的原因(我无法确定,因为我不知道如何调用datePickerOnHiding()
)是两个弹出窗口有竞争条件。当您尝试显示警报时,您正在触发datePickerOnHiding()
,因为它正在尝试再次隐藏。
如果您想阻止用户选择无效值,您需要在日期选择器弹出窗口已关闭(即隐藏)后触发此方法。
答案 1 :(得分:0)
Jai的回答很有帮助,但我只是禁用了我不想使用DayCells的日子。
请参阅:
http://o7planning.org/en/11085/javafx-datepicker-tutorial
javafx datepicker how to customize
我使用了第一个。
编辑:我找出导致重复的原因。
在关闭事件监听器中关闭警报对话框后,焦点在场景中移动。我有一个类似的(阅读:相同的)对话,一个焦点丢失的听众(他们在相同的条件下开火),所以对话似乎是相同的,尽管有不同的起源。从本质上讲,焦点一直与具有焦点侦听器的节点振荡,从而导致一个错误的多个警报弹出窗口。
我在更改结束侦听器警报的AlertType后意识到我的错误。
简单修复 - 我创建了一个externalRequest
布尔标志,如果focusListener
标志为真,我将externalRequest
事件处理程序更改为什么都不做。工作就像一个魅力。