0

インデックス付きプロパティをJFaceComboViewerにバインドしたいと思います。

次のようなDataModelクラスがあるとしましょう。

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 = ...
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 ); 

しかし、インデックス付きのプロパティでは、バインドする値がどのインデックスであるかをctxに通知する必要があります。私が試してみました

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

しかし、それは機能しません。

単純なプロパティの代わりにインデックス付きプロパティをバインドすることは可能ですか?どのように?

4

1 に答える 1

0

残念ながら、これはサポートされていないようです。まったく同じ機能を探していました。BeanPropertiesには、サポートされていることを示すドキュメントはありません。

BeanProperties.valueの実装を調べると、プロパティの読み取りと書き込みをBeanPropertyHelperに委任していることがわかります。このメソッドObject readProperty(Object source, PropertyDescriptor propertyDescriptor)は、サブクラスIndexedPropertyDescriptorを認識していません。インデックス付きプロパティに対して呼び出されると、readPropertyは配列全体を読み取るreadメソッドを使用しようとします。このメソッドは、インデックス付きプロパティではオプションだと思います。インデックス付きプロパティの場合は、IndexedPropertyDescriptor.getIndexedReadMethod()を使用する必要があります。

ユースケースによっては、BeanProperties.listを使用して問題を回避できる場合があります。ただし、これをインデックス付きプロパティと組み合わせて使用​​することはできません。配列全体を返すメソッドを追加し、「fireIndexedPropertyChange」を実行するメソッドを保持してこれを試しました。残念ながら、これによりClassCastExceptionが発生します。EclipseのBeanListPropertyは、changeイベントの値が配列またはリストであると想定しているようです。ただし、インデックス付きプロパティの場合、これは配列の単一要素です。

または、代わりに観測可能なマップを使用できますか?

于 2012-08-28T09:07:41.017 に答える