如何在JFace现有顶层DialogA之上创建DialogB?
解决SWT中在DialogA之上创建带DIALOG_TRIM样式的DialogB问题
问题分析
你需要在顶层对话框DialogA之上显示DialogB,现有两种尝试存在以下问题:
- 尝试1:DialogB以DialogA的Shell为父,层级正确但
SWT.DIALOG_TRIM样式丢失 - 尝试2:DialogB以null为父,样式保留但层级在DialogA下方
解决方案
核心是让DialogB以DialogA的Shell作为父容器,同时正确配置Shell样式,避免Dialog默认样式覆盖SWT.DIALOG_TRIM。具体实现如下:
1. 正确实现DialogB类
public class DialogB extends Dialog { public DialogB(Shell parentShell) { super(parentShell); // 组合所需样式:DIALOG_TRIM(对话框边框/标题栏)+ ON_TOP(置顶)+ APPLICATION_MODAL(模态,可根据需求替换为MODELESS) setShellStyle(SWT.DIALOG_TRIM | SWT.ON_TOP | SWT.APPLICATION_MODAL); } @Override protected void configureShell(Shell newShell) { super.configureShell(newShell); // 设置对话框标题,确保DIALOG_TRIM的标题栏正常显示 newShell.setText("Dialog B"); } }
2. 正确打开对话框
DialogA dialogA = new DialogA(); dialogA.setBlockOnOpen(false); // 让DialogA非阻塞,允许后续打开DialogB dialogA.open(); // 传入DialogA的Shell作为DialogB的父容器,保证层级在DialogA之上 DialogB dialogB = new DialogB(dialogA.getShell()); dialogB.open();
关键说明
- 尝试1样式丢失原因:SWT的
Dialog类在传入父Shell时,会默认添加模态相关样式,仅设置SWT.DIALOG_TRIM | SWT.ON_TOP会被默认样式覆盖;显式组合模态/非模态样式后,DIALOG_TRIM就能正常生效。 - 尝试2层级错误原因:以
null为父的Dialog是独立顶层窗口,操作系统会根据窗口创建顺序和ON_TOP属性排层级,DialogA先打开且带SWT.ON_TOP,所以DialogB会被压在下方。
内容的提问来源于stack exchange,提问作者Preston
相关产品推荐
相关产品推荐

