java - JDialog 属性改变了行为

标签 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 发生?谢谢。

最佳答案

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

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

B) 从选项 Pane 中删除事件监听器:

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);
}

关于java - JDialog 属性改变了行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26096978/

相关文章:

java - Android - Canvas.drawBitmap 在某些设备上无法正常工作

java - 对我的代码进行测试并收到意外的答案

java - 在网格 jpanel 中复制元素

java - JFrame 仅在调整大小时更新

java - 如何仅使用是/否选项调用 JOptionPane?

java - JoptionPane 验证遇到问题

java - 强制 JAXB 将空元素解释为 Null 而不是空字符串

java - 在 java 应用程序中具有分层特性的组件?

java - 使用 ActionListener 添加新元素

java - 第二个 JOptionPane 位于所有程序后面