如何让SWT.ON_TOP样式创建的Shell A始终置于Shell B之上?
让SWT.ON_TOP样式的Shell A始终保持在Shell B顶层的方法
当两个Shell都使用SWT.ON_TOP样式时,系统默认会根据窗口激活顺序决定层级,无法直接保证A始终在B上方。以下是两种可行的解决方案:
方法一:将Shell A设为Shell B的子Shell
把A设置为B的子Shell,结合SWT.ON_TOP样式,A会始终依附在B的上层,随B的移动、激活状态同步保持层级关系。代码示例:
// 假设Shell B已创建完成 Shell shellA = new Shell(shellB, SWT.ON_TOP | SWT.NO_TRIM); // 可按需添加其他样式(如边框、关闭按钮) shellA.setText("Shell A"); shellA.setSize(200, 100); shellA.open();
注意:子Shell会继承父Shell的部分行为,比如B最小化时A会自动隐藏,B关闭时A也会被销毁,若不需要此关联需额外处理。
方法二:监听Shell B的激活事件,强制前置A
如果不想让A成为B的子Shell,可以监听B的SWT.Activate事件,当B被激活时主动将A带到顶层:
shellB.addListener(SWT.Activate, event -> { if (!shellA.isDisposed()) { shellA.forceActive(); } });
注意:
- 若A本身也是
SWT.ON_TOP样式,此方法能保证A在B上方,但无法保证A在系统所有窗口最顶层(取决于其他ON_TOP窗口的优先级)。 - 可额外监听A的
SWT.Activate事件,避免出现A、B互相激活的循环切换问题。
额外提示
不同操作系统(Windows、Linux、Mac)对SWT窗口层级的处理逻辑略有差异,建议在目标平台上进行测试验证。
内容的提问来源于stack exchange,提问作者Bourbon_7
相关产品推荐
相关产品推荐

