2014-09-29 8 views
1

this previous question에 표시된 맨 위로 대답의 줄을 따라 JDialog를 구현했습니다. 이 코드는 유효하지 않은 입력이 제공 될 때 하나만 원할 때 두 개의 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에서, 제 2, 및 원치 않는 PropertyChangedEvent 코드 optionPane.setValue(JOptionPane.UNINITIALIZED_VALUE)의 라인에 의해 발생되는 것을 알 수있다; 그러나이 코드는 잘못된 입력 후에 창 잠금을 방지하는 데 필요합니다. JOptionPane.setValue()PropertyChangedEvent을 발생시키지 못하게하거나 PropertyChangedEvent이 JOptionPane의 값을 재설정하여 야기 된 것을 확인하고 if이 발생하지 않도록하는 방법이 있습니까? 감사.

답변

1

는 이벤트 리스너를 사용하지 않도록하는 것이 가능하다면, 당신은 그것을 할 수 있습니다 :

A)

또는

B)를 제거 PropertyChangeListener에 개체에 (부울) 플래그를 설정 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와 비슷한 해결 방법을 사용하고 있습니다. 그러나 이것은 약간의 dodgy 솔루션처럼 보입니다. 유감스럽게도 JDialog를 유효한 입력이 제공 될 때까지 (또는 제공된 SSCCE의 경우에는 무한대로 유지해야 함) JDialog를 화면에 유지하고 클릭 할 수있게하려는 경우 리스너를 제거 할 수 없습니다. – Hungry

+0

편집이 완벽합니다. , 나는 그것을 보지 못했다고 나는 믿을 수 없다! – Hungry