目前我使用此代码:
public void mouseDragged(MouseEvent e) {
try {
repaint();
getGraphics().drawImage(TreeDrag.obj.getImg(), getMousePosition().x, getMousePosition().y, null);
} catch (HeadlessException | IOException e1) { e1.printStackTrace(); }
}
在我的JPanel课程中。无论如何结果如下:Gif1
如果我删除repaint()
方法,则结果为:Gif2
要拖动的图像是BufferedImage对象
我的问题是:如何在没有闪烁或蛇效应的情况下进行拖动?
答案 0 :(得分:0)
这不是绘制机制在Java中的工作方式。要解释您的问题,您需要了解以下几点:
如果要永久绘制某些内容,则应覆盖组件的paintComponent()方法以绘制所需的内容。因此,为了您的目的,您应该在面板中存储新的图像位置,并在面板的paintComponent()方法中调用drawImage(image,newLocation.x,newLocation.y)。
当你尝试getGraphics()并为其绘制一些东西时,你画的东西会立即出现,但它会在下一轮画出时被清除。这是因为每一轮涂料都会清除所有旧的涂料,并要求所有组件再次涂上新的东西。
当你触发repaint()时,你请求新一轮的绘制,这个请求被安排和合并,这不会立即发生,但保证会在以后的某个时间发生。你应该总是调用repaint()而不是调用getGraphics()。doSomething(),而不是提到如果组件没有显示,getGraphics()可能会返回null。
这解释了为什么使用repaint()时,图像会闪烁,因为你调用getGraphics()。drawImage()强制它立即绘制一些东西,然后你触发了一轮新的paint(),它清除了旧内容,但您没有提供新的内容。这导致图像显示然后图像清除效果。
但是如果没有重绘(),你就会迫使新位置的图像立即绘制,但旧内容永远不会被清除,导致蛇效应。