Eclipse RCP应用中JFreeChart在OpenJDK14下渲染放大问题求助
我之前在迁移Eclipse RCP应用到OpenJDK新版本时,也碰到过几乎一模一样的高DPI适配问题,给你几个亲测有效的解决方向:
1. 强制关闭SWT自动缩放
OpenJDK14默认启用了更完善的HiDPI支持,SWT会根据系统DPI自动缩放控件,但JFreeChart老版本可能没跟上这个适配节奏,导致图表被莫名放大1.25倍。你可以在应用启动参数里添加:
-Dswt.enable.autoScale=false
或者直接指定缩放比例为100%:
-Dswt.autoScale=100
这样能强制SWT控件不进行自动缩放,图表就能正常适配Composite的大小了。
2. 监听Resize事件手动适配图表尺寸
窗口还原再最大化后显示正常,说明SWT重新计算控件尺寸时图表能正确适配。那我们可以主动监听Composite的Resize事件,在尺寸变化时手动调整图表的边距和尺寸:
chartComposite.addListener(SWT.Resize, event -> { Rectangle clientArea = chartComposite.getClientArea(); // 手动设置绘图区边距,避免元素超出边界 XYPlot plot = (XYPlot) chart.getPlot(); plot.setInsets(new Insets(15, 20, 15, 20)); // 数值根据你的布局调整 // 强制图表重绘 chartComposite.redraw(); });
这样每次Composite尺寸变化时,图表都会重新适配当前的可用区域。
3. 升级JFreeChart版本
如果你的JFreeChart版本比较老(比如低于1.5.x),很可能对OpenJDK14的高DPI支持不足。尝试升级到最新的稳定版(比如1.5.3或更高),新版本修复了不少跨JDK的适配问题,说不定直接就能解决这个缩放异常。
4. 调整RCP应用的设备缩放因子
在Eclipse RCP的产品配置文件里,添加启动参数强制设备缩放因子为1:
-Dorg.eclipse.swt.internal.deviceScaleFactor=1
这个参数会让SWT忽略系统的DPI设置,所有控件都按1:1比例渲染,从根源上避免自动缩放带来的问题。
问题根源补充
Oracle JDK8的高DPI支持非常有限,基本不会自动缩放控件;而OpenJDK14默认开启了HiDPI适配,SWT会根据系统的缩放比例(比如125%)自动放大控件,但JFreeChart的ChartFactory创建的图表没有正确处理这个缩放系数,导致图表元素放大后超出了Composite的显示范围。而窗口还原再最大化时,SWT会重新计算控件的实际可用尺寸,JFreeChart此时能正确适配,所以显示恢复正常。
内容的提问来源于stack exchange,提问作者Karthik P K

