2010-07-12 46 views
1

我想有,可以安排兩個元素的佈局管理器如下:如何構建自定義draw2d佈局管理器?

  • 一個主元件ABCDEF居中

  • 一個「後記」元件XYZ,定位在的右上角封裝數字

例如:

***********XYZ* 
* ABCDEF * 
*************** 

我可以使用現有的layoutmanager嗎?我如何構建支持它的自定義佈局管理器?

非常感謝您的建議。

回答

0

你可以通過使用XYLayout來做到這一點。

有,你可以建立在一個樣本:

import org.eclipse.draw2d.AbstractLayout; 
import org.eclipse.draw2d.Figure; 
import org.eclipse.draw2d.FigureCanvas; 
import org.eclipse.draw2d.IFigure; 
import org.eclipse.draw2d.Label; 
import org.eclipse.draw2d.LayoutManager; 
import org.eclipse.draw2d.LineBorder; 
import org.eclipse.draw2d.Panel; 
import org.eclipse.draw2d.XYLayout; 
import org.eclipse.draw2d.geometry.Dimension; 
import org.eclipse.draw2d.geometry.Insets; 
import org.eclipse.draw2d.geometry.PrecisionRectangle; 
import org.eclipse.draw2d.geometry.Rectangle; 
import org.eclipse.swt.SWT; 
import org.eclipse.swt.layout.FillLayout; 
import org.eclipse.swt.widgets.Display; 
import org.eclipse.swt.widgets.Shell; 


public class HHH { 

    public static void main(String[] args) { 
     Display d = new Display(); 
     Shell s = new Shell(); 
     s.setLayout(new FillLayout()); 

     FigureCanvas canvas = new FigureCanvas(s); 

     Figure content = new Figure(); 
     content.setLayoutManager(new XYLayout()); 

     PostScriptedFigure figure = new PostScriptedFigure(); 
     content.add(figure, new Rectangle(100, 100, -1, -1)); 

     figure.setMainFigure(new Label("The Main figure")); 
     figure.setPostScriptFigure(new Label("ps")); 
     figure.setBorder(new LineBorder()); 

     canvas.setContents(content); 

     s.setSize(600, 500); 
     s.open(); 

     while (!s.isDisposed()) { 
      if (!d.readAndDispatch()) { 
       d.sleep(); 
      } 
     } 
    } 

} 

class PostScriptedFigure extends Panel { 

    private IFigure mainFigure, postScriptFigure; 

    private class PostScriptedLayoutManager extends AbstractLayout { 

    @Override 
    public void layout(IFigure container) { 
     final Rectangle clientArea = container.getClientArea(); 

     final IFigure mainFigure = getMainFigure(); 
     final IFigure postScriptFigure = getPostScriptFigure(); 

     if (mainFigure != null) { 
      final Rectangle bounds = new PrecisionRectangle(); 
      bounds.setSize(mainFigure.getPreferredSize(SWT.DEFAULT, SWT.DEFAULT)); 

      final Rectangle mainClientArea = clientArea.getCopy(); 
      if (postScriptFigure != null) { 
       mainClientArea.shrink(new Insets(postScriptFigure.getPreferredSize().height(), 0, 0, 0)); 
      } 
      bounds.translate(mainClientArea.getCenter().getTranslated(bounds.getSize().getScaled(0.5f).getNegated())); 
      mainFigure.setBounds(bounds); 
     } 
     if (postScriptFigure != null) { 
      final Rectangle bounds = new PrecisionRectangle(); 
      bounds.setSize(postScriptFigure.getPreferredSize(SWT.DEFAULT, SWT.DEFAULT)); 
      bounds.translate(clientArea.getTopRight().getTranslated(bounds.getSize().getNegated().width(), 0)); 
      postScriptFigure.setBounds(bounds); 
     } 
     // note that other potentionally added figures are ignored 
    } 

    @Override 
    protected Dimension calculatePreferredSize(IFigure container, int wHint, int hHint) { 
     final Rectangle rect = new PrecisionRectangle(); 

     final IFigure mainFigure = getMainFigure(); 
     if (mainFigure != null) { 
      rect.setSize(mainFigure.getPreferredSize()); 
     } 
     final IFigure postScriptFigure = getPostScriptFigure(); 
     if (postScriptFigure != null) { 
      rect.resize(mainFigure != null ? 0 : postScriptFigure.getPreferredSize().width() , postScriptFigure.getPreferredSize().height()); 
     } 

     // note that other potentionally added figures are ignored 

     final Dimension d = rect.getSize(); 
     final Insets insets = container.getInsets(); 
     return new Dimension(d.width + insets.getWidth(), d.height + insets.getHeight()).union(getBorderPreferredSize(container)); 
    } 

} 

public PostScriptedFigure() { 
    super.setLayoutManager(new PostScriptedLayoutManager()); 
} 

@Override 
public void setLayoutManager(LayoutManager manager) { 
    // prevent from setting wrong layout manager 
} 

public IFigure getMainFigure() { 
    return mainFigure; 
} 

public void setMainFigure(IFigure mainFigure) { 
    if (getMainFigure() != null) { 
     remove(getMainFigure()); 
    } 
    this.mainFigure = mainFigure; 
    add(mainFigure); 
} 

public IFigure getPostScriptFigure() { 
    return postScriptFigure; 
} 

public void setPostScriptFigure(IFigure postScriptFigure) { 
    if (getPostScriptFigure() != null) { 
     remove(getPostScriptFigure()); 
    } 
    this.postScriptFigure = postScriptFigure; 
    add(postScriptFigure); 
} 

} 
+0

如果你添加更多的信息,這可能是一個有用的答案。 – 2012-12-11 14:37:26