Java paint()個人理解
這些天給同學講了不少次JUI的 paint()方法和畫筆,就目前而言已經比當初自己寫的時候理解的多了不少了,雖然有點花時間,但好處還是有的。(習慣把Graphics g物件叫做畫筆)
以前想要在某個容器上用畫筆繪製東西來做遊戲,直接給主類繼承JPanel,然後只是把paint()+repaint()當作執行緒來使,感覺就這麼背下來了。然後當我再看這個paint方法的時候,隱約記得有個方法叫做獲取物件的畫筆,又看到裡面傳入了一根畫筆引數,有點不對勁。當我嘗試在別人寫的一個繼承JFrame類中的paint方法內,呼叫JPanel的畫筆的時候,先用getGraphics獲取到JPanel的畫筆,然後我唯一能想到需要傳遞畫筆的地方就是在paint方法裡需要super呼叫一下父類的paint方法,大概就是這裡把畫筆傳遞過去然後畫在JPanel上的吧?唔。。結果什麼都沒出來,看起來不是從這裡傳遞的。目前為止還有一個疑點,就是我總是在用的這個paint方法究竟是誰呼叫的,在哪呼叫的。既然能夠super到父類,肯定是父類中有這個方法。那意思就是我繼承什麼容器,呼叫的就是誰的paint方法了唄,是誰的paint方法那不就是在誰身上畫了唄。那在當前物件身上畫東西,在哪呼叫的呢?在哪傳遞的畫筆呢?我賭了一把,在JFrame構造方法裡顯式呼叫了一下this.paint(),然後把我獲取到的JPanel畫筆傳了進去,果然畫出來東西了。這樣來的話,意思就是在我之前寫的方法中,有某個方法偷偷呼叫了this.paint(g),並且把當前物件的畫筆傳了進去吧,唯一能讓我想到讓東西顯示出來的方法就是setVisible了,翻了幾層父類關係,好像是在Component類中看到了repaint()方法,藉此,我目前的理解就到這裡了吧。
除此之外,就我們平時使用的JContainer下的JFrame或者是JPanel而言,add方法可以為其加上自己的元件,之前我並沒有在意過,元件究竟是怎麼被加上去的。直到前兩天有人問我,元件是加在JFrame之上的,而畫筆也是把內容畫在JFrame上。這之間的圖層關係總是搞不懂,為什麼畫出來的東西會蓋住之前加的元件呢?唯一的解釋就是,元件看起來是被加上去的,實際上則是被JContainer裡的paint()方法畫在容器上的。所以一開始先加的元件,在paint()方法自動執行的時候,呼叫了super.paint(g)會被先畫出來,然後再繼續畫自己想要的東西,就會蓋住之前的元件了。這樣的解釋也正好能夠迎合為什麼元件內都會有個paintComponent方法,這個方法估計就是容器呼叫元件用來繪製自己的方法吧。而元件之間的繪製方法也有差距,類如JLabel本身無法獲取焦點,如果paint()裡不呼叫super.paint()似乎會出現無法正常顯示的狀況,有的人說我說的這種情況不對,不過我昨天所見識到的確實是這個樣子。但是和JLabel相對的類似JButton的功能性的,總是能夠在顯示出來的時候獲取到焦點,抑或者是滑鼠從上面經過,會觸發一些顯示效果,都能觸發他們的繪製方法,然後正常顯示出來。但是繼承了父類的paint之後,就都能正常顯示了。
懶得翻原始碼,瞎猜真有意思,就怕誤人子弟啊,大家隨便看看就行。