Control.requestLayout()真为异步执行?代码与文档描述不符的疑问
关于SWT Control.requestLayout() 文档与代码的“矛盾”解析
- 核心关键在于
Control.requestLayout()调用layout方法时传入了SWT.DEFER参数,这直接决定了布局的执行时机 - 拆解
org.eclipse.swt.widgets.Composite.layout(Control[], int)的逻辑:- 该方法会根据传入的flags参数走不同分支:
- 若未传入
SWT.DEFER,才会触发你看到的①处逻辑——立即布局目标控件及其所有祖先 - 若传入了
SWT.DEFER,方法仅会标记目标控件及其祖先为「待布局状态」,不会同步执行任何重定位计算
- 若未传入
- 该方法会根据传入的flags参数走不同分支:
- 对应文档描述的合理性:
- “控件不会被同步重定位”:因为
SWT.DEFER将布局操作延迟到UI事件循环的下一个周期统一处理,而非调用方法时同步完成 - “多次调用为低成本空操作”:多次调用只会重复标记待布局状态,这个标记操作本身开销极低,不会触发重复的布局计算
- “控件不会被同步重定位”:因为
- 产生“矛盾”错觉的原因:
- 你可能只关注了
Composite.layout中立即布局的代码分支,忽略了SWT.DEFER参数对应的延迟标记逻辑,二者属于完全不同的执行路径
- 你可能只关注了
内容的提问来源于stack exchange,提问作者Bourbon_7
相关产品推荐
相关产品推荐

