Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何阻止JavaFX警报打开多个警报?_Java_User Interface_Javafx_Javafx 8 - Fatal编程技术网

如何阻止JavaFX警报打开多个警报?

如何阻止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;

我相信我在javafxapi中遇到了一个bug,但我不确定。因此,下面的代码段行为正常,但当我添加
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
事件,您的问题可能会消失。这是因为您使用了阻塞
警报
,该警报试图确保其父窗口可见。这可能导致组合框在仍处于
隐藏
状态时接收另一个隐藏请求。