Отключить автоматическое изменение масштаба BufferedImage в JDK9
Я использую настраиваемое средство рендеринга для изменения масштаба экрана для моих 8-битных компьютерных эмуляторов, которое прекрасно работает в средах до Java 9. В Java 9 это создает треугольные искажения на главном экране, когда JVM автоматически изменяет размер экрана, чтобы приспособиться к различным разрешениям. Это наиболее заметно, когда в эмуляторе включены строки сканирования. Я подозреваю, что это как-то связано с тем, что ==> http://openjdk.java.net/jeps/263 поставляется в Java 9.
В качестве примера, эффект можно увидеть при выполнении следующей программы на мониторе 4K с использованием Java 9 в Windows 10.
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);
}
Ниже показано, как выглядит та же программа с использованием JDK 1.8.0_144, что является желаемым результатом.
Есть ли способ отключить автоматическое изменение размеров экранов по умолчанию в Java 9, которое также будет совместимо со средами до Java 9?
2 ответа
См. https://bugs.openjdk.java.net/browse/JDK-8189416 Кажется, это ошибка в коде Direct3D в JDK.
Обходной путь - "-Dsun.java2d.d3d=false" в командной строке.
Использование параметра -Dsun.java2d.uiScale=1.0 устраняет вышеуказанную проблему с предоставленными мною эмуляторами и тестовой программой. Я получил этот ответ от масштабирования JFrame в Java 9. Я бы предпочел программное решение, и отключение jdk 9 с высоким dpi для конкретной панели, похоже, является той же самой проблемой, что и моя проблема, и ответ при условии выглядит многообещающим.