2013-08-31 84 views
3

有什么方法可以设置合成的最大尺寸?只有我找到的方法如何在SWT中设置最大合成尺寸

setMinimumSize(Point point) 
setSize(Point point) 

它允许我设置最小和最喜欢的大小。

+0

“Composite”通常会将大小赋予组合上的“布局”。 –

+0

那么我怎样才能在布局上设置最大宽度?只有首选和最低 –

+0

我从来没有遇到任何这样做的布局,大多数扩展孩子以适应可用的空间。 –

回答

8

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

请考虑以下szenario:您将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

+0

这就是我正在寻找的。 :) –

+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()会使外壳使用的首选大小以显示其内容。然后布局会要求文本小部件计算其首选大小。文本小部件不知道,外壳也将被扩展,并且没有固定大小。

这个问题可以解决,如果我们可以给文本小部件的最大尺寸。但它会导致网格布局的另一个问题,因为我们不希望文本小部件在shell的最小尺寸大于文本小部件的首选尺寸的情况下更小。我不能给你一个这种情况的代码示例,因为没有最大尺寸,只是想象一下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 
    } 
}; 

现在您仍然可以通过用户拖拽操作来增加炮弹大小并且该小部件仍然可以在最大尺寸以上获取更多空间。

+0

此答案在我看来提供了比接受的答案更灵活的行为。 –