在win10上用jdk13开发GUI程序,会发现界面的缩放比不对,可以通过如下代码测试:
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gs = (ge.getScreenDevices())[0];
GraphicsConfiguration gc = gs.getConfigurations()[0];
//之后调用Toolkit对象(可以getDefaultToolkit()获取)的getScreenSize()方法无法获得正确的屏幕分辨率
找了好多解决方法,其中说的最多的就是指定java.exe/javaw.exe等的高分辨率兼容性,实测该方法对win10,java13无效,原因如下:
GraphicsDevice在java中为一个抽象类,在java8和java13中二者继承树不同.在win10,java13中,由Win32GraphicsDevice类来实现GraphicsDevice中所有的抽象方法,该类的setNativeScale(…)方法被声明为native,即,如果需要调节缩放比,需要’覆盖’一个native方法.
java中的native方法的’覆盖’只能通过手动覆盖dll文件实现,所以大多数针对java8的办法无法解决java13的GUI分辨率问题.
(此问题待解决)
更新:此问题已解决
通过添加JVM参数限制dpi自适应及UI缩放即可 参数及对应值为 -Dsun.java2d.dpiaware=false -Dsun.java2d.uiScale=1