You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:30:58