2011-08-16 3 views
1

Bean 속성에 바인딩 된 텍스트 필드로 Netbeans 양식을 설정했습니다. 바인딩은 양방향으로되어 있지만 단방향으로 만 작동합니다. GUI의 필드를 갱신하면 Bean이 갱신되지만 Bean이 갱신되면 GUI가 갱신되지 않습니다.Netbeans Bound Field가 GUI를 업데이트하지 않습니다.

Netbeans에 코드가 각 속성에 대해 다음과 같습니다 생성 :

binding=org.jdesktop.beansbinding.Bindings.createAutoBinding(
    org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, crmmast1, 
    org.jdesktop.beansbinding.ELProperty.create("${fname}"), lname, 
    org.jdesktop.beansbinding.BeanProperty.create("text")); 

bindingGroup.addBinding(binding); 

내 콩 속성 변경 지원이 추가되었습니다 :

private PropertyChangeSupport changeSupport = new 
     PropertyChangeSupport(this);; 

    public void addPropertyChangeListener (PropertyChangeListener listener) { 
     changeSupport.addPropertyChangeListener(listener); 
    } 

    public void removePropertyChangeListener(
     PropertyChangeListener listener) {  
     changeSupport.removePropertyChangeListener(listener); 
    } 

    public void firePropertyChange (String propertyName, 
     Object old, Object newObj) { 
     changeSupport.firePropertyChange(propertyName, old, newObj); 
    } 

을 속성에 대한 정 내에서 내가 가진 :

public void setFname(String newName) { 
    firePropertyChange("fname", fname, newName); 
    this.fname = newName; 
} 

기본 bean을 업데이트 할 때 bean은 업데이트되지만 텍스트 필드는 업데이트되지 않습니다 (심지어 속성 변경 이벤트가 발생하고 있음을 확인했지만

답변

4

같은 문제가 있습니다. 정말 짜증나. 자동 바인딩에 대해 뭔가 깨닫는 데 오랜 시간이 걸렸습니다. createAutoBinding 호출에서 지정한 소스와 타겟 사이에 설정된 속성 컨텍스트 내의 동작을 수신하는 것으로 보입니다. 따라서 JTextField의 텍스트를 아무런 문제없이 bean 속성에 업데이트하면됩니다. 말하자면 똑같은 바인딩 '레일'에 있습니다.

이것은 JFileChooser를 사용하는 것처럼 다른 소스에서 직접 setX() 호출을 통해 JavaBean을 업데이트하려고 할 때 autobinding의 멤버는 firePropertyChange 메서드가 호출됩니다. 바인딩은 마지막 매개 변수로 배치됩니다 여기에 부착 된 '이름'을 가지고 있는지 확인, 내가 대신 한 것은 그래서

myBean1.setFileLocation(fileChooser.getSelectedFile().getAbsolutePath()); 

을 대신의 호출을 수행 :

이 작동하지 않는 일 createAutoBinding() 호출에서. 나는 Netbeans Matisse 속성 편집기에서 고급 탭의 팝업 도구 바인드에서이 작업을 수행했습니다. 아래 예제에서는 "fileLocation"이라는 이름을 사용합니다.

binding = org.jdesktop.beansbinding.Bindings.createAutoBinding(
org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.READ_WRITE, 
myBean1, 
org.jdesktop.beansbinding.ELProperty.create("${fileLocation}"), 
jTextField12, 
org.jdesktop.beansbinding.BeanProperty.create("text"), 
"fileLocation"); 
bindingGroup.addBinding(binding); 

JTextField의 내 선택한 파일로 업데이트 할 수 있도록 바인딩 '레일'에 저를 얻었다 호출은 다음과 같이 보았다 :

  Binding fileBind = bindingGroup.getBinding("fileLocation"); 
      Property fileProp = fileBind.getSourceProperty(); 
      fileProp.setValue(myBean1, fileChooser.getSelectedFile().getAbsolutePath()); 

내가 getBinding와이를 당겨했다() 및 MatSource가 원래 바인딩에 대한 직접 액세스를 잠그기 때문에 전역 바인딩 그룹에서 getSourceProperty()를 호출하면 코드가 자동 생성되므로 편집하지 않아도됩니다. 코드를 직접 편집하는 경우 Property 객체에 직접 액세스 할 수있는 이름을 사용할 수 있습니다.

"외부 영향 요인"이 Bean 및 JTextField에서 작업하는 데 필요한 키는 바인딩 속성 자체에서 변경 작업을 수행하는 것입니다.

+0

올바른 접근 방법은 원숭이의 대답을 참조하십시오. 속성 변경을 시작하기 전에 먼저 bean에 값을 설정해야합니다. –

1

최근에 나는 netbeans와 스윙 GUI 제작을 시도하고 정확하게 똑같은 문제 (따라서 귀하의 게시물을 발견)에 대해 궁금 해서요.

해결책이 효과적입니다.

  1. 당신은 콩 변경 (귀하의 경우에 fname 확인을해야)
  2. 실제 빈 속성이 전파되면 올바른 prorperty 이름을 제공해야합니다 변경 될 : 명심해야 할 두 가지가있다 changeSupport.firePropertyChange이 호출되기 전에 참조 : http://wiki.netbeans.org/BestPracticesWithJPAAndBeansBinding

이 두 가지 사항을 준수하면 모든 것이 효과적입니다. 또한 JFileChooser를 사용하여 텍스트 필드를 변경 했으므로 바인딩의 속성을 수동으로 설정할 필요가 없습니다 (다른 답변에서 제안한 것처럼).

관련 문제