【问题标题】:How to dragged an image into JPanel如何将图像拖入 JPanel
【发布时间】:2017-08-21 17:50:36
【问题描述】:

目前我使用这个代码:

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

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

【问题讨论】:

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


【解决方案1】:

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

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

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

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

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

  • 但是如果没有repaint(),你强制新位置的图像立即绘制,但旧的内容从未清除,导致蛇效应。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多