Java 和 Eclipse 框架中的缩放处理方式不同

Scaling Handled Differently in Java and Eclipse Framework

我们在缩放显示器上使用 Paperclips(SWT 打印库)时遇到问题,但我认为这与框架无关,而且与 Eclipse 环境无关。

让我们看一个例子:

左边是没有缩放(或 100%)的打印,右边是在 175% 缩放的显示器上开始的相同打印。我知道您在想什么:显示器及其分辨率/缩放比例应该对打印没有影响。对,应该。

虽然这很令人难过,但这也不是什么大问题。但问题来了:上面的打印是由 JUnit 测试用例 运行 作为 plug-in 测试生成的。如果我 运行 它们作为常规单元测试 两者 工作。

很明显,在 OSGi 上下文中启动时,Eclipse 环境中的某些东西会有所不同,我正试图找出它是什么(这样我也许可以阻止它)。

而且我认为这是一个很好的谜题。

如果您需要有关 SWT class 可能是什么的提示,我将其缩小到 table 的文件 ScalePrint.java(即如果我删除 table 的实例=12=] 在我的演示中,table 显示正确;但是 header 仍然是错误的)。

我可以确认该错误仅存在于 Eclipse 4.6 中,而不存在于 4.5 或 3.7 中(这并不奇怪,因为 4.6 是第一个支持缩放的版本)。如果我将 -Dswt.autoScale=100 添加到 VM 选项以禁用缩放,它也会按预期工作。

我可以附加我的测试用例,但正如我所说,我真的不认为它与 Paperclips 本身有任何关系。

那么...与 运行在普通 Java 应用程序中使用相同代码相比,当整个 Eclipse 框架启动时,什么会破坏缩放?

问题是 class Transform 的使用,它本身使用静态字段 DPIUtil.deviceZoom(以 DPIUtil.autoScaleUp(float dx) 的形式)。

因为 DPIUtil.deviceZoom 是一个静态字段,所以当与具有缩放功能的主显示器一起使用时一切都会失败(因为打印机没有)。