【问题标题】:Java: Pixel-perfect drawing on JPanelJava:JPanel 上的像素完美绘图
【发布时间】:2019-05-20 00:09:24
【问题描述】:

我正在使用 OpenJDK 11:

openjdk 版本“11.0.1” 2018-10-16
OpenJDK 运行时环境 18.9(内部版本 11.0.1+13)
OpenJDK 64-Bit Server VM 18.9(build 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);
}

}

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

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

但是,当精确度真的很重要时,如何使其像素完美?

【问题讨论】:

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

标签: java jpanel drawing2d pixel-perfect


【解决方案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):错误行为

感谢大家的时间和帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-26
    • 2013-03-29
    • 2020-01-30
    • 1970-01-01
    相关资源
    最近更新 更多