2013-08-31 87 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

此答案在我看來提供了比接受的答案更靈活的行爲。 –