我对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背后的理论。
提前致谢。
答案 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修改会触发大量较小的重绘,则可以提高性能。