User interface 以正确的顺序快速播放-访客问题

User interface 以正确的顺序快速播放-访客问题,user-interface,tree,composite,visitor-pattern,User Interface,Tree,Composite,Visitor Pattern,我正在设计一个简单的GUI。我有小部件,它们有子部件和一个父部件。每个小部件都是一个复合对象,带有一个WidgetComposite对象向量。WidgetComposites中的一个是paintingBehavior,但小部件本身并不知道它 为了显示我的窗口,我使用了一个名为ScreenVisitor的访问者。调用访问者时,会发生以下情况: 第一个小部件WidgetScene在其每个小部件上迭代并调用acceptVisitor*v方法。然后,每个小部件接受访问者,然后迭代其子部件 例如,这是一个

我正在设计一个简单的GUI。我有小部件,它们有子部件和一个父部件。每个小部件都是一个复合对象,带有一个WidgetComposite对象向量。WidgetComposites中的一个是paintingBehavior,但小部件本身并不知道它

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

第一个小部件WidgetScene在其每个小部件上迭代并调用acceptVisitor*v方法。然后,每个小部件接受访问者,然后迭代其子部件

例如,这是一个对象列表,按照访问者必须接受的顺序排列

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

<>我在C++中编码,但这个问题不是语言特定的。< /P>
你有什么想法吗?提前谢谢

这个问题我不太清楚。如果你只需要把它们按正确的顺序涂上。父母先于子女,这很容易:

accept(Visitor v)
  paint() //paint parent first
  v.visit()
  foreach child
    child.accept(v) //then paint children
如果需要父节点why?,可以将accept方法更改为可选地接受父节点

accept(Visitor v,Element parent = null)
  paint()
  v.visit()
  parent.foo()
  foreach child
    child.accept(v,this)

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

访问者创建DisplayNodes对象树,这些对象基本上是由指针组成的类。以下是该类的属性:

class DisplayNode
{
   private:
     Widget* myWidget;
     PaintingBehaviour* myPB;
     DisplayNode* myParent;
     vector <DisplayNode*>myChildren;
};
每个DisplayNode都存储在我的访问者中的一个向量中

然后,对于每个paintingbehavior,我测试连接的小部件的父级,并检查节点的myWidget中是否有一个是该父级。这样我就能找到所有的东西。在这之后,很容易,在DisplayNode中使用一个简单的绘制方法,递归调用子对象,使用场景的第一个DisplayNode调用

因为它有点重,我只创建了一次DisplayNode树,尽管如果添加/删除了PaintingBehavior或小部件,我会再次创建。如果树已经存在,我直接转到递归绘制


我承认,它有点扭曲,可能不是很优化,但它是有效的!但是如果有人有更好的解决方案,我会非常高兴听到它。

关于你的第一个解决方案:你不能用你的解决方案在父窗口小部件上绘制,你必须直接在屏幕上绘制。关于第二个:不,因为您需要父对象的paintingbehavior,而小部件不知道它们的paintingbehavior,它们只有compositeobject。