1

我试图在 Eclipse 中使用 GEF 支持的图形编辑器来说明(和编辑)一个 xml 模型。我的 xml 模型在其父子层次结构中最多可以有五个级别。层次结构中的每个元素都是其自己的 EditPart(看起来像一个框)。子元素将表示为包含在其父框内的“框”EditPart,依此类推...

我的每个 EditPart 都将有一个 draw2d 图形,它本身将至少有两个或三个以上(装饰性的)draw2d 图形。装饰图形是标题矩形、内容矩形、标签等。我看到这些装饰图形被绘制在 EditPart 的子 EditPart 上方 - 这意味着我看不到任何子 EditPart。

我有一个解决方法,我将手动强制子 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 现在呈现在父 EditPart 上方,但就 Gef 而言,它位于下方 - 一些 Gef 事件(如拖放侦听器和工具提示)的行为就像子 EditPart 不存在一样。

编辑:

EditPart 的图形由以下方式创建

@Override
protected IFigure createFigure() {
    return new PageFigure(this);
}

其中 PageFigure 是 Figure 的子类,它构造了自己的装饰子图形。

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));
    }
}
4

1 回答 1

2

正在发生的事情是 GEF 正在将子EditPart图形添加到 GEF 中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-定义容器编辑部件/

于 2013-09-26T23:18:25.920 回答