2012-08-23 3 views
0

JFace ComboViewer에 인덱싱 된 속성을 바인딩하고 싶습니다. 간단한 속성에 대한 코드를 결합인덱스 된 속성을 jface 뷰어에 바인딩하는 방법

class DataModel { 
    private String[] props = {"A","B","C"}; 
    private PropertyChangeSupport pcs = new PropertyChangeSupport(this); 

    public String getProperties(int idx){ 
     return props[idx]; 
    } 

    public void setProperties(int idx, String value){ 
     String oldVal = props[idx]; 
     props[idx] = value; 
     pcs.fireIndexedPropertyChange("properties", idx, oldVal, value); 
    } 

    // code to add/remove PropertyChangeListener 
    // ... 
} 

데이터 같을 것이다 :

내가 이런 DataModel이 클래스가 말할 수 있습니다

DataModel dataModel = ... 
ComboViewer propertyChoice = ... 

DataBindingContext ctx = new DataBindingContext(); 

IObservableValue target = ViewerProperties.singleSelection().observe(propertyChoice); 
IObservableValue model = BeanProperties.value(DataModel.class, "properties").observe(dataModel); 
ctx.bindValue(target, model); 

하지만 난 통보해야 인덱스 속성

index가 바인딩하려는 값인 ctx. 시도했습니다

IObservableValue model = BeanProperties.value(DataModel.class, "properties[0]").observe(dataModel); 

그러나 작동하지 않습니다.

단순 속성 대신 인덱싱 된 속성을 바인딩 할 수 있습니까? 방법?

답변

0

불행히도 이것은 지원되지 않는 것 같습니다. 나는 정확히 같은 기능을 찾고있었습니다. 지원되는 BeanProperties에는 설명서가 없습니다.

BeanProperties.value 구현을 살펴보면 BeanPropertyHelper에 위임하여 속성 읽기 및 쓰기를 수행 할 수 있습니다. Object readProperty(Object source, PropertyDescriptor propertyDescriptor) 메서드는 IndexedPropertyDescriptor라는 하위 클래스에 대해 알지 못합니다. 인덱싱 된 속성에 대해 호출되면 readProperty는 전체 배열을 읽는 read 메서드를 사용하려고합니다. 이 메서드는 인덱스 된 속성에 대해 선택적이라고 생각합니다. 인덱싱 된 속성의 경우 IndexedPropertyDescriptor.getIndexedReadMethod()를 사용해야합니다.

사용 사례에 따라 BeanProperties.list를 사용하여 문제를 해결할 수도 있습니다. 그러나 이것을 인덱싱 된 속성과 함께 사용할 수는 없습니다. 나는 전체 배열을 반환하지만 여전히 "fireIndexedPropertyChange"를 수행하는 메서드를 유지하는 메서드를 추가하여이 작업을 시도했습니다. 불행히도 이것은 ClassCastException을 제공합니다 : Eclipse의 BeanListProperty는 change 이벤트의 값이 배열 또는 목록이라고 가정하는 것 같습니다. 그러나 인덱스 된 속성의 경우 배열의 단일 요소입니다.

아니면 관측 가능 맵을 대신 사용할 수 있습니까?

관련 문제