我试图用eclipse中的GEF驱动的图形编辑器来说明(和编辑)一个xml模型。我的xml模型在其父子层次结构中最多可以有五个级别。层次结构中的每个元素都是它自己的EditPart(看起来像一个盒子)。子元素将表示为父盒子中包含的“box”EditParts,依此类推......
我的每个EditPart都有一个draw2d图,它本身至少会有两到三个(装饰性)draw2d数字。装饰图是像Header Rectangle,内容Rectangles,label等等。我看到这些装饰图形被绘制在EditPart的子EditParts上方 - 这意味着我看不到任何子EditParts。
我有一个解决方法,我会手动强制孩子将EditPart的数字移动到其父级EditPart的数字堆栈的顶部:
@Override
protected void refreshVisuals() {
super.refreshVisuals();
IFigure figure = getFigure();
if(figure instanceof BaseElementFigure){
//Refresh the figure...
((BaseElementFigure) figure).refresh(this);
}
if (figure.getParent() != null) {
//This moves the figure to the top of its parent's stack so it is not drawn behind the parent's other (decorative) figures
figure.getParent().add(figure);
((GraphicalEditPart) getParent()).setLayoutConstraint(this, figure, getBounds());
}
refreshChildrenVisuals();
}
但是,这只是部分有效。孩子EditPart现在被渲染到Parent EditPart之上,但就Gef而言,它已经不足了 - 一些Gef事件(如drop listeners和tooltip)的行为就好像子EditPart不存在一样。
修改
EditPart的图形如下创建
@Override
protected IFigure createFigure() {
return new PageFigure(this);
}
其中PageFigure是图的子类,它构造了它自己的装饰子图。
public class PageFigure extends Figure {
protected Label headerLabel;
protected RectangleFigure contentRectangle;
protected RectangleFigure headerRectangle;
private UiElementEditPart context;
public PageFigure(UiElementEditPart context) {
this.context = context;
setLayoutManager(new XYLayout());
this.contentRectangle = new RectangleFigure();
contentRectangle.setFill(false);
contentRectangle.setOpaque(false);
this.headerRectangle = new RectangleFigure();
headerRectangle.setFill(false);
headerRectangle.setOpaque(false);
this.headerLabel = new Label();
headerLabel.setForegroundColor(ColorConstants.black);
headerLabel.setBackgroundColor(ColorConstants.lightGray);
headerLabel.setOpaque(true);
headerLabel.setLabelAlignment(Label.LEFT);
headerLabel.setBorder(new MarginBorder(0, 5, 0, 0));
headerRectangle.add(headerLabel);
add(contentRectangle);
add(headerRectangle);
//Initializing the bounds for these figures (including this one)
setBounds(context.getBounds());
contentRectangle.setBounds(new Rectangle(this.getBounds().x, this.getBounds().y + 20, this.getBounds().width, this.getBounds().height - 20));
Rectangle headerBounds = new Rectangle(this.getBounds().x, this.getBounds().y, this.getBounds().width, 20);
headerRectangle.setBounds(headerBounds);
headerLabel.setBounds(new Rectangle(headerBounds.x + 30, headerBounds.y, headerBounds.width - 30, 20));
}
}
答案 0 :(得分:2)
正在发生的事情是,全球环境基金正在将EditPart
个子数字添加到PageFigure
,并且从上一个数字开始添加GEF中的绘图顺序,并在之前添加的数字之上,如堆。这就是为什么您的孩子EditPart
的数字低于父母EditPart
的子女数字。
您可以做的是添加一个内容窗格图,其中包含子图,并使其成为添加到EditPart
图中的第一个图。然后覆盖图的contentPane
,以便在此图上添加所有子图。
如果这没有帮助,请在前一段时间查看有关此主题的教程。我可能忘记了一些细节:http://www.vainolo.com/2011/09/01/creating-an-opm-gef-editor-%E2%80%93-part-17-how-to-define-container-edit-parts/。