2011-02-11 6 views
0

이 문제를 직접 해결하는 방법을 모르는 경우가 조금 있습니다. 지금까지 웹 프로그래밍 이외의 다른 작업을 수행 한 적이 한 번도 없었지만 Java에 대한 경험이 얼마 남지 않았습니다. 자바와.Java의 기본 리스너 동작에 문제가 있습니다.

마법사를 만들고 창에 표시된 필드 만들기를 일반화하려고합니다. 따라서 실제 컴포넌트 인 JTextField를 직접 제어 할 수는 없지만 미세한 세부 사항을 처리하는 래퍼 클래스는 필요합니다. 그러나 값이 변경된시기를 알고 싶습니다. 그래서 JTextField 자체에 VetoableChangeListener를 등록 할 수있는 "addVetoableChangeListener"메서드를 추가했습니다.

메서드가 호출되고 디버그의 JTextField에 수신기가 전달되는지 확인했습니다. 그러나 아무 것도 호출되지 않습니다. 예외는 발생하지 않고 인터페이스 VetoableChangeListener를 구현하는 메서드 내 내 중단 점은 호출되지 않습니다.

내가 얻지 못하는 것이 있습니까? 청취자가 올바르게 작동하기 전에 청취자가 일종의 구성 요소 여야합니까? 아니면 단순히 인터페이스를 구현해야합니까? 아마 나는 너무 오랫동안 집중 해 왔기 때문에 분명한 오류가 간과 될 것입니다. 그리고 저는 여러분 중 한 분에게 그것이 분명해지기를 희망합니다. 내가 시도하고있는 무슨의 간단한 버전은 : 제약 속성이 JTextField의에서 변경되는 경우

public class TomcatConfigPanel extends WizardKeyValuePanel implements VetoableChangeListener { 
     protected void initPanel(JPanel mainPanel) { 
      addField("port", "8080"); 

      IWizardField portField = getField("port"); 
      portField.addVetoableChangeListener(this); 
     } 

     public void vetoableChange(PropertyChangeEvent evt) 
      throws PropertyVetoException { 
      // Stuff that would drive you Lovecraft insane if you saw what was written here 
     }   
    } 

    public class WizardTextField implements IWizardField { 
     private JLabel label; 
     private JTextField field; 

     public WizardTextField() { 
     // some initialization stuff ... 
     } 

     public void addVetoableChangeListener(VetoableChangeListener listener) { 
     field.addVetoableChangeListener(listener); 
     } 
    } 
+1

더 나은 도움을 받으려면 SSCCE (http://pscode.org/sscce.html)를 게시하십시오. 'WizardTextField'와 같은 타사 클래스가 아닌 표준 J2SE 클래스를 사용하는 것이 중요합니다. –

+0

나는 WizardTextField를 제거 하겠지만, "field.addVetoableChangeListener"를 직접 호출하고 충분한 정보를 제공하지 못한다고 전화를 걸었습니다. 내가 아는 한 모두 그게 문제의 일부입니다. – Neil

+0

sscce에서 링크를 읽는다면, 문제를 설명하지 않으면 sscce가 아님을 알 수 있습니다. andrew가 제공하는 링크를 읽으십시오. –

답변

4

의 VetoableChangeListener 만 호출됩니다. 제약 된 속성은 setter 메서드가 PropertyVetoException 인 속성입니다. 따라서 코드가 JTextField에서 이와 같은 setter 메서드를 호출하지 않으면 리스너가 호출되지 않습니다. 자세한 내용은 http://download.oracle.com/javase/tutorial/javabeans/properties/constrained.html을 참조하십시오.

JTextField (및 모든 클래스 hirarchy) API 문서에서 제한된 속성을 찾을 수 없으므로 청취자를 호출 할 수 있을지 의심 스럽습니다.

+0

그건 절름발이예요. 결코 전화를받지 않으면 왜 그들은 청취자를 갖게 될까요? 귀하의 의견을 보내 주셔서 감사합니다. – Neil

+0

addVetoableChangeListener 메서드는 JComponent에 있습니다. 모든 Swing 컴퍼넌트의 기본 클래스에 배치 해, 제약을받는 프로퍼티 및 관련 지을 수 있었던 청취자를 많은 도움을주는 일없이 지원할 수 있도록 (듯이)합니다.하지만 JTextField에는 아무 것도 없습니다. 실제로 JInternalFrame은 표준 스윙 구성 요소에 제한적인 속성 만있는 것으로 보입니다. –

관련 문제