如何阻止JavaFX警报打开多个警报?
我相信我在javafxapi中遇到了一个bug,但我不确定。因此,下面的代码段行为正常,但当我添加如何阻止JavaFX警报打开多个警报?,java,user-interface,javafx,javafx-8,Java,User Interface,Javafx,Javafx 8,我相信我在javafxapi中遇到了一个bug,但我不确定。因此,下面的代码段行为正常,但当我添加alert.show()时或警报。showAndWait(),程序将打开三个不同的警报对话框。代码如下: private void datePickerOnHiding(JFXDatePicker datePicker, JFXCheckBox chkBox) { int counter = 0; boolean entered = false;
alert.show()时代码>或警报。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 ++;
}
以下是注释掉的带有警报的输出。showAndWait
:
哈哈
0:正确
计数器:1
输入:正确
这里包括它(bug):
哈哈
哈哈
哈哈
0:正确
计数器:1
输入:真
1:错误
计数器:1
输入:真
2:正确
计数器:1
输入:正确
我很困惑——为什么会发生这种情况,我能做些什么来避免它
顺便说一下,目标是防止用户选择等于或早于当前日期的日期。日期选择器创建一个弹出窗口,您的警报也是一个弹出窗口
最可能的原因(我不能确定,因为我不知道如何调用datePickerOnHiding()
)是这两个弹出窗口有竞争条件。当您试图显示警报时,您正在触发日期选择器隐藏()
,因为它正试图再次隐藏
如果要阻止用户选择无效值,则需要在日期选择器弹出窗口关闭(即隐藏)后触发此方法。Jai的回答很有帮助,但我只是禁用了不希望使用DayCells的日期
请参阅:
我用了第一个
编辑:我找出了导致重复的原因。
在关闭事件侦听器中关闭警报对话后,场景中的焦点会发生移动。我有一个类似的(读:相同的)对话给一个失去焦点的听众(他们在相同的条件下开火),所以对话看起来是一样的,尽管有不同的起源。从本质上说,焦点与焦点侦听器在节点之间来回摆动,导致出现一个错误的大量警报弹出窗口
在更改关闭侦听器警报的警报类型后,我意识到我的错误
简单修复-我做了一个externalRequest
boolean标志,如果externalRequest
标志为true,我将focusListener
事件处理程序更改为不执行任何操作。工作很有魅力。我可以确认,这并不局限于约会挑选者。在结束活动期间使用警报时,我也遇到同样的问题。这一次,我把警报拖来拖去,想在它后面找到另一个警报。好奇,我很确定这是一个API错误。等等,我会撤销那个声明。事实证明,在关闭事件侦听器中关闭警报对话后,焦点发生了转移。我有一个非常相似的对话,是针对一个失去注意力的听众,因此我认为他们是一样的。在更改了关闭侦听器警报的警报类型后,我意识到了我的错误。@PujitM实际上,我对您所说的内容完全迷糊了。据我所知,如果您使用onHidden
事件而不是onHidden
事件,您的问题可能会消失。这是因为您使用了阻塞警报
,该警报试图确保其父窗口可见。这可能导致组合框在仍处于隐藏
状态时接收另一个隐藏请求。