如何将图像拖到 JPanel 中

How to dragged an image into 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 class 中。总之结果是这样的:Gif1

如果我删除 repaint() 方法,结果是:Gif2

要拖动的图像是 BufferedImage 对象

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

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

  • 当你想永久地绘制一些东西时,你应该覆盖组件的 paintComponent() 方法来绘制你想要的东西。因此,为了您的目的,您应该将新图像位置存储在面板中,并在面板的 paintComponent() 方法中调用 drawImage(image, newLocation.x, newLocation.y)。

  • 当您尝试 getGraphics() 并向其绘制内容时,您绘制的内容会立即出现,但会在下一轮绘制发生时清除。这是因为每一轮绘制都会清除所有旧绘制的东西并要求所有组件重新绘制新东西。

  • 当你触发 repaint() 时,你请求新一轮的绘制,这个请求被安排并合并,这不会立即发生,但保证会在稍后发生。您应该始终调用 repaint() 而不是调用 getGraphics().doSomething(),更不用说如果组件未显示,getGraphics() 可能 return null。

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

  • 但是如果没有repaint(),你强制在新位置的图像立即绘制,但是旧的内容永远不会被清除,造成蛇效应。