2011-03-15 29 views
1

我一直在试图创建一个Draw2D图,它由两部分组成 - 中央可调整大小的形状,例如圆形或矩形,以及底部的可编辑标签。这种类型的图形的一个示例是您在计算机桌面上看到的图标/标签。如何创建带有单独标签的GEF图形?

第一次尝试是创建一个带有两个子子图的父容器图 - 放置在中央的形状图和放置在底部的标签。它还实现了HandleBounds,因此选择和调整大小只出现在上面的子图上。事实证明,这并不是一个有效的解决方案,因为随着标签变得越来越宽,文字也越来越多,主要的父母形象以及中心形状也越来越宽。换句话说,整体家长的数字和孩子的标签数字一样宽。

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

回答

0

你必须创建一个容器图形,如您有XYLayout提到和“手动”的地方,“尺寸” 2×(形状和标签)的孩子的身影使用IFigure.add(IFigure child, Object constraint)方法与类型矩形的约束这种布局内(在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); 
      } 
     }); 
    } 
} 

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

To测试这个类我创建了一个简单的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)); 
} 

希望这可以帮助, 马努

+0

感谢您的回答,但是我不确定XYLayout是否能比我已经尝试过的布局(DelegatingLayout和BorderLayout)更好地工作。希望的行为是用户可以调整子形状图的大小而不影响标签图的大小。 – Phillipus 2011-03-15 14:43:40

+0

我添加了代码示例来说明 – 2011-03-15 15:41:48

+0

感谢您花时间创建代码示例。不幸的是,它不能解决问题。我正在寻找一种解决方案,即调整图形大小来调整形状图形,但标签的大小与标签中的文本保持一致(与宽度相同)。 – Phillipus 2011-03-15 16:40:26

2

好吧,我得到了你的问题现在。这是不可能做到你想要的:

父图不能小于它的一个孩子或这个孩子将不可见!

+0

是的,我同意。我想知道,如果我需要两个不同的联系在一起的数字。 – Phillipus 2011-03-15 17:00:57

+0

这个想法是只能够调整形状图的大小,标签保持居中显示其所有文本的底部。 – Phillipus 2011-03-15 17:11:16

+0

是的,你必须有两个分开的图形,标签倾听形状的移动,以便每次移动相关形状时移动它。祝你好运 ;-) – 2011-03-16 07:15:46

相关问题