我试图在 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));
}
}