2012-05-29 2 views
1

Metawidget을 사용하여 GUI의 객체 값을 자동으로보고 편집합니다. 개체의 초기 값을 바인딩하고 각각의 GUI 구성 요소에서 볼 수 있습니다. 그러나 GUI에서 값을 변경하면 이러한 변경 사항이 객체와 다시 동기화되지 않습니다. 이 내용은 다소 달라지며 here (비추천) 및 here (더 이상 사용되지 않음)입니다.Metawidget을 사용하여 GUI의 값과 객체 동기화

다음
public static class Person { 

    private String mName; 

    public String getName() { return this.mName; } 

    public void setName(String name) { this.mName = name; } 

    @UiAction 
    public void showPersonObject() { 
     JOptionPane.showMessageDialog(frame, this.mName);   
    } 

    @UiAction 
    public void bind() { 
     metawidget.getWidgetProcessor( 
      BeansBindingProcessor.class) 
       .save(metawidget); 
    } 
} 

이 metawidget가 구성되어 내 주요 방법입니다 : 여기

내 비즈니스 오브젝트 인 documentation에서

public static void main(String[] args) { 
    // Person 
    Person person = new Person(); 
    person.setName("A cool name"); 
    // Metawidget 
    metawidget = new SwingMetawidget(); 
    metawidget.setInspector(new CompositeInspector(
     new CompositeInspectorConfig().setInspectors(
      new PropertyTypeInspector(), 
      new MetawidgetAnnotationInspector(), 
      new BeanValidationInspector()))); 
    metawidget.addWidgetProcessor( 
     new BeansBindingProcessor(
      new BeansBindingProcessorConfig().setUpdateStrategy(
       UpdateStrategy.READ_WRITE))); 
    metawidget.setToInspect(person); 
    // Create Frame 
    ... 
} 

그것이 말했다되는 :

하는 경우 READ 또는 READ_WRITE로 설정된 경우 (기본값은 READ_ONCE 임) 검사중인 객체 은 Pr opertyChangeSupport. READ_WRITE로 설정하면 UI 업데이트가 자동으로 다른 클라이언트가 수동으로 호출해야합니다, 다시 setToInspect에 동기화 (sync) 저장 :

myMetawidget.getWidgetProcessor (BeansBindingProcessor.class) .save (myMetawidget를)

UpdateStrategy을 READ 및/또는 READ_WRITE로 설정하거나 BeansBindingProcessor에서 save()를 호출 해 보았습니다. 오브젝트 항상 그러나

private final PropertyChangeSupport pcs = new PropertyChangeSupport(this); 

public void addPropertyChangeListener(PropertyChangeListener listener) { 
    this.pcs.addPropertyChangeListener(listener); 
} 

public void removePropertyChangeListener(PropertyChangeListener listener) { 
    this.pcs.removePropertyChangeListener(listener); 
} 

public void setName(String name) { 
    String oldName = this.mName; 
    this.mName = name; 
    this.pcs.firePropertyChange("name", oldName, mName); 
} 

담당자 : 나는 또한 다음 코드를 추가하는 것과 동일하다, (나는 this과의 다스 려 생각)을 사람 객체에 의해 PropertyChangeSupport를 제공하기 위해 노력했습니다 원래 값을 유지합니다.

미리 감사드립니다.

답변

2

글쎄, 나는이 문제를 해결했다. beansbinding.jar의 "rogue"버전이 인터넷에 있습니다. 그래서 바인딩이 작동하지 않습니다. Metawidget 예제와 함께 배포 된 버전을 사용했는데 이제는 모든 것이 잘 작동합니다.

이 문제는 here으로보고되었습니다.

1

BeansBinding의 '불량'버전과 관련하여 혼란스럽게해서 죄송합니다. Metawidget 문서를 업데이트하여 앞으로 다른 사람들을위한 좌절감을 덜어줍니다.