2011-11-18 66 views
6

通常,當我調用getGraphics()時,即使設置了xxx.getGraphics(),它也會返回null。 xxx可見(正如谷歌搜索顯示的那樣...)調用getGraphics()返回null的任何替代方法

但這不起作用,這讓我感到沮喪,因爲在C-Sharp中做起來很簡單容易。

有沒有人知道更好的方式來做到這一點,而不是使用getGraphics()?

+3

你能否給我們提供一個上下文?也許包括一個[sscce](http://www.sscce.org)展示你的問題。 – mre

+1

如果您嘗試自定義繪製組件的方式,請覆蓋'paintComponent'並將您的繪圖代碼放在那裏。 – lhballoti

回答

11

您通常不希望在Java Swing組件上使用getGraphics,因爲如果該組件尚未渲染,並且即使該組件已被渲染並且Graphics對象返回不爲null,它也將爲null通常是一個短暫的對象,如果組件被重新繪製(一個超出你的控制範圍的進程)將無法正常工作。

一個更好的選擇是繪製一個JComponent的paintComponent方法,並使用傳遞給此方法的Graphics對象作爲其參數。如果你需要繪製一些作爲背景圖片的東西,也可以看一看BufferedImage的繪圖。當你這樣做,在這裏你在圖像上調用getGraphics()(或createGraphics(),如果你需要一個Graphics2D對象),在這裏返回的對象將是穩定的。您仍然需要以某種方式顯示該圖像,或者作爲JLabel顯示的ImageIcon,或者通過調用paintComponent的Graphics參數上的Graphics#drawImage(....)來顯示在JComponent的paintComponent方法中的圖像。

12

請勿使用getGraphics()。您所做的任何繪畫都將是臨時的,並且在下次Swing確定組件需要重新繪製時將會丟失。

改爲替代JComponent或JPanel的paintComponent()方法來執行自定義繪畫。有關更多詳細信息和示例,請參閱Custom Painting