0

我正在设计一个简单的 GUI。我有小部件,它有孩子和一个父母。每个 Widget 都是一个 Composite 对象,带有一个 WidgetComposite 对象的向量。其中一个 WidgetComposites 是 PaintingBehaviour,但 Widget 并不知道它本身。

为了显示我的窗口,我使用了一个访问者,称为 ScreenVisitor。当调用访问者时,会发生以下情况:

第一个小部件 WidgetScene 迭代其每个小部件并调用“accept(Visitor* v)”方法。然后,每个小部件接受访问者,然后迭代其子级。

例如,这是访问者必须接受的对象列表(按照发生的顺序)。

root
    child1
       child2
         child3
       child4
    child5
       child6
    child7

现在,我的问题很简单:我希望将每个 Widget 绘制在其父级上。你将如何进行?我试过一棵树,但我总是遇到同样的问题:当我必须在层次结构中上升时(例如,在显示 child3 之后,当我必须显示 child4 时)我不知道如何获得正确的父母。

我正在用 C++ 编码,但这个问题不是特定于语言的。

你有什么想法 ?提前致谢 !

4

2 回答 2

0

这个问题对我来说不是很清楚。如果您只需要让它们以正确的顺序绘制。父母先于孩子,这很容易:

accept(Visitor v)
  paint() //paint parent first
  v.visit()
  foreach child
    child.accept(v) //then paint children

如果您需要父节点(为什么?),您可以将接受方法更改为(可选)获取父节点。

accept(Visitor v,Element parent = null)
  paint()
  v.visit()
  parent.foo()
  foreach child
    child.accept(v,this)
于 2010-10-11T10:43:26.367 回答
0

好吧,因为我找不到其他任何东西,我尝试了这个解决方案:

访问者创建一个“DisplayNodes”对象树,它们基本上是一个基本上由指针组成的类。以下是该类的属性:

class DisplayNode
{
   private:
     Widget* myWidget;
     PaintingBehaviour* myPB;
     DisplayNode* myParent;
     vector <DisplayNode*>myChildren;
};

每个 DisplayNode 都存储在我的访问者的向量中。

然后,对于每个 PaintingBehaviour,我测试连接的 Widget 的父级,并检查我的 Node 的“myWidget”之一是否是这个父级。所以我可以找回所有东西在哪里。之后,就很简单了,DisplayNode 中的一个简单绘制方法,递归调用子元素,使用场景的第一个 DisplayNode 调用...

由于它有点重,我只创建了一次 DisplayNode 树(尽管如果添加/删除了 PaintingBehaviour 或小部件,我会再次创建)。如果树已经存在,我直接去递归绘画。

我承认,这有点扭曲(并且可能不是很优化),但它确实有效!但如果有人有更好的解决方案,我会很高兴听到它。

于 2010-10-12T17:28:57.413 回答