首页 > 解决方案 > 无 arg 的 repaint() 是否比带 args 的 repaint() 更好?

问题描述

我想在 a 上画一些东西,JPanel然后阅读并练习表演自定义绘画课程。当谈到使用repaint我觉得更新广场时,使用这个结构

private void moveSquare(int x, int y) {
  if ((squareX != x) || (squareY != y)) {
     squareX = x;
     squareY = y;
     repaint();
  }
}

与这个推荐的例子相比,为这个特定的例子提供了更好的油漆性能

private void moveSquare(int x, int y) {
  int OFFSET = 1;
  if ((squareX != x) || (squareY != y)) {
     repaint(squareX, squareY, squareW + OFFSET, squareH + OFFSET);
     squareX = x;
     squareY = y;
     repaint(squareX, squareY, squareW + OFFSET, squareH + OFFSET);
  }
}

如果我使用后者,则在拖动过程中,正方形看起来有点“压扁”。

我知道,这是一个非常基本的示例,但总体上它使 Java 图形性能有些害怕。

标签: javaperformanceswinggraphics

解决方案


进行两次重绘是不自然的。

而何时只重绘新旧广场的结合?

private void moveSquare(int x, int y) {
  if (squareX != x || squareY != y) {
     final int OFFSET = 1;
     int minx = Math.min(x, squareX);
     int miny = Math.min(y, squareY);
     int dx = Math.abs(x - squareX);
     int dy = Math.abs(y - squareY);

     squareX = x;
     squareY = y;
     repaint(minx, miny, squareW + dx + OFFSET, squareH + dy + OFFSET);
  }
}

当正方形相对较小或超出显示区域(剪裁)时,这应该更平滑。


推荐阅读