在JDK9中禁用BufferedImage的自动重新缩放

时间:2017-10-13 19:23:48

标签: windows-10 java-9 hidpi

我使用自定义渲染器来重新调整我的8位计算机模拟器的屏幕,这些模拟器在Java 9之前的环境中运行良好。在Java 9中,当JVM自动调整屏幕大小以适应不同的分辨率时,它会在主屏幕上创建三角形失真。在仿真器中启用扫描线时最明显。我怀疑它与此有关==> {9}以Java 9交付。

例如,在Windows 10上使用Java 9在4K显示器上执行以下程序时可以看到效果。

public static void main(String[] args){
    JFrame frame=new JFrame("Java version 9");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    BufferedImage image =new BufferedImage(800,600,BufferedImage.TYPE_INT_RGB);
    Graphics2D g=image.createGraphics();
    g.setColor(Color.WHITE);
    for(int y=0;y<image.getHeight();y+=2){
        g.drawLine(0,y,image.getWidth(),y);
    }
    g.dispose();
    ImageIcon imageIcon=new ImageIcon(image);
    JLabel label=new JLabel(imageIcon);
    frame.add(label);
    frame.pack();
    frame.setVisible(true);
}

图1 http://openjdk.java.net/jeps/263

以下是使用JDK 1.8.0_144的相同程序的外观,这是期望的结果。

图2。 enter image description here

是否有办法禁用Java 9中与Java 9前环境兼容的屏幕默认自动重新缩放?

2 个答案:

答案 0 :(得分:1)

参见https://bugs.openjdk.java.net/browse/JDK-8189416 它似乎是JDK中Direct3D代码中的一个错误。

解决方法是&#34; -Dsun.java2d.d3d = false&#34;在命令行上。

答案 1 :(得分:1)

使用选项-Dsun.java2d.uiScale = 1.0修复了我提供的模拟器和测试程序的上述问题。我从JFrame scaling in Java 9得到了答案。我更喜欢程序化的解决方案,jdk 9 high dpi disable for specific panel似乎与我的问题完全一样,并且提供的答案看起来很有希望。