SWT では、既存の (インスタンス化された) コンポジットをいくつか組み合わせたコンポジットを作成しようとしています。悲しいことに、SWT API ではそれが許可されていません。親 (コンポジットが描画される場所) をコンストラクターに渡す必要があるからです。
私が達成しようとしていることと私の問題を(うまくいけば)示す小さな例を作成しました:
複合
public class Composite {
public Composite(Composite parent, ...) {
// this composite will be drawn on parent
// ...
}
// ...
}
コンポジット コンポジット
public class ComposedComposite extends Composite {
// Note that there are composed composites with more than one child
public ComposedComposite(Composite parent, Composite child) {
super(parent);
// child is used as content for some control
// ...
}
// ...
}
物事が構成される場所
// ...
// This is how I would prefer to compose things
ChildComposite child = new ChildComposite(...); // zonk parent is not available yet
ComposedComposite composed = new ComposedComposite(..., child); // again parent is not available yet
MainComposite main = new MainComposite(parent, composed); // The overall parent is set from outside
// ...
こんにちはベン
-- 問題の詳細を編集して追加
これが私が本当に達成したいことです:
同じ TabItems をホストするメイン ウィンドウがあります。各 TabItem にはレイアウトがあり、モデルのさまざまなデータを表します。これで、別のコントロール (コンテナー) に合成したいいくつかのコントロールを作成しました。コンテナには次のレイアウトがあります。
+-------------+---------------------------+
| | B |
| | |
| A +---------------------------+
| | C |
| | |
+-------------+---------------------------+
3 つの TabItems のレイアウトは同じです (上のコンテナー)。そして、これら 3 つすべてが 1 つのコントロールを共有します (これはすべてのタブで必要なためです)。
だから私が少なくともやりたいのはこれです:
SharedComposite shared = new SharedComposite(...);
shared.registerListener(this);
SomeOtherComposite comp1 = new SomeOtherComposite(...);
comp1.registerListener(this);
// ... couple of them
// know compose the controls
Container container = new Container(...);
container.setA(shared); // instead of this setters the composites may be given in the ctor
container.setB(comp1);
container.setC(comp2);
addTabItem(container);
Container container2 = new Container(shared, comp3, comp4); // other way
addTabItem(container2);
したがって、指定された回答 (setParent) を使用して、同様のことができます。残念ながら、複数のタブでコンポジットを再利用することはまだできません。しかし、SWT ではそれは不可能に思えるので、setParent を使用するのが最善の方法のようです。
助けてくれてありがとう!