我已经创建了一个小例子(希望)能够展示我想要完成的事情,以及我的问题:
组合
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 |
| | |
+-------------+---------------------------+
三个TabItem具有相同的布局(上面的容器)。并且它们中的所有三个共享一个控件(因为所有选项卡都需要这个控件)。
所以我想做的至少是这个:
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似乎是我能得到的最好的。
谢谢大家的帮助!
答案 0 :(得分:2)
SWT确实有setParent
,但并非所有操作系统都支持此功能,并且根据http://www.eclipsezone.com/eclipse/forums/t23411.html,
即使在操作系统支持的Windows上也有负面影响
(不幸的是,我不知道这些影响是什么)。但是,鉴于这种限制,这样的事情应该有效:
public class ComposedComposite extends Composite {
public ComposedComposite(Composite parent, Control... children) {
super(parent, SWT.NONE);
for (Control child : children) {
child.setParent(this);
}
}
public void addChild(Control c) {
c.setParent(this);
}
}
您可能还需要致电layout
。