2013-08-02 101 views
1

我對SWT中的佈局和油漆程序有幾點疑問。SWT佈局和油漆

狐狸的例子,我有一個複合材料與兒童。當我調用composite.layout()是什麼意思?佈局?塗料?我發現在Javadoc混淆這句話:

Note: Layout is different from painting. If a child is moved or resized such that an area in the parent is exposed, then the parent will paint. If no child is affected, the parent will not paint. 

另一個問題是,到底是怎麼回事,當我設置composite.setLayoutDeferred(真)和composite.layout後調用?

另外,當我設置composite.setRedraw(false)並且之後調用仍然是相同的composite.layout()會發生什麼?

我花了一天的時間閱讀javadoc並做了一些練習調查,但沒有揭示出這個問題。我無法理解這個API背後的理論。

在此先感謝。

回答

1

好吧,讓我試着解釋這一點:

有兩種類型的Widget這兒參與:那些可以有一個佈局(Composite S和它的子類)和其他Control秒。

Paint事件發生時,Composite(如果它有一個Layout)將導致它的孩子重繪。如果孩子也是Composite,他們會傳播這一點。如果他們是其他Control s,他們將重繪。

重繪Control意味着該控件的「狀態」已經改變,即爲了正確表示其舞臺,它必須做些事情。這可能是由調整大小事件引起的,或者將鼠標懸停在其上或點擊它,基本上所有視覺外觀都必須改變的地方。


Control#setRedraw(boolean)做的JavaDoc說什麼:

如果參數是假的,會導致接收後續繪製操作被忽略。 在標誌設置爲真前,接收機中不會出現任何類型的圖紙。

Composite#setLayoutDeferred(boolean)不同的是,雖然它被設置爲false發生的事件將被緩存,它們將被執行,當它被設置爲true一次。


如果您調用這些方法與true後打電話.layout(),什麼都不會發生,如果你之前打電話給他們,該事件就會發生。

+0

這是否意味着Control#setRedraw(boolean)和Composite#setLayoutDeferred(boolean)通常沒有區別,除了您提到的緩存?我認爲Composite中的佈局控件獨立於繪製這些控件。我仍然不明白爲什麼一個方法被命名爲「setRedraw」和其他「setLayoutDeferred」,如果他們做同樣的事情。 – Steve

+0

@Steve爲什麼你不看看['Control']的源代碼(http://kickjava.com/src/org/eclipse/swt/widgets/Control.java.htm)和['Composite' ](http://kickjava.com/src/org/eclipse/swt/widgets/Composite.java.htm)? – Baz

0

調用composite.layout()意味着讓設置的佈局管理器設置子控件的位置。如果您已更改子控件的某些屬性或將影響佈局位置的配置佈局(主要取決於佈局管理器),請使用此選項。

使用

control.setRedraw(false); 
// other code 
control.setRedraw(true); 

,以提高性能,如果// other code進行了很多GUI的修改可能會觸發小了很多重繪的。