Свойство JDialog изменило поведение
Я реализовал JDialog, который соответствует главному ответу из предыдущего вопроса. Код работает совершенно отдельно от того факта, что когда предоставляется неверный ввод, два 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
происходящий? Благодарю.
1 ответ
Если вы можете отключить прослушиватель событий, вы можете сделать это:
A) установить (логический) флаг в объекте PropertyChangeListener
или же
Б) удалить список событий из 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);
}