4

有没有办法设置复合材料的最大尺寸?只有我找到的方法

setMinimumSize(Point point)
setSize(Point point)

这允许我设置最小和首选大小。

4

2 回答 2

9

据我所知,没有设置最大尺寸的布局,这在我看来是件好事。

考虑以下情况:您将Widget/的最大大小设置为Composite您认为“看起来不错”的值。根据最终用户的屏幕分辨率和文本大小,选择的最大大小可能看起来不对。这就是为什么布局通常会适应可用空间的原因。


不过,这里有一些限制大小的代码:

public static void main(String[] args)
{
    Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setText("StackOverflow");
    shell.setLayout(new GridLayout(1, false));

    final Button left = new Button(shell, SWT.PUSH);
    left.setText("Restricted width");
    left.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));

    left.addListener(SWT.Resize, new Listener()
    {
        @Override
        public void handleEvent(Event arg0)
        {
            Point size = left.getSize();

            if(size.x > 200)
            {
                left.setSize(200, size.y);
            }
        }
    });

    shell.pack();
    shell.open();
    while (!shell.isDisposed())
    {
        if (!display.readAndDispatch())
            display.sleep();
    }
    display.dispose();
}

调整大小之前:

在此处输入图像描述

调整大小后:

在此处输入图像描述

于 2013-08-31T18:14:49.380 回答
5

我很好奇你为什么要设置最大尺寸。你能举个具体的例子吗?我有一种情况,我想要这个选项,但我想出了一个更好的解决方案。只需考虑布局中的一个小部件,它具有基于其内容的首选大小,例如文本小部件。现在您希望该小部件与可用空间允许的一样大。但由于该小部件根据其内容要求空间,它可能会要求比必要更多的空间。所以我需要的是最大尺寸,但如果有更多空间可用,该小部件仍然能够占用空间而无需占用更多空间。

但让我们看一个例子:

public static void main(final String[] args) {
    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setLayout(new GridLayout(1, false));

    final Text text = new Text(shell, SWT.WRAP | SWT.MULTI | SWT.V_SCROLL);
    text.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true, 1, 1));
    text.setText(getLongText());

    shell.pack();
    shell.open();
    while (!shell.isDisposed()) {
        if (!display.readAndDispatch()) display.sleep();
    }
    display.dispose();
}

调用shell.pack()将使 shell 使用首选大小来显示其内容。然后布局将要求文本小部件计算其首选大小。文本小部件不知道外壳也会被扩展并且没有固定大小。

如果我们可以给文本小部件一个最大尺寸,那么这个问题就可以解决。但这会导致网格布局的另一个问题,因为我们不希望文本小部件变小,以防外壳的最小尺寸大于文本小部件的首选尺寸。我不能给你一个这种情况的代码示例,因为没有最大尺寸,但想象一下外壳是固定尺寸的,里面的文本小部件的最大尺寸更小。

解决方案是将小部件计算的首选大小限制为最大首选大小。我还没有找到设置此值的方法,但是您可以通过覆盖小部件的 computeSize 方法来实现此效果:

final Text text = new Text(shell, SWT.WRAP | SWT.MULTI | SWT.V_SCROLL) {

    /** The maximum preferred size. */
    private final Point maxSize = new Point(500, 400);

    @Override
    public Point computeSize(final int wHint, final int hHint, final boolean changed) {
        final Point preferredSize = super.computeSize(wHint, hHint, changed);
        return new Point(Math.min(maxSize.x, preferredSize.x), Math.min(maxSize.y, preferredSize.y));
    }

    @Override
    protected void checkSubclass() {
        // noop, allow subclassing, since we know what we are doing
    }
};

现在您仍然可以通过用户拖动操作来增加外壳大小,并且小部件仍然可以在最大尺寸之上抓取更多空间。

于 2015-09-19T14:39:51.690 回答