SWT布局和油漆

时间:2013-08-02 19:02:33

标签: java swt

我对SWT中的布局和绘图程序几乎没有疑问。

Fox的例子,我有一个带孩子的复合材料。当我调用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(true)并在该composite.layout之后调用时会发生什么?

此外,当我设置composite.setRedraw(false)并且在调用之后仍然发生相同的composite.layout()时会发生什么?

我花了一半的时间阅读javadoc并进行一些练习调查,但它没有说明这个问题。我无法理解这个API背后的理论。

提前致谢。

2 个答案:

答案 0 :(得分:1)

好的,让我试着解释一下:

此处涉及两种类型的Widget:可以具有布局(Composite及其子类)和其他Control的那些类型。

Paint事件发生时,Composite(如果它有Layout)将导致其子项重新绘制。如果孩子们也是Composite,他们会传播这个。如果它们是其他Control,则会重新绘制。

重新绘制Control意味着此控件的“状态”已更改,即为了正确表示其阶段,它必须执行某些操作。这可能是由调整大小事件引起的,或者是将鼠标悬停在它上面或点击它,基本上是视觉外观必须改变的所有内容。


Control#setRedraw(boolean)完全符合JavaDoc所说的内容:

  

如果参数为false,则会忽略接收器中的后续绘制操作。 在标志设置为true之前,接收器中不会出现任何类型的绘图。

Composite#setLayoutDeferred(boolean)的区别在于,当设置为false时发生的事件将被缓存,并且当它再次设置为true时将执行这些事件。


如果您在之后致电.layout() ,则会使用true调用这些方法,如果您之前致电该事件,则不会发生任何事情。

答案 1 :(得分:0)

调用composite.layout()意味着让设置布局管理器设置子控件位置。如果您更改了子控件的某些属性或将影响布局位置的配置布局(严重依赖于布局管理器),请使用此选项。

使用

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

如果// other code执行大量的GUI修改会触发大量较小的重绘,则可以提高性能。