1

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

Fox 示例,我有一个带孩子的 Composite。当我调用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 背后的理论。

提前致谢。

4

2 回答 2

1

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

这里涉及两种类型的Widgets:那些可以有布局(Composites 及其子类)和其他Controls。

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

重绘aControl意味着这个控件的“状态”已经改变,即为了正确地表示它的阶段,它必须做一些事情。这可能是由调整大小事件引起的,或者将鼠标悬停在它上面或单击它,基本上是视觉外观必须更改的所有内容。


Control#setRedraw(boolean)完全按照 JavaDoc 所说的:

如果参数为假,则导致接收器中的后续绘图操作被忽略。在标志设置为 true 之前,接收器中不会发生任何类型的绘图。

不同之处Composite#setLayoutDeferred(boolean)在于,在设置为时发生的事件false将被缓存,并且在true再次设置为时执行。


如果你在用 调用这些方法.layout() 之后true调用,则不会发生任何事情,如果你之前调用它们,事件将会发生。

于 2013-08-03T08:48:32.800 回答
0

调用composite.layout()意味着让设置布局管理器设置子控件位置。如果您更改了子控件的某些属性或配置的布局会影响布局位置(很大程度上取决于布局管理器),请使用此选项。

利用

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

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

于 2013-08-03T16:29:15.017 回答