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
相关产品推荐
相关产品推荐

