1 回答

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超4個(gè)贊
問題是它只顯示一個(gè)圖像,而不是水族箱頂部的魚(水族箱或魚,取決于首先將哪個(gè)圖像添加到 JFrame)。
默認(rèn)情況下 aJPanel
使用 a FlowLayout
,它尊重添加到它的任何組件的首選大小。
默認(rèn)情況下 aJFrame
使用 a BorderLayout
,如果您不指定約束,組件將添加到CENTER
的BorderLayout
,這意味著組件會(huì)自動(dòng)調(diào)整大小以填充框架的空間。
因此,您添加到框架的組件將調(diào)整大小以填充框架。添加到面板的組件的大小為 (0, 0),因此無需繪制任何內(nèi)容。
所以一些自定義繪畫技巧:
覆蓋
getPreferredSize()
面板的方法以返回圖像的大小,以便布局管理器可以完成其工作調(diào)用 super.paintComponent(..) 作為確保背景被清除的第一條語句。
不要在paintComponent() 方法中讀取圖像。每當(dāng) Swing 確定需要重新繪制組件時(shí),都可以調(diào)用此方法,因此繼續(xù)讀取圖像效率不高。相反,應(yīng)該在類的構(gòu)造函數(shù)中讀取圖像。
不要在繪畫方法中調(diào)用 repaint() 。這將導(dǎo)致無限的繪畫循環(huán)。
此外,在使框架可見之前,應(yīng)將組件添加到框架中。
綜上所述,Alerra 在評(píng)論中建議在同一面板中繪制兩個(gè)圖像是一個(gè)好主意。它簡(jiǎn)化了繪畫,您甚至可以通過保留要繪制的圖像的 ArrayList 輕松繪制多條魚。然后您只需繪制背景,然后遍歷 ArrayList 以繪制單個(gè)魚。
查看自定義繪畫方法以獲取工作示例。例子只畫了Rectangle,但是概念是一樣的。
添加回答
舉報(bào)