【问题标题】:How to build a custom draw2d layoutmanager?如何构建自定义 draw2d 布局管理器?
【发布时间】:2010-07-12 15:43:33
【问题描述】:

我想要一个布局管理器,可以按如下方式排列两个元素:

  • 一个主要元素 ABCDEF 居中

  • 一个“postscript”元素XYZ,位于封装图的右上角

例如:

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

我可以为此使用现有的布局管理器吗?如何构建支持它的自定义布局管理器?

非常感谢您的建议。

【问题讨论】:

    标签: layout-manager draw2d


    【解决方案1】:

    您可以使用 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);
    }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2011-05-23
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多