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

时间:2017-05-24 02:35:31

标签: java user-interface javafx javafx-8

我相信我在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

我很困惑 - 为什么会发生这种情况,我该怎样做才能绕过它呢?

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

2 个答案:

答案 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事件处理程序更改为什么都不做。工作就像一个魅力。