最近用 Java Swing 写了一个windows端小工具,JRE版本1.8,使用exe4j打包成了exe。
电脑屏幕的辨率是1920*1080,由于系统开启了DPI缩放,所以在程序运行时,窗口被放大了,控件上的字体也变得很模糊。
查阅网上相关资料,主要是SO上的一个讨论(如何设置Java Swing程序的DPI?),给出了一些Java下的解决方法:
- 换用JavaFX编写GUI;
- 在JRE 9+上运行;
- 更改注册表;
- 右键->属性->兼容性,更改exe在高DPI下的设置。
因为程序也可能要在别的电脑上运行,每次都改配置的话就太麻烦了。又不想换JRE,又不想重写。所以,我最终参照了修改注册表的方式,直接修改exe内的程序配置:
- 使用EXE资源修改器(本人使用的是Resource Tuner)打开打包后的exe,读取内部资源;
- 找到Manifest配置文件,为
assembly
元素添加如下子元素:
<application xmlns="urn:schemas-microsoft-com:asm.v3">
<windowsSettings>
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true</dpiAware>
</windowsSettings>
</application>
如下图所示:
- 保存修改,再次运行exe程序就会发现界面已经自动禁用了系统缩放,大功告成。
参考链接:
- https://stackoverflow.com/questions/15659044/how-to-set-the-dpi-of-java-swing-apps-on-windows-linux
- https://answers.microsoft.com/en-us/surface/forum/surfpro4-surfnetwork/surface-pro-4-windows-10-remote-desktop-other/d17d4321-0f04-4a64-95b4-1c6dd5de9c91
- https://www.cnblogs.com/zhangjiantao/p/9217233.html