如何使用单独的标签创建GEF图?

时间:2011-03-15 13:32:56

标签: eclipse eclipse-gef draw2d

我一直在尝试创建一个Draw2D图,它包含两个部分 - 一个可调整大小的中心形状,如圆形或矩形,以及一个可编辑的底部标签。此类图形的一个示例是您在计算机桌面上看到的图标/标签。

第一次尝试是创建一个带有两个子子图的父容器图形 - 一个放置在中央的形状图形和一个放在底部的标签。它还实现了HandleBounds,以便仅在上部形状子图上进行选择和调整大小。事实证明这不是一个有效的解决方案,因为随着标签变得越来越宽,主要的父图形也随之变化,因此中心的形状图也是如此。换句话说,整体父图形与子标签图形一样宽。

我正在寻找的是一个图形,它保持形状图形的大小,但允许标签图形的宽度独立增长。与桌面图标完全相同的行为。

2 个答案:

答案 0 :(得分:2)

好的我现在收到你的问题。做你想做的事是不可能的:

父图不能小于其中一个孩子,否则这个孩子将不可见!!!

答案 1 :(得分:0)

您必须使用带有约束的IFigure.add(IFigure child, Object constraint)方法,使用XYLayout和“手动”位置创建容器图形并使用package draw2dtest.views; import org.eclipse.draw2d.ColorConstants; import org.eclipse.draw2d.Ellipse; import org.eclipse.draw2d.Figure; import org.eclipse.draw2d.FigureListener; import org.eclipse.draw2d.IFigure; import org.eclipse.draw2d.Label; import org.eclipse.draw2d.MouseEvent; import org.eclipse.draw2d.MouseListener; import org.eclipse.draw2d.XYLayout; import org.eclipse.draw2d.geometry.Rectangle; public class LabeledFigure extends Figure { private final Figure shapeFigure; private final Label labelFigure; private Rectangle customShapeConstraint; public LabeledFigure(String label) { setLayoutManager(new XYLayout()); setBackgroundColor(ColorConstants.lightGray); setOpaque(true); shapeFigure = new Ellipse(); this.add(shapeFigure); shapeFigure.setBackgroundColor(ColorConstants.yellow); shapeFigure.addMouseListener(new MouseListener.Stub() { @Override public void mousePressed(MouseEvent me) { customShapeConstraint = new Rectangle( (Rectangle) LabeledFigure.this.getLayoutManager() .getConstraint(shapeFigure)); customShapeConstraint.width -= 6; customShapeConstraint.x += 3; LabeledFigure.this.getLayoutManager().setConstraint( shapeFigure, customShapeConstraint); LabeledFigure.this.revalidate(); } }); labelFigure = new Label(label); labelFigure.setOpaque(true); labelFigure.setBackgroundColor(ColorConstants.green); labelFigure.addMouseListener(new MouseListener.Stub() { @Override public void mousePressed(MouseEvent me) { Rectangle shapeFigureConstraint = new Rectangle(0, 0, bounds.width, bounds.height - 15); LabeledFigure.this.getLayoutManager().setConstraint( shapeFigure, shapeFigureConstraint); LabeledFigure.this.revalidate(); } }); this.add(labelFigure); this.addFigureListener(new FigureListener() { @Override public void figureMoved(IFigure source) { Rectangle bounds = LabeledFigure.this.getBounds(); Rectangle shapeFigureConstraint = new Rectangle(0, 0, bounds.width, bounds.height - 15); LabeledFigure.this.getLayoutManager().setConstraint( shapeFigure, shapeFigureConstraint); Rectangle labelFigureConstraint = new Rectangle(0, bounds.height - 15, bounds.width, 15); if (customShapeConstraint != null) { labelFigureConstraint = customShapeConstraint; } LabeledFigure.this.getLayoutManager().setConstraint( labelFigure, labelFigureConstraint); } }); } } 方法在此布局中“缩放”2(形状和标签)子图形类型为Rectangle(Draw2d)

使用代码示例编辑

以下是您的图表类的示例:

@Override
public void createPartControl(Composite parent) {

    FigureCanvas fc = new FigureCanvas(parent, SWT.DOUBLE_BUFFERED);
    fc.setBackground(ColorConstants.red);

    Panel panel = new Panel();
    panel.setLayoutManager(new XYLayout());

    LabeledFigure labeledFigure = new LabeledFigure("This is the label");
    fc.setContents(panel);

    panel.add(labeledFigure, new Rectangle(10,10, 200,100));
}

这不是一个干净的课程,但它应该是一个很好的条目,向您展示如何实现您的目标。这是一个基于纯Draw2d的示例,没有任何Gef代码,因此通过单击黄色椭圆(大小减小)和绿色标签(初始大小恢复)来完成形状的大小调整

为了测试这个类,我创建了一个简单的Eclipse视图,如下所示:

{{1}}

希望这可以提供帮助, 马努