0

在 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 的主窗口。每个 TabItems 都有一个布局并表示来自模型的不同数据。现在我创建了几个控件,我想将它们组合在一个单独的控件(容器)中。容器具有以下布局。

+-------------+---------------------------+
|             |            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 似乎是我能得到的最好的。

谢谢大家的帮助!

4

1 回答 1

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

于 2013-09-27T06:04:12.103 回答