为画布SWT Draw2d启用滚动

时间:2014-07-27 12:31:58

标签: java user-interface swt draw2d

我试图在画布上显示的内容比窗口/画布的大小限制更多。我知道有几种方法可以解决这个问题。我可以使用FigureCanvas,但我不确定视口是如何绑定它的。我选择创建一个ScrolledComposite并在其中放置一个画布。我的问题是滚动条出现但移动它们对画布上显示的内容没有任何影响。有谁能指出我正确的方向来解决这个问题?谢谢。 *我添加了简短的可测试代码来说明问题。

import org.eclipse.draw2d.ColorConstants;
import org.eclipse.draw2d.Figure;
import org.eclipse.draw2d.IFigure;
import org.eclipse.draw2d.LightweightSystem;
import org.eclipse.draw2d.SimpleRaisedBorder;
import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.SWT;
import org.eclipse.wb.swt.SWTResourceManager;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.GridData;
import org.xml.sax.SAXException;
import org.eclipse.swt.custom.ScrolledComposite;


public class ScrollDemo extends Dialog {

    protected Shell shell;
    protected IFigure panel;
    protected IFigure v_panel;

    public static void main(String[] args)
    {
        ScrollDemo act= new ScrollDemo(new Shell(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
        act.open();
    }


    /**
     * Create the dialog.
     * @param parent
     * @param style
     */
    public ScrollDemo(Shell parent, int style) {
        super(parent, style);
        setText("Scrolling Demo");
    }

    /**
     * Open the dialog.
     * @throws SAXException 
     */
    public void open(){
            createContents();
        shell.open();
        shell.layout();
        Display display = getParent().getDisplay();
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.sleep();
            }
        }
    }

    /**
     * Create contents of the dialog.
     */
    private void createContents(){
        shell = new Shell(getParent(), getStyle());
        shell.setSize(475, 375);
        shell.setText(getText());
        shell.setLayout(new GridLayout(1, false));

        ScrolledComposite scrolledComposite = new ScrolledComposite(shell, SWT.BORDER | SWT.H_SCROLL | SWT.V_SCROLL);
        scrolledComposite.setBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_MAGENTA));
        GridData gd_scrolledComposite = new GridData(SWT.LEFT, SWT.CENTER, false, false, 1, 1);
        gd_scrolledComposite.widthHint = 453;
        gd_scrolledComposite.heightHint = 245;
        scrolledComposite.setLayoutData(gd_scrolledComposite);
        scrolledComposite.setExpandHorizontal(true);
        scrolledComposite.setExpandVertical(true);

        Canvas canvas = new Canvas(scrolledComposite,  SWT.H_SCROLL | SWT.V_SCROLL);
        canvas.setBackground(SWTResourceManager.getColor(SWT.COLOR_DARK_YELLOW));
        scrolledComposite.setContent(canvas);
        scrolledComposite.setMinSize(canvas.computeSize(SWT.DEFAULT, SWT.DEFAULT));

        LightweightSystem lws = new LightweightSystem(canvas); 
        panel = new Figure(); 
        lws.setContents(panel);

        int starting_xpos= 0;
        int starting_ypos= 0;
        makeStructure(starting_xpos, starting_ypos, 0);


    }

    private void makeStructure(int starting_xpos, int starting_ypos, int index)
    {
        org.eclipse.draw2d.Label lblRoot= new org.eclipse.draw2d.Label();
        Rectangle rect= new Rectangle(starting_xpos, starting_ypos, 200, 25);
        //Anything longer than 200 cannot be displayed

        lblRoot.setText("BAAAAAAAAAAAB");

        lblRoot.setBorder(new SimpleRaisedBorder());
        lblRoot.setForegroundColor(ColorConstants.black);
        lblRoot.setVisible(true);
        lblRoot.setOpaque(true);
        lblRoot.setBounds(rect);

        panel.add(lblRoot);

         if (index<10)
            {
                makeStructure(starting_xpos+20, starting_ypos+50, index+1);
            }
        }


    }

1 个答案:

答案 0 :(得分:2)

好的,我设法使用FigureCanvas代替Canvas并使用Viewport作为根元素来实现目标:

public class Draw2d extends Dialog
{
    protected Shell     shell;
    private Viewport    viewport;

    public static void main(String[] args)
    {
        Draw2d act = new Draw2d(new Shell(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
        act.open();
    }

    public Draw2d(Shell parent, int style)
    {
        super(parent, style);
        setText("Draw2d");
    }

    public void open()
    {
        createContents();
        shell.open();
        shell.layout();
        Display display = getParent().getDisplay();
        while (!shell.isDisposed())
        {
            if (!display.readAndDispatch())
            {
                display.sleep();
            }
        }
    }

    private void createContents()
    {
        shell = new Shell(getParent(), getStyle());
        shell.setSize(475, 375);
        shell.setText(getText());
        shell.setLayout(new GridLayout(1, false));

        FigureCanvas canvas = new FigureCanvas(shell, SWT.H_SCROLL | SWT.V_SCROLL);
        canvas.setBackground(shell.getDisplay().getSystemColor(SWT.COLOR_DARK_YELLOW));
        canvas.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        canvas.setScrollBarVisibility(FigureCanvas.ALWAYS);
        viewport = new Viewport(true);
        canvas.setViewport(viewport);

        LightweightSystem lws = new LightweightSystem(canvas);
        lws.setContents(viewport);

        makeStructure(0, 0, 0);
    }

    private void makeStructure(int starting_xpos, int starting_ypos, int index)
    {
        org.eclipse.draw2d.Label lblRoot = new org.eclipse.draw2d.Label();
        Rectangle rect = new Rectangle(starting_xpos, starting_ypos, 210, 25);

        lblRoot.setText("BAAAAAAAAAAAB");

        lblRoot.setBorder(new SimpleRaisedBorder());
        lblRoot.setForegroundColor(ColorConstants.black);
        lblRoot.setVisible(true);
        lblRoot.setOpaque(true);
        lblRoot.setBounds(rect);

        viewport.add(lblRoot);

        if (index < 10)
        {
            makeStructure(starting_xpos + 20, starting_ypos + 50, index + 1);
        }
    }
}

现在滚动效果很好。