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

Linux下无法绘制覆盖标题区的SWT Group自定义边框

SWT Group组件自定义边框在Linux下无法覆盖标题区域的问题

我在SWT Java应用中,尝试为带标题的Group组件绘制自定义黑色边框,要求边框覆盖整个组件(包括标题区域)且不遮挡标题文本。但在Linux(RHEL 8)系统上,自定义边框无法正确覆盖整个Group组件,Windows系统下可正常工作。

表现差异

  • 实际表现:Linux下边框仅覆盖Group的内容区域,标题区域未被边框包裹,边框与标题间存在空隙
  • 预期表现:边框完整包围整个Group组件(含标题所在顶部区域),标题文本正常显示在边框上方

系统信息

  • Eclipse版本:2019-09 R (4.13)
  • SWT版本:4928
  • 操作系统:Linux(RHEL 8)
  • Java版本:11

已实现代码

我通过PaintListener和Event.gc.drawRectangle()实现了drawBorderOnGroup方法,尝试绘制覆盖标题区的边框,代码如下:

public static void drawBorderOnGroup(Group group){
    group.addPaintListener(new PaintListener() {
            @Override
            public void paintControl(PaintEvent e) {
                e.gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
                Rectangle clientArea = group.getClientArea();

                e.gc.drawRectangle(0, 0, clientArea.width - 1, clientArea.height - 1);
            }
        });
}

问题原因

Linux下SWT的Group组件getClientArea()返回的是标题下方的内容区域,不包含标题所在的顶部高度;而Windows下该方法的计算逻辑包含了标题区域,导致跨平台绘制结果不一致。

解决方法

方法一:使用组件自身尺寸绘制

直接获取Group的整体尺寸来绘制边框,确保覆盖整个组件:

public static void drawBorderOnGroup(Group group){
    // 禁用原生边框避免冲突(可选)
    group.setBorderVisible(false);
    
    group.addPaintListener(new PaintListener() {
            @Override
            public void paintControl(PaintEvent e) {
                Display display = group.getDisplay();
                e.gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
                Point size = group.getSize();
                // 绘制从组件左上角开始的完整边框,宽高减1避免超出范围
                e.gc.drawRectangle(0, 0, size.x - 1, size.y - 1);
            }
        });
}

方法二:通过computeTrim计算完整边界

利用computeTrim方法获取组件的装饰区域(含标题、边框等),结合内容区域尺寸计算整体边框范围:

public static void drawBorderOnGroup(Group group){
    group.setBorderVisible(false);
    
    group.addPaintListener(new PaintListener() {
            @Override
            public void paintControl(PaintEvent e) {
                Display display = group.getDisplay();
                e.gc.setForeground(display.getSystemColor(SWT.COLOR_BLACK));
                // 获取组件的装饰边距
                Rectangle trim = group.computeTrim(0, 0, 0, 0);
                Rectangle clientArea = group.getClientArea();
                // 计算完整组件的宽高
                int totalWidth = clientArea.width + trim.width;
                int totalHeight = clientArea.height + trim.height;
                e.gc.drawRectangle(0, 0, totalWidth - 1, totalHeight - 1);
            }
        });
}

内容的提问来源于stack exchange,提问作者Rajat

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:12:39