如何在SWT中设置最大复合大小

4

有没有办法设置组合的最大尺寸?我只找到了一些方法

setMinimumSize(Point point)
setSize(Point point)

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


“Composite”通常将大小委托给设置在组合上的“Layout”。 - greg-449
那么我如何在布局中设置最大宽度?只有首选和最小值。 - John Smith
我从未遇到过任何这样的布局,大多数都会扩展子元素以适应可用空间。 - greg-449
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();
}

调整大小之前:

enter image description here

调整大小之后:

enter image description here


1
@JohnSmith 很高兴能帮到你,但请考虑我试图向你解释的内容。 - Baz
2
这非常有帮助...但我理解你关于固定尺寸的观点。然而,你也可以使用这种方法轻松定义百分比大小的最大值,这可能会稍微好一些 ;) - bbarker

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()将使窗口使用首选大小显示其内容。然后,布局会要求文本小部件计算其首选大小。文本小部件不知道窗口也会被扩展,并且没有固定的大小。
如果我们可以给文本小部件一个最大大小,那么这个问题就可以解决了。但是,这将导致网格布局出现另一个问题,因为我们不希望文本小部件在窗口具有比首选大小更大的最小大小的情况下变小。我无法给你这种情况的代码示例,因为没有一个最大大小,但是想象一下固定大小的窗口里面有一个较小的最大大小的文本小部件。
解决办法是将小部件计算出的首选大小限制为最大首选大小。我还没有找到设置此值的方法,但您可以通过覆盖小部件的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
    }
};

现在用户仍然可以通过拖动操作来增加外壳的大小,而小部件仍然能够在超出最大尺寸的情况下占用更多空间。


1
在我看来,这个答案提供的行为比被接受的答案更加灵活。 - M_M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接