我一直在尝试创建一个Draw2D图,它包含两个部分 - 一个可调整大小的中心形状,如圆形或矩形,以及一个可编辑的底部标签。此类图形的一个示例是您在计算机桌面上看到的图标/标签。
第一次尝试是创建一个带有两个子子图的父容器图形 - 一个放置在中央的形状图形和一个放在底部的标签。它还实现了HandleBounds,以便仅在上部形状子图上进行选择和调整大小。事实证明这不是一个有效的解决方案,因为随着标签变得越来越宽,主要的父图形也随之变化,因此中心的形状图也是如此。换句话说,整体父图形与子标签图形一样宽。
我正在寻找的是一个图形,它保持形状图形的大小,但允许标签图形的宽度独立增长。与桌面图标完全相同的行为。
答案 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}}
希望这可以提供帮助, 马努