我已经实现了一个 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/