2014-09-29 51 views
1

我已經實現了一個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發生?謝謝。

回答

1

如果有可能爲您禁用的事件監聽器,你可以通過做:

A)設置(布爾)標記中的PropertyChangeListener對象

B)刪除來自optionPane的eventlistener:

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

目前我正在使用類似於A的解決方法,從而切換布爾型;然而這看起來像是一個狡猾的解決方案。不幸的是,我不能刪除監聽器,因爲我希望JDialog保持在屏幕上,並且可點擊,直到提供有效的輸入(或者在提供的SSCCE的情況下,它需要保持不變)。 – Hungry 2014-09-29 10:54:41

+0

編輯是完美的,我不相信我沒看見它! – Hungry 2014-09-29 11:59:14