【问题标题】:How to stop JavaFX Alert from opening multiple alerts?如何阻止 JavaFX Alert 打开多个警报?
【发布时间】:2017-05-24 02:35:31
【问题描述】:

我相信我在 JavaFX API 中遇到了一个错误,但我不确定。所以下面的 sn-p 行为正常,但是当我添加一个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 的输出:

哈哈
0:是的
计数器:1
输入:真

这里包含它(错误):

哈哈
哈哈
哈哈
0:是的
计数器:1
输入:真
1:假
计数器:1
输入:真
2:是的
计数器:1
输入:真

我很困惑——为什么会发生这种情况,我能做些什么来解决它?

顺便说一句,目标是防止用户选择等于或早于当天的日期。

【问题讨论】:

    标签: java user-interface javafx javafx-8


    【解决方案1】:

    日期选择器会创建一个弹出窗口,您的提醒也是一个弹出窗口。

    最可能的原因(我不能确定,因为我不知道datePickerOnHiding() 是如何被调用的)是这两个弹出窗口处于竞争状态。当您尝试显示警报时,您触发了datePickerOnHiding(),因为它再次尝试隐藏。

    如果您想阻止用户选择无效值,您需要在日期选择器弹出窗口已经关闭(即隐藏)之后触发此方法。

    【讨论】:

    • 我可以确认这不仅限于日期选择器。在结束活动期间使用警报时我遇到了同样的问题。这一次,我拖着 Alert 到处寻找它后面的另一个。很好奇,我很确定这是一个 API 错误。
    • 等等,我将撤销该声明。事实证明,在关闭事件侦听器中关闭警报对话后,焦点转移了。对于一个注意力不集中的听众,我有一个非常相似的对话,因此我认为它们是相同的。更改关闭侦听器 Alert 的 AlertType 后,我意识到自己的错误。
    • @PujitM 实际上,我对您所说的内容感到很困惑。据我所知,如果您使用onHidden 事件而不是onHiding 事件,您的问题可能会消失。这是因为您使用了阻止 Alert 并且该警报正试图确保其父窗口可见。这可能导致组合框在仍处于hiding 状态时收到另一个隐藏请求。
    【解决方案2】:

    Jai 的回答很有帮助,但我只是禁用了不想使用 DayCells 的日子。

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

    我用的是第一个。

    编辑:我找出了导致重复的原因。

    在关闭事件侦听器中关闭警报对话框后,焦点在场景中移动。对于失去焦点的听众,我有一个类似的(阅读:相同的)对话(它们在相同的条件下触发),因此尽管起源不同,但对话似乎是相同的。从本质上讲,焦点一直在具有焦点侦听器的节​​点之间来回摆动,从而导致针对一个错误的大量警报弹出窗口。

    更改关闭监听器 Alert 的 AlertType 后,我意识到自己的错误。

    简单修复 - 我创建了一个 externalRequest 布尔标志,如果 externalRequest 标志为真,我将 focusListener 事件处理程序更改为什么都不做。像魅力一样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-01
      • 1970-01-01
      相关资源
      最近更新 更多