1

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

第一次尝试是创建一个包含两个子子图形的父容器图形 - 一个放置在中心的形状图形和一个放置在底部的标签。它还实现了 HandleBounds,以便选择和调整大小仅发生在上部形状子图上。事实证明,这不是一个可行的解决方案,因为随着标签随着文本的增加而变宽,主要的父图形以及中心形状的图形也会变宽。换句话说,整个父图形与子标签图形一样宽。

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

4

2 回答 2

2

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

父图形不能小于它的一个孩子,否则这个孩子将不可见!!!

于 2011-03-15T16:56:27.793 回答
0

您必须使用 XYLayout 和“手动”放置并“调整”该布局内的 2 个(形状和标签)子图形,使用IFigure.add(IFigure child, Object constraint)带有 Rectangle 类型约束(Draw2d)的方法创建一个容器图形

使用代码示例进行编辑

这是您的图形类的示例:

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

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

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

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

希望这可以帮助,马努

于 2011-03-15T14:20:55.287 回答