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