2011-04-07 138 views
1

我有一个组件,我在其上绘制所有表面上的BufferedImage。 我想绘制更多的东西,当它通过该区域时,按下鼠标。 要做到这一点,我要在组件上添加一个MouseMotionListener并实施mouseMove方法。在mouseMoved方法内部,我在光标图像绘制结束时调用repaint()。我想知道是否有更好的方法来做到这一点,导致光标后面的图像非常小,我每次都在重绘每一件东西。通过BufferedImage绘图。重绘()

+0

我改变所有的* “IM” 编辑您的帖子* *“我是”* ......你担心什么? * repaint()*效率不高,或者您在BufferedImage中执行的绘图效率不高? – SyntaxT3rr0r 2011-04-07 16:51:29

+0

每次调用repaint来绘制所有组件效率都不高,我在光标旁边的绘图宽度为1px,并占用了组件的整个高度。我的组件上有一个bufferedimage,宽度为400px,所以我想要更好的方法来做到这一点。 JLabel可能是解决方案。 – wotan2009 2011-04-07 18:01:36

回答

1

将包含Icon的JLabel添加到带有缓冲图像的面板。

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

+0

JLabel可以隐形或每次输入组件时都必须创建一个? – wotan2009 2011-04-07 18:03:20

+0

JLabel的问题是我必须知道我的组件的大小来做图标。 – wotan2009 2011-04-07 18:22:22

+0

@ wotan2009,setVisible(...),setSize(getPreferredSize()) – camickr 2011-04-08 03:13:24

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种颜料一起执行。

检查出重绘的javadoc(),它4个5个参数:由