簡體   English   中英

如何將圖像拖到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類中。 無論如何,結果是這樣的: Gif1

如果我刪除repaint()方法,結果是: Gif2

要拖動的圖像是BufferedImage對象

我的問題是:如何進行拖動而不出現閃爍或蛇紋效果?

這不是畫機制在Java中的工作方式。 要解釋您的問題,您需要了解以下幾點:

  • 當您想要永久性地繪制某些東西時,應重寫組件的paintComponent()方法以繪制所需的內容。 因此,出於您的目的,您應該將新圖像位置存儲在面板中,並在面板的paintComponent()方法中調用drawImage(image,newLocation.x,newLocation.y)。

  • 當您嘗試獲取getGraphics()並對其進行繪制時,所繪制的內容將立即顯示,但在下一輪繪制時將被清除。 這是因為每一輪塗料都會清除所有舊塗料,並要求所有組件再次塗料新塗料。

  • 當您觸發repaint()時,您請求進行新一輪繪畫,此請求已計划並合並,這不會立即發生,但可以保證稍后發生。 您應該始終調用repaint()而不是調用getGraphics()。doSomething(),更不用說如果未顯示組件,則getGraphics()可能返回null。

  • 這解釋了為什么使用repaint()時圖像會閃爍,因為您對getGraphics()。drawImage()的調用會強制其立即繪制某些內容,然后觸發了新一輪的paint(),這清除了舊內容,但是您確實不提供新的繪畫內容。 這導致顯示圖像然后清除圖像的效果。

  • 但是,如果沒有repaint(),則您迫使圖像在新位置立即繪制,但是舊內容從未清除,從而導致了蛇形效果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM