2012-03-16 18 views
1

私はフォームで表示/更新したい単純なPOJOクラスを持っています
BeanItemクラスとコンポーネントデータのバインディングを使用して、データクラスであってもよい。しかし、私はトウ関連の属性の壁にヒットしました:ネストされたbean:オブジェクトの中のコレクション

私のクラスは、オブジェクト 'AppStatus'のリストとして利用可能なステータスのセットを持っています。それはまた、現在のステータス、すなわち「利用可能」リストのステータスの1つを所有しています。

私はコンボボックスとしてフォームにリストを表示したいと思います。現在のステータスが選択されています。

私は '利用可能'属性をコンボボックスに関連付けることができましたが、データソース(メソッドsetItemDataSource)の設定時にこのコンボボックスを埋めることができないようです。私はどのように私のアイテムからavalaibleステータスリストと現在のステータスを取得するのですか?

私はいつも回避策を使用してBeanItemに加えてソースオブジェクトを取得するためのパラメータをメソッドに追加できますが、Itemプロパティで自分の属性を与えることができる場合はこれを避けることをお勧めします。

よろしく

編集:fieldfactoryのcreateFieldに、エリックR.形態の拡張で

class Status { 
    String id; 
    Sting label 
+ setter /getter 
} 

class App { 
    String AppId; 
    String AppLabel 
    ArrayList<Status> availablestatus; 
    Status currentStatus 
+setter/getter 
} 

のコードと、exemple短縮iを加え、次の行

if ("status".equals(propertyId)) { 
// create the combobox 
    ComboBox status = new ComboBox(
     texts.getString("application.label.status")); 
    status.setItemCaptionMode(AbstractSelect.ITEM_CAPTION_MODE_PROPERTY); 
    status.setItemCaptionPropertyId("label"); 
    status.setImmediate(true); 
    status.setNullSelectionAllowed(false); 

    IndexedContainer container = new IndexedContainer(
     (Collection<ApplicationStatus>) item.getItemProperty(
     "availableStatus").getValue()); 

    status.setContainerDataSource(container); 
    status.setPropertyDataSource(item.getItemProperty("currentStatus")); 

    return status; 
} else... 

これは動作しませんでした、私はコンボボックスを取得しますが、行数は正しいですが、すべて空です。

私はコンボボックスで使用可能な値を持っているので、結果は、わずかに優れている代わりにIndexedContainer

BeanContainer<String, ApplicationStatus> container = 
     new BeanContainer<String, ApplicationStatus>(ApplicationStatus.class); 
    container.addAll((Collection<ApplicationStatus>) item 
      .getItemProperty("availableStatus"). 
    container.setBeanIdProperty("id"); 

のbeanContainerを使用しようとしました。 currentValueだけが選択されていません...

また、NestedBeanプロパティを使用してcurrentstatusのIDを取得しようとしましたが、結果はまだ有効ではありません...正しい値が選択されたコンボボックスが表示されますコンボボックスは読み込み専用なので、もう値が見えないのですか?(setReadOnly(false);でも)

答えて

1

私はこれを解決するための私の方法を提案します。私はこれが一番いい方法だとは思わないが、それは仕事だ。

beanItemクラスには、必要なものだけが含まれています。

私は単純なプロジェクトで、以下のなかった、それがうまくverry作品の:

  ComboBox status = new ComboBox("ComboBox"); 
    status.setImmediate(true); 
    status.setNullSelectionAllowed(false); 

    for(Status st : (Collection<Status>)item.getItemProperty("availableStatus").getValue()) { 
     status.addItem(st); 
     status.setItemCaption(st, st.getLabel()); 
    } 
    status.setPropertyDataSource(item.getItemProperty("currentStatus")); 

は、それが作品だと思います。

よろしくエリック

+0

コンボボックスの値を(少なくとも)得るこ​​とができましたが、 currentValueを選択してください(私の編集のように) –

+0

@PATRY私のコードを更新しました。 –

+0

ありがとうございました。これはかなりの時間私を困惑させている! infoについては、コンボボックスがこのプロパティのFieldFactoryのcreateFieldで作成されている場合、 "status.setpropetyDataSource ..."は不要です。自動的に行われるようです –

0

vaadin demo siteから、コンボボックスを国に記入する方法を示すサンプルを得ることができます。あなたは、私が(私は100%あなたの問題を理解していない)を推測するのと同じ操作を行うことができます:

myForm.setFormFieldFactory(new MyFormFieldFactory()); 

private class MyFormFieldFactory extends DefaultFieldFactory { 

     final ComboBox countries = new ComboBox("Country"); 

     public MyFormFieldFactory() { 
      countries.setWidth(COMMON_FIELD_WIDTH); 
      countries.setContainerDataSource(ExampleUtil.getISO3166Container()); 
      countries 
        .setItemCaptionPropertyId(ExampleUtil.iso3166_PROPERTY_NAME); 
      countries.setItemIconPropertyId(ExampleUtil.iso3166_PROPERTY_FLAG); 
      countries.setFilteringMode(ComboBox.FILTERINGMODE_STARTSWITH); 
     } 

     @Override 
     public Field createField(Item item, Object propertyId, 
       Component uiContext) { 
      Field f = (Field)item; 
      if ("countryCode".equals(propertyId)) { 
       // filtering ComboBox w/ country names 
       return countries; 
      } 
      return f; 
     } 
} 
+0

私はこのexempleを見ていたが、私の問題は、コンボボックスの内容は、それが事前に定義されていないということです。 beanItem(つまり、新しいフォームDataSource)を取得すると、comboxの可能な値も取得されます。 –

+0

MVCパターンを使用していますか?もしそうなら、モデルからこれを取得して、コンボボックスに項目を追加するイベントを取得したら、ビューを更新するようにしてください。 – Marthin

関連する問題