申し訳ありませんが、これを行う方法は2通りあります。最初は独自のjavafx.utils.ObservableList
を実装することです。以下の実装は、ModifiableObservableListBaseのドキュメント内に設けられた(わずかに修正)される。
public class ObservableArrayList<T> extends ModifiableObservableListBase<T> {
private final List<E> delegate = new ArrayList<>();
@Override
public E get(final int index) {
return delegate.get(index);
}
@Override
public int size() {
return delegate.size();
}
@Override
protected void doAdd(final int index, final E element) {
delegate.add(index, element);
}
@Override
protected E doSet(final int index, final E element) {
return delegate.set(index, element);
}
@Override
protected E doRemove(final int index) {
return delegate.remove(index);
}
}
JAXBは、次に実装リストタイプなど、バインディングに以下を追加することによって、このクラスを使用できるファイル:
<bindings node="//xsd:element[@name='Item']">
<property name="Items" collectionType="myNamespace.ObservableArrayList">
<baseType name="myNamespace.Item" />
</property>
</bindings>
2番目のオプションと、私が使用することを決めたのは、生成されたクラスを継承するカスタム実装クラスを使用するようにJAXB marshaller/unmarshallerを設定することです。 XSDは、 "ItemCollectionType"という名前の複合型を定義します。複合型は、 "Item"という名前の要素定義を含み、無制限のmaxOccurs
を含みます。それから私は、単にJAXBバインディングファイルに次の行を追加します。
<bindings node="./xsd:complexType[@name='ItemCollectionType']">
<class implClass="myNamespace.ItemCollection" />
</bindings>
<bindings node="//xsd:element[@name='Item']">
<property name="Items">
<baseType name="myNamespace.Item" />
</property>
</bindings>
上記力ItemCollectionType
のあらゆるのoccuranceを生成されたコードでタイプmyNamespace.ItemCollection
と交換します。その後、ItemCollectionType
の生成された実装は、次のコードが含まれています
@XmlElement(name = "Item", required = true, type = myNamespace.Item.class)
protected List<myNamespace.Item> items;
public List<myNamespace.Item> getItems() {
if (items == null) {
items = new ArrayList<myNamespace.Item>();
}
return this.items;
}
その後、私はmyNamespace.ItemCollection
でこのメソッドをオーバーライド:もちろん
@Override
public ObservableList<Item> getItems() {
if (!(super.getItems() instanceof ObservableList)) {
items = FXCollections.observableList(items);
}
return (ObservableList<Item>)items;
}
を、これら二つのオプションは相互に排他的ではありません。私は簡単に両方を実装することができ、簡単なキャストにmyNamespace.ItemCollection.getItems
の実装を単純化します。
FXCollections.observableArrayList()を試したことがありますか? Arraylistによってサポートされている新しい空の観測可能リストを作成します。 –
問題は、私がコードを書いていないということです。それはJAXBによって生成されます。私は、コードの型をインスタンス化することだけを伝えることができ、その型はデフォルトのコンストラクタを提供する必要があります。 –
自分で作ることはできますか?見つかった既存のものの1つを拡張し、新しいクラスにデフォルトのコンストラクタを提供します。 – mascoj