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