JDialog属性改变了行为

时间:2014-09-29 09:47:14

标签: java swing joptionpane jdialog propertychanged

我已经实现了一个JDialog,它与this previous question中的顶部答案一致。代码完全不同于以下事实:当提供无效输入时,只有一个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,可以告诉第二个和不需要的PropertyChangedEvent是由代码行optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE)引起的;但是,此代码是必要的,以防止窗口在无效输入后锁定。有没有办法阻止JOptionPane.setValue()导致PropertyChangedEvent,或者通过重置JOptionPane的值来确定何时导致PropertyChangedEvent并阻止if出现?感谢。

1 个答案:

答案 0 :(得分:1)

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

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

B)从optionPane:

中删除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);
}