【问题标题】:JDialog property changed behaviourJDialog 属性改变了行为
【发布时间】:2014-09-29 09:47:14
【问题描述】:

我已经实现了一个 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,或者确定PropertyChangedEvent 何时由重置JOptionPane 的值引起并防止if 发生?谢谢。

【问题讨论】:

    标签: java swing joptionpane jdialog propertychanged


    【解决方案1】:

    如果您可以禁用事件侦听器,您可以这样做:

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

    B) 从 optionPane 中移除事件监听器:

    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 的情况下,它需要无限期地保留。)
    • 剪辑完美,我不敢相信我没看到!
    猜你喜欢
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 1970-01-01
    • 2011-02-13
    • 2015-09-22
    • 1970-01-01
    相关资源
    最近更新 更多