2013-09-26 5 views
0

JGoodies 바인딩 2.9.1을 사용하여 의 enabled 속성을 열거 속성에 바인딩하려고합니다. 이 일방 통행 작업을 원합니다. 속성이 변경되면 JTextField을 사용하거나 사용하지 않도록 설정하고 싶지만 다른 방법으로 이동하여 enabled 값을 기반으로 열거 형 속성을 설정하지 않으십시오.JGoodies 바인딩을 사용하는 읽기 전용 바인딩 및 단방향 변환기

모든 것을 제대로 설정했다고 생각하지만 PropertyAccessException이 발생합니다. 적응 된 Java Bean 속성을 설정하지 못했습니다..

내 모델은 표준 Java Bean은 속성 변경 이벤트를 함께 :

private final class EnumMatchToEnabledConverter implements BindingConverter<MyEnum, Boolean> { 
    private MyEnum match; 

    public EnumMatchToEnabledConverter (MyEnum match) { 
     this.match = match; 
    } 

    @Override 
    public Boolean targetValue(MyEnum source) { 
     return (source == match); 
    } 

    @Override 
    public MyEnum sourceValue(Boolean target) { 
     // this wouldn't make sense 
     throw new UnsupportedOperationException(); 
    } 
} 
:

내보기에서
public static String MY_PROPERTY = "myProperty"; 
private MyEnum myProperty; 

public MyEnum getMyProperty() { return myProperty; } 

public void setMyProperty(final MyEnum newValue) { 
    final MyEnum oldValue = myProperty; 
    if (newValue == oldValue) { return; } 
    myProperty = newValue; 
    changeSupport.firePropertyChange(MY_PROPERTY, oldValue, newValue); 
} 

바운드 값이 제공된 값과 일치 할 때 나는 true를 돌려줍니다 단방향 변환이 놀랍게도

PresentationModel<MyModel> pm = new PresentationModel<MyModel>(model); 
Bindings.bind(
    myTextField, "enabled", new ConverterValueModel(
     pm.getModel(MyModel.MY_PROPERTY), 
     new EnumMatchToEnabledConverter(MyEnum.MyValue))); 

,:

는 그럼 난 바인딩 설정의 sourceValue() 메서드가 호출되면 UnsupportedOperationException이 발생하기 때문에 바인딩에서 PropertyAccessException이 나옵니다.

또한 명시 적으로는 세터를 사용하지 않는 바인딩 말하는 시도,하지만, 난 여전히 같은 문제가있어 : 내가 잘못

Bindings.bind(
    myTextField, "enabled", new ConverterValueModel(
     pm.getModel(MyModel.MY_PROPERTY, "getMyProperty", null), // null setter! 
     new EnumMatchToEnabledConverter(MyEnum.MyValue))); 

을 가고 있습니까?

+0

누군가가이 일을 성공적이었던 것으로 나타납니다 http://stackoverflow.com/questions/5948147/how-can-i-bind-a-property-eg-an-enum-to-a- 구성 요소 - of-a-different –

답변

0

해결 방법이 있습니다. 못생긴지만 작동합니다.

나는을 ValueModel 트리거가 트리거하지 않는 BufferedValueModel으로 감 쌉니다. 다른

Bindings.bind(
    myTextField, 
    "enabled", 
    new BufferedValueModel(
     new ConverterValueModel(
      pm.getModel(MyModel.MY_PROPERTY), 
      new EnumMatchToEnabledConverter(MyEnum.MyValue)), 
     new AbstractValueModel() { 
      @Override public Object getValue() { return null; } 
      @Override public void setValue(Object o) {} 
     }));