2011-03-15 58 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

相關問題