我已經實現了一個JDialog,它沿着this previous question中的頂級答案的行。該代碼的工作原理完全不同於以下事實:當提供無效輸入時,只有一個需要時會發生兩個PropertyChangedEvents
。這導致下面的SSCCE的配方:JDialog屬性更改了行爲
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
發生?謝謝。
目前我正在使用類似於A的解決方法,從而切換布爾型;然而這看起來像是一個狡猾的解決方案。不幸的是,我不能刪除監聽器,因爲我希望JDialog保持在屏幕上,並且可點擊,直到提供有效的輸入(或者在提供的SSCCE的情況下,它需要保持不變)。 – Hungry 2014-09-29 10:54:41
編輯是完美的,我不相信我沒看見它! – Hungry 2014-09-29 11:59:14