如何将图像拖入JPanel

时间:2017-08-21 17:50:36

标签: java swing graphics drag-and-drop jpanel

目前我使用此代码:

    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对象

我的问题是:如何在没有闪烁或蛇效应的情况下进行拖动?

1 个答案:

答案 0 :(得分:0)

这不是绘制机制在Java中的工作方式。要解释您的问题,您需要了解以下几点:

  • 如果要永久绘制某些内容,则应覆盖组件的paintComponent()方法以绘制所需的内容。因此,为了您的目的,您应该在面板中存储新的图像位置,并在面板的paintComponent()方法中调用drawImage(image,newLocation.x,newLocation.y)。

  • 当你尝试getGraphics()并为其绘制一些东西时,你画的东西会立即出现,但它会在下一轮画出时被清除。这是因为每一轮涂料都会清除所有旧的涂料,并要求所有组件再次涂上新的东西。

  • 当你触发repaint()时,你请求新一轮的绘制,这个请求被安排和合并,这不会立即发生,但保证会在以后的某个时间发生。你应该总是调用repaint()而不是调用getGraphics()。doSomething(),而不是提到如果组件没有显示,getGraphics()可能会返回null。

  • 这解释了为什么使用repaint()时,图像会闪烁,因为你调用getGraphics()。drawImage()强制它立即绘制一些东西,然后你触发了一轮新的paint(),它清除了旧内容,但您没有提供新的内容。这导致图像显示然后图像清除效果。

  • 但是如果没有重绘(),你就会迫使新位置的图像立即绘制,但旧内容永远不会被清除,导致蛇效应。