绘制BufferedImage。重绘()

时间:2011-04-07 16:45:45

标签: java image swing

我有一个组件,我在所有表面上绘制BufferedImage。 我想在鼠标经过该区域后,在它上面画一些东西。 为此,我在组件上添加了MouseMotionListener并实现了mouseMove方法。在mouseMoved方法中,我在光标图像绘制的绘图结束时调用repaint()。我想知道是否有更好的方法,因为光标后面的图像非常小,而且我每次都重新绘制每一个东西。

2 个答案:

答案 0 :(得分:1)

使用缓冲的图像将包含图标的JLabel添加到面板。

然后当您移动鼠标时,只需更改标签的位置即可。 Swing将重新绘制最后一个位置,以便缓冲图像显示,然后它将重新绘制新位置的标签。所以让Swing管理重绘。

答案 1 :(得分:1)

既然您知道了鼠标的坐标以及要在背景上绘制的小图像,您可以像这样优化[伪代码]:

void mouseMoved(event) {
  lastCoordinates = currentCoordinates;
  currentCoordinates = event.coordinates;

  image.repaint(lastCoordinates.x, lastCoordinates.y, smallImage.width, smallImage.height);
  image.repaint(currentCoordinates.x, currentCoordinates.y, smallImage.width, smallImage.height);
}

这样你只会重新绘制你真正关心的两个区域而不是整个背景。

另外,读取javadoc似乎上面的代码实际上会触发2次单独调用绘制内容,这样效率很低。您可能希望尝试传递10毫秒左右的值,以确保2个涂料一起执行。

查看带有4和5个参数的repaint()的javadoc: