Java:JPanel上的像素完美绘图

Java:JPanel上的像素完美绘图,java,jpanel,drawing2d,pixel-perfect,Java,Jpanel,Drawing2d,Pixel Perfect,我正在使用OpenJDK 11: openjdk版本11.0.1 2018-10-16 OpenJDK运行时环境18.9版本11.0.1+13 OpenJDK 64位服务器VM 18.9版本11.0.1+13,混合模式 在尝试用JPanel制作一个应用程序时,我注意到一些恼人的错误 下面的代码应该画一系列线,一条在另一条下面,交换颜色以演示正在发生的事情: class TestPanel extends JPanel { @Override protected void paintCompone

我正在使用OpenJDK 11:

openjdk版本11.0.1 2018-10-16 OpenJDK运行时环境18.9版本11.0.1+13 OpenJDK 64位服务器VM 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);
}
}

但是,有些线之间存在间隙,而不是一条线在另一条线下方绘制:

我想这可能是由虚拟坐标系和物理坐标系之间的转换引起的


然而,当精确性真的很重要时,如何使其像素完美呢?

我在几个jdk版本上对其进行了测试。结果如下: OpenJDK运行时环境构建1.8.0_40-b25:正常工作 OpenJDK运行时环境构建9+181:错误行为 OpenJDK运行时环境18.3版本10.0.2+13:错误行为 OpenJDK运行时环境18.9版本11.0.1+13:错误行为


谢谢大家的时间和帮助。

这张图片是否代表了您发布的代码?这是您实际使用的代码吗?图像包含12行,但我要说的是,如果存在精度问题,您仍然会有10行或11行,其中缺少1或2条彩色线。另一个问题:您在其他JDK/版本中尝试过吗?你会得到不同的结果吗?至于像素的完美性:你可以尝试构建一个光栅化图像,自己设置像素值,或者绘制到它,然后将图像绘制到面板上。@Thomas:是的,这是一个实际的工作代码。是的,这是一个问题,这些间隙会产生额外的线条。简单地说,有些坐标似乎是四舍五入的,例如,请求的1,5被转换为1,6。我还没有在其他Java版本上试用过,我在OracleJDK8上试用过,效果非常好。。。这可能是OpenJDK的一个bug。