Java: идеальное рисование на JPanel

Я использую OpenJDK 11:

openjdk версия "11.0.1" 2018-10-16
Среда выполнения OpenJDK 18.9 (сборка 11.0.1 + 13)
OpenJDK 64-битный сервер ВМ 18.9 (сборка 11.0.1+13, смешанный режим)

Пытаясь сделать приложение, рисующее что-то в JPanel, я заметил некоторые досадные неточности.

Предполагается, что следующий фрагмент кода рисует ряд линий одна под другой (обмен цветами должен продемонстрировать, что происходит):

class TestPanel extends JPanel {
@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);

    setBackground(Color.WHITE);

    g.setColor(Color.RED);
    g.drawLine(301, 1, 350, 1);
    g.setColor(Color.BLUE);
    g.drawLine(301, 2, 350, 2);
    g.setColor(Color.GREEN);
    g.drawLine(301, 3, 350, 3);
    g.setColor(Color.RED);
    g.drawLine(301, 4, 350, 4);
    g.setColor(Color.BLUE);
    g.drawLine(301, 5, 350, 5);
    g.setColor(Color.GREEN);
    g.drawLine(301, 6, 350, 6);
    g.setColor(Color.RED);
    g.drawLine(301, 7, 350, 7);
    g.setColor(Color.BLUE);
    g.drawLine(301, 8, 350, 8);
    g.setColor(Color.GREEN);
    g.drawLine(301, 9, 350, 9);
    g.setColor(Color.RED);
    g.drawLine(301, 10, 350, 10);
}

}

Однако вместо прорисовки линий одна под другой между некоторыми линиями есть промежутки:Линии нарисованы с пробелами

Я полагаю, это может быть вызвано чем-то вроде преобразования между виртуальной и физической системами координат.

Однако, как сделать его идеальным для пикселей, когда точность действительно имеет значение?

1 ответ

Я проверял это на нескольких выпусках JDK. Результаты: Среда выполнения OpenJDK (сборка 1.8.0_40-b25): работает правильно
Среда выполнения OpenJDK (сборка 9+181): неправильное поведение
Среда выполнения OpenJDK 18.3 (сборка 10.0.2+13): неправильное поведение
Среда выполнения OpenJDK 18.9 (сборка 11.0.1+13): неправильное поведение

Спасибо всем за ваше время и помощь.

Другие вопросы по тегам