2009-11-26 155 views
0

我正在嘗試製作一個Java Applet,它將允許我在畫布中繪製圖形數據結構。我將通過單擊我想要創建節點的位置並單擊節點來連接它們來完成此操作。問題是我不能讓paint()方法正確行爲。我添加mousePressed(MouseEvent e)方法內的圖形新節點(和畫布上正方形)使用,Java 2D圖形矩形

Graphics g = this.getGraphics(); 
g.setColor(Color.blue); 
g.fillRect(e.getX(), e.gety(), 40, 40); 

一切工作正常,直到我調整窗口的大小,然後將所有的填充的矩形消失。我重寫了paint方法只是一個空方法,但同樣的事情仍然發生。我不能在paint()內部添加fillRect命令,因爲我不知道在用戶使用鼠標與它進行交互之前存在什麼矩形。

如何在鼠標偵聽器方法中使用g.fillRect()並讓它們粘住?

回答

6

問題是你正在繪製的地方是不持久的。在任何時候,你都可能失去你所吸引的一切。在發生這種情況時調用paint(Graphics)方法。每當發生這種情況時,您將需要重新繪製整個圖片,或者需要放置畫布以根據需要繪製內容並將其複製到applet的Graphics。

下面介紹如何創建和繪製到圖像:
http://java.sun.com/docs/books/tutorial/2d/images/drawonimage.html

然後,在你的paint方法,用你的圖形的drawImage(...)方法來顯示你所創建的圖像。

+0

這似乎是最簡單的方法,我創建了一個新的BufferedImage,然後在其上繪製了所有的形狀,並使繪製方法繪製圖像。謝謝! – PherricOxide 2009-11-26 06:37:39

+1

沒問題,儘管最終可能需要完全重新繪製,所以請記住Kyl的建議。 (還有,記得投票並「接受」你喜歡的答案,我想要我的業力點:) – Gunslinger47 2009-11-26 06:46:28

+1

在這種特殊情況下,保存數據可能比緩存圖像更好。但是,+ 1爲了獲得兩個極端。 – 2009-11-26 06:46:31

6

我不知道如果我正確地讀這篇文章,但爲什麼不只是存儲在一個變量的最後一次點擊的位置稍後繪製paint()方法時會被繪製?

+0

這是正確的答案。 'mousePressed()'不需要自己做任何繪畫;它應該調用'repaint'並保存必要的信息,以便paint()可以完成它的工作。 – 2009-11-26 06:05:55

+0

我不需要在某處存儲所有點擊的位置,並且在重新繪製時遍歷該列表?我的理解是,paint()從一個空的畫布開始並從那裏開始。 – PherricOxide 2009-11-26 06:09:43

+1

@PherricOxide:是的,你會的。但是,無論您選擇何種解決方案,您都必須這樣做。你不能假設畫布不需要重新繪製。 – kylc 2009-11-26 06:16:05

0

圖形是臨時的。當一個地區變髒時,它將被重新粉刷。

最好的方法是創建一個BufferedImage,在mousePressed上繪製它並調用repaint。
調用paint時,將圖像繪製到傳遞的圖形對象上。這樣你就不需要存儲矩形,並且你得到了一個可以提高性能的緩衝區。