【问题标题】:JFace Dialog Layout Issues, Widgets drawn outside of the bounds of the windowJFace 对话框布局问题,在窗口边界之外绘制的小部件
【发布时间】:2017-02-08 16:57:57
【问题描述】:

我正在尝试布置一个对话框,左侧有一个滚动面板,右侧有一个画布,填充可用空间但未被按钮栏覆盖。在我的示例中可以看到我遇到的问题是复合材料似乎认为他们有无限的空间可以吸引自己,我不明白这应该如何与任何东西一起工作。

import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.swt.SWT;
import org.eclipse.swt.custom.ScrolledComposite;
import org.eclipse.swt.events.PaintEvent;
import org.eclipse.swt.events.PaintListener;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Canvas;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

public class FMLDialog extends Dialog
{   
    public FMLDialog(Shell parentShell)
    {
        super(parentShell);
    }


    @Override
    protected void configureShell(Shell shell)
    {
        super.configureShell(shell);
        shell.setSize(new Point(700,500));
        shell.setText("FML");
    }   

    @Override
    public Control createDialogArea(final Composite comp)
    {

        Composite content = (Composite) super.createDialogArea(comp);
        Composite parent = new Composite(content, SWT.NONE);        

        GridLayout gridLayout1 = new GridLayout(1, false);
        gridLayout1.verticalSpacing=10;
        GridLayout gridLayout2 = new GridLayout(2, false);
        parent.setLayout(gridLayout2);
        parent.setLayoutData(new GridData(SWT.FILL, SWT.BEGINNING, true, false));           

        final ScrolledComposite scroll = new ScrolledComposite(parent, SWT.V_SCROLL);
        scroll.setExpandHorizontal(true);
        scroll.setExpandVertical(true);

        Composite optionsPanel = new Composite(scroll, SWT.BORDER);

        optionsPanel.setSize(optionsPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
        optionsPanel.setLayout(gridLayout1);
        scroll.setContent(optionsPanel);

        for (int i = 0; i < 200; i++) {
            new Label(optionsPanel, SWT.NONE).setText("this is item " + i);
        }

        scroll.setSize(optionsPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));

        final Canvas c = new Canvas(parent, SWT.BORDER);
        c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
        c.addPaintListener(new PaintListener() {

            @Override
            public void paintControl(PaintEvent e) {
                Point size = c.getSize();
                e.gc.drawText("Width: " + size.x + "\nHeight: " + size.y, 5, 5);
                e.gc.drawOval(2, 2, size.x - 4, size.y - 4);
            }
        });

        return content;     

    }

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

        FMLDialog fml = new FMLDialog(s);
        fml.open();
    }

}

【问题讨论】:

    标签: java dialog swt jface


    【解决方案1】:

    这里有几个问题,首先是没有调用ScrolledComposite#setMinSize(),还有一些小问题是GridDataLayouts。

    这是您的代码的修改版本:

    public class FMLDialog extends Dialog
    {
        public FMLDialog(Shell parentShell)
        {
            super(parentShell);
        }
    
        @Override
        protected void configureShell(Shell shell)
        {
            super.configureShell(shell);
            shell.setSize(new Point(700, 500));
            shell.setText("FML");
        }
    
        @Override
        public Control createDialogArea(final Composite comp)
        {
            Composite content = (Composite) super.createDialogArea(comp);
            content.setLayout(new GridLayout(2, false));
            content.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    
            final ScrolledComposite scroll = new ScrolledComposite(content, SWT.V_SCROLL);
            scroll.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
            scroll.setExpandHorizontal(true);
            scroll.setExpandVertical(true);
    
            Composite optionsPanel = new Composite(scroll, SWT.BORDER);
            optionsPanel.setLayout(new FillLayout(SWT.VERTICAL));
            optionsPanel.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
    
            for (int i = 0; i < 200; i++)
            {
                new Label(optionsPanel, SWT.NONE).setText("this is item " + i);
            }
    
            scroll.setContent(optionsPanel);
            scroll.setMinSize(optionsPanel.computeSize(SWT.DEFAULT, SWT.DEFAULT));
    
            final Canvas c = new Canvas(content, SWT.BORDER);
            c.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
            c.addPaintListener(new PaintListener()
            {
                @Override
                public void paintControl(PaintEvent e)
                {
                    Point size = c.getSize();
                    e.gc.drawText("Width: " + size.x + "\nHeight: " + size.y, 5, 5);
                    e.gc.drawOval(2, 2, size.x - 4, size.y - 4);
                }
            });
    
            return content;
        }
    
        public static void main(String[] args)
        {
            Display d = new Display();
            Shell s = new Shell();
    
            FMLDialog fml = new FMLDialog(s);
            fml.open();
        }
    }
    

    【讨论】:

    • 我知道我可以依靠你 Baz
    • @Link19 总是乐于助人!
    猜你喜欢
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2020-10-16
    • 1970-01-01
    • 2018-04-24
    • 2018-07-09
    • 2014-10-11
    • 2023-03-22
    相关资源
    最近更新 更多