发布时间:2026/8/31 19:44:59
从一条 SQL 到一张面积图:DBeaver 自定义图表实现路径 从一条 SQL 到一张面积图DBeaver 自定义图表实现路径【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver这篇笔记做的事就一件给 DBeaver 这个免费通用数据库工具加上自定义图表——两张原生 UI 里没有现成入口的面积图和雷达图。走的路线不是接 Web 组件而是直接在 SWT Canvas 上画并沿现有渲染链路把 SQL 结果集一步步映射到绘制调用。读者画像有基本 Java/SWT 经验、会用 Maven但没接触过 OSGi 插件体系。DBeaver 的图表数据到底从哪来答案不神秘从结果集来。DBeaver 的图表能力放在 ui.charts 插件里核心是 BaseChartComposite.java——它包了一层 JFreeChart 的 SWT 控件。JFreeChart 是纯 Java 图表库API 层就是 Java2D可以理解成渲染层是 Java2D 的图表库这也是为什么 DBeaver 的图最终都是画在画布上的。数据链路一共四跳每一跳都有现成代码可以对读SELECT ...结果集行 ↓ Dataset序列 × 类别 的二维数据 ↓ Chart 对象数据 绘制规则 ↓ SWT CanvasPaint 事件触发重绘真正值得看的入口是BaseChartComposite.setChart(JFreeChart)图表组件只负责拿一个已经装好数据的 JFreeChart 对象缩放、复制图片、另存为这些右键菜单都在基类里实现好了扩展时不用重写。一个真实的消费方是 DashboardRendererDatabaseChart.java仪表盘渲染器执行配置好的 SQL把返回的行映射成序列再交给 DashboardChartComposite.java 显示。自定义图表要做的就是在这条链路上换掉或补上数据→Chart这一段。想挂进图表到底该找哪个扩展点⚠️ 这里有个容易忽略的点翻一下 plugin.xml 会发现charts 插件只声明了org.eclipse.ui.themes这一个扩展点10 个图表主题色的colorDefinition网上一些文章里提到的图表提供器扩展点在仓库里并不存在。别指望挂扩展点真实的接入方式是自己的新插件 OSGi 依赖 charts 插件继承或组合BaseChartComposite再以普通视图/命令的形式注册出来。OSGi 插件机制 ≈ Java 生态里的 npm插件运行时安装、按声明的依赖组装所以依赖某个插件只写在 MANIFEST 的 Require-Bundle 里一行 pom 声明依赖 charts 插件即可。上面这张是独立版应用的启动画面对应 product 目录下的打包配置。想让新插件进正式发行包需要在 product 文件里补一行插件 id——属于打包配置本文不展开。所有改动都发生在你本地克隆的副本或自建的扩展模块里上游仓库保持只读git clone https://gitcode.com/GitHub_Trending/db/dbeaver不接 Browser怎么在 Canvas 上画面积图理由先说清楚DBeaver 是 SWT 桌面应用引一个嵌入式浏览器渲染 JS 图表内存和启动时间都会涨还多一层脚本注入的调试成本。而项目里本来就自带 SWTPaintCanvas.java——一个把 Java2D 绘制桥接到 SWT GC 的画布等于官方已经在走 Canvas 原生渲染这条路。自绘面积图就是在这条路上再往前一步拿 GC 直接画多边形。下面这段做三件事把数据坐标换算成像素坐标注意 SWT 的 y 轴朝下要翻转、在底部补两个点把折线闭合成多边形、先填充再描边。数据数组是调用方从结果集里提前转好的这里不再涉及 SQL。void drawArea(GC gc, Rectangle b, double[] xs, double[] ys, double yMax) { int n xs.length; if (n 2) return; int[] px new int[n 2], py new int[n 2]; for (int i 0; i n; i) { px[i] b.x (int) ((xs[i] - xs[0]) / (xs[n - 1] - xs[0]) * b.width); py[i] b.y b.height - (int) (ys[i] / yMax * b.height); } px[n] px[n - 1]; py[n] b.y b.height; // 落到基线 px[n 1] px[0]; py[n 1] b.y b.height; gc.fillPolygon(px, py); // 填充区域 gc.drawPolyline(px, 0, n); // 顶部折线 }雷达图是同一思路的旋转版把每个维度当成极坐标上的一个顶点按角度摊开后再闭合成多边形。下面这段只画数据多边形网格环和轴线省略逻辑完全相同。void drawRadar(GC gc, Point c, int r, double[] values, double maxValue) { int k values.length; int[] gx new int[k], gy new int[k]; for (int i 0; i k; i) { double a Math.PI * 2 * i / k - Math.PI / 2; // 从正上方起算 double len r * values[i] / maxValue; gx[i] (int) (c.x Math.cos(a) * len); gy[i] (int) (c.y Math.sin(a) * len); } gc.fillPolygon(gx, gy, new Color(parent.getDisplay(), 44, 165, 233, 110)); gc.drawPolyline(gx, gy); }GCGraphics Context就是手里的笔Canvas 是那张纸Paint 事件里画完必须gc.dispose()这个稍后在 Demo 里会体现。颜色怎么取才不会被深色主题打脸 图表的颜色不该硬编码。charts 插件通过主题扩展点声明了 10 个颜色 id取色统一走 IDE 主题注册表项目里 BaseChartDrawingSupplier.java 就是按这个序列给 JFreeChart 供色的。自绘代码里同样应该这么取而不是把 RGB 写死在类里。下面这段从主题注册表按 id 取色。注册表可以理解为一份全 IDE 共享的色卡切换主题后取到的就是新值// 取 charts 插件主题序列里的第 1 个颜色 ITheme theme PlatformUI.getWorkbench() .getThemeManager().getCurrentTheme(); Color c1 theme.getColorRegistry() .getColor(org.jkiss.dbeaver.ui.data.chart.color.1);如果跳过这步会怎样颜色写死成亮色用户切到深色主题后你的图表会刺眼地跳出界面而旁边原生图表的颜色却一切正常。最小可运行 Demo 怎么组装三步建一个依赖 charts 插件的新插件模块放一个承载画布的组合控件注册一条命令或视图把它挂出来。画布侧的骨架就是下面这段它负责把前文的两个绘制方法接进 SWT 事件循环Paint 和 Resize 两个监听缺一不可——前者忘了gc.dispose()会泄漏句柄后者忘了窗口拉伸后画面不会跟着重画。Canvas canvas new Canvas(parent, SWT.NONE); canvas.setBackgroundParent(); canvas.addListener(SWT.Paint, e - { GC gc e.gc; gc.setAntialias(SWT.JUST); Rectangle b canvas.getClientArea(); drawArea(gc, b, xs, ys, yMax); drawRadar(gc, new Point(b.width / 2, b.height / 2), b.height / 3, radar, 1.0); gc.dispose(); }); canvas.addListener(SWT.Resize, e - canvas.redraw());✅ 跑通后右键菜单、缩放手势这些能力直接从BaseChartComposite继承来不用自己再写一遍。常见报错速查现象多半的原因Paint 回调里画一片空白Canvas 还没 layoutgetBounds()是 0先确认父容器已布局颜色 id 取出来是 nullMANIFEST 里没依赖 charts 插件主题注册表里查不到该 id折线锯齿严重忘了gc.setAntialias(SWT.JUST)多序列时数据错位结果集转xs/ys时没按序列下标对齐第 N 列混进了第 M 列你可能会遇到行数一多Paint 里同步换算坐标就开始掉帧。解法不在绘制算法而在于把结果集→数据数组的换算挪出 Paint 回调换成数据就绪时一次性算好。下一步可以试试把drawArea里的线性比例尺换成对数刻度看长尾分布的数据是否还读得下去或者把整幅图预渲染成离屏Image量一下 10 倍数据量下的刷新差异。一个留给自己的问题当序列多到 20 条以上是继续加图例还是该拆成小多图small multiples了【免费下载链接】dbeaverFree universal database tool and SQL client项目地址: https://gitcode.com/GitHub_Trending/db/dbeaver创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/8/31 19:39:59

游戏服务器校招笔试核心考点拆解:从TopK到epoll的实战指南

要说我为什么对这份卷子印象深,其实很简单:游戏服务器开发这个方向,能拿来在校招笔试里成套考察的内容就那些,但网易2018这套题的出题思路非常规整,算法、网络、并发、数据库、业务场景设计全都有,而且大部…

2026/8/31 19:39:59

复盘网易2018校招开发笔试卷:核心考点与备考策略

前几年整理旧电脑,翻出一份"网易2018校招开发工程师(北京)笔试卷"的存档。当时我是真刀真枪上考场的那批人,卷子做完就存了一份,后来带团队、筛简历,又拿它当过几次模拟题给新人练手。说来也怪&a…

2026/8/31 19:39:59

2018网易开发工程师笔试题解析:核心考点与备考策略

几家大厂里面,网易的校招笔试题一直有点“怪”——不全是刷题就能刷出来的那种。2018年这场面向北京开发工程师岗位的笔试,我后来复盘了很多遍,发现它的出题思路和现在很多AI应用开发、全栈开发岗位的面试其实是一脉相承的。你光会写代码不够…

2026/8/31 20:00:00

Shannon自动化渗透测试实战:从安装到漏洞报告只需四步

Shannon自动化渗透测试实战:从安装到漏洞报告只需四步 【免费下载链接】shannon Shannon is an AI pentester for web applications and APIs. It analyzes your source code, identifies attack vectors, and executes real exploits to prove vulnerabilities bef…

2026/8/31 20:00:00

ThinkPHP 5.0.7 老项目维护:从解压部署到安全升级全指南

简介:本资源为ThinkPHP V5.0.7官方框架完整源码包,面向PHP初学者与Web开发工程师,解决快速搭建标准化MVC应用、理解现代PHP框架设计原理及实践依赖注入、自动路由、CLI工具等核心机制的问题。压缩包共190个文件,含154个PHP核心类与…

2026/8/31 20:00:00

积分商城源码落地指南:选型、数据库设计与部署全解析

简介:这是一套面向中小电商创业者、IT技术人员及二次开发者的积分商城系统源码,解决网购平台快速搭建、积分营销体系构建与商品互动玩法落地等核心需求。资源包共2000个文件,涵盖317个PHP后端逻辑、671个HTML前端页面、340个CSS样式、237个JS…

2026/8/31 19:55:00

Simulink电池模型合集详解:从等效电路到SOC估算与实操避坑

简介:本资源是面向新能源汽车、储能系统及电力电子方向的科研人员与高校师生的动力电池与混合储能系统Simulink建模仿真合集,聚焦锂离子电池、磷酸铁锂电池、铅酸电池、质子交换膜燃料电池及超级电容器等多类型电化学储能器件的建模与协同仿真。包内共70…

2026/8/31 1:05:20

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/31 2:14:20

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/8/31 1:41:28

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/8/31 0:07:32

STM32C5设备支持包(IAR DFP)安装指南与常见坑

上一阵子在IAR里折腾一块基于STM32C5系列的新板子,工程从STM32CubeMX导出来之后怎么都编译不过。报错信息很干脆:找不到设备描述文件。跟着错误路径去查,发现指向的是一个让我愣了一下的名字:STMicroelectronics.stm32c5xx.2.1.0.…

2026/8/31 0:07:32

STM32N657 SWO引脚矛盾:CubeMX显示PB3,数据手册为PB5

拿到STM32N657这颗料的第一天,我就撞上了一个让人原地懵圈的引脚矛盾:CubeMX里清清楚楚显示SWO在PB3,翻开数据手册的引脚说明表,却赫然写着PB5。对于一个靠SWO输出调试日志吃饭的人而言,这种"工具和手册打架"…

2026/8/31 12:44:45

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/31 9:19:59

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/31 6:53:02

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…