Java JDialog属性已更改行为

Java JDialog属性已更改行为,java,swing,joptionpane,jdialog,propertychanged,Java,Swing,Joptionpane,Jdialog,Propertychanged,我已经实现了一个JDialog,它与在中看到的顶级答案类似。代码的工作原理与以下事实完全不同:当提供无效输入时,当只需要一个时,就会出现两个PropertyChangedEvents。这导致了以下SSCCE的制定: import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import javax.swing.*; public class Test{ public Test()

我已经实现了一个JDialog,它与在中看到的顶级答案类似。代码的工作原理与以下事实完全不同:当提供无效输入时,当只需要一个时,就会出现两个
PropertyChangedEvents
。这导致了以下SSCCE的制定:

import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.*;

public class Test{  
    public Test(){
        JOptionPane optionPane = new JOptionPane(null, JOptionPane.OK_CANCEL_OPTION);

        final JDialog dialog = new JDialog(new JFrame(), "Test", true);
        dialog.setContentPane(optionPane);

        optionPane.addPropertyChangeListener(new PropertyChangeListener() {
            public void propertyChange(PropertyChangeEvent e) {
                String prop = e.getPropertyName();

                if (dialog.isVisible() && (e.getSource() == optionPane) && (JOptionPane.VALUE_PROPERTY.equals(prop))){
                    java.lang.System.out.println("Code Reached");
                    optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE);
                }
            }
        });
        dialog.pack();
        dialog.setVisible(true);
    }

    public static void main(String[] args){
        new Test();
    }
}

从这个SSCCE,可以看出第二个不需要的属性更改是由代码行optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE)引起的;但是,为了防止无效输入后车窗锁定,此代码是必需的。有没有办法防止
JOptionPane.setValue()
导致
PropertyChangedEvent
,或者确定何时通过重置JOptionPane的值导致
PropertyChangedEvent
并防止
if
发生?谢谢。

如果您可以禁用事件侦听器,可以通过以下方式执行:

A) 在PropertyChangeListener对象中设置(布尔)标志

B) 从选项窗格中删除eventlistener:

final PropertyChangeListener pcl = new PropertyChangeListener() {
    public void propertyChange(PropertyChangeEvent e) {
        String prop = e.getPropertyName();

        if (dialog.isVisible() && (e.getSource() == optionPane) && (JOptionPane.VALUE_PROPERTY.equals(prop))){
            java.lang.System.out.println("Code Reached");
            optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE);

            optionPane.removePropertyChangeListener(pcl);
        }
    }
}
optionPane.addPropertyChangeListener(pcl);
但是,这取决于对话框的用途。如果关闭对话框,则选项B是好的

编辑:

第二个事件是由
optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE)
引起的,因此如果您对照该值进行检查,它可能会工作

if (dialog.isVisible() 
        && e.getSource() == optionPane 
        && JOptionPane.VALUE_PROPERTY.equals(prop)
        && !optionPane.getValue().equals(JOptionPane.UNINITIALIZED_VALUE)){

    java.lang.System.out.println("Code Reached");
    optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE);
}

目前,我正在使用一种类似于a的变通方法,通过这种方法,我可以切换布尔值;然而,这似乎是一个有点狡猾的解决方案。不幸的是,我不能仅仅删除侦听器,因为我希望JDialog保持在屏幕上,并且可以单击,直到提供了有效的输入(或者对于提供的SSCCE,它需要保持不确定)。编辑是完美的,我不敢相信我没有看到它!