java paintComponent的一些解读
生活随笔
收集整理的這篇文章主要介紹了
java paintComponent的一些解读
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
首先,paintComponent()是swing的一個方法,相當(dāng)于圖形版的main(),是會自執(zhí)行的。如果一個class中有構(gòu)造函數(shù),則執(zhí)行順序是先執(zhí)行構(gòu)造函數(shù),再執(zhí)行這個。
下面直接轉(zhuǎn)載一個網(wǎng)友關(guān)于paintComponent()的介紹:
(我們明天就開始java游戲設(shè)計之旅啦!)
也就是說當(dāng)Swing中的paint方法被調(diào)用時,paintComponent、paintBorder、? ? ?? paintChildren這三個方法也會被按順序調(diào)用,之所以要按這個順序調(diào)用是為了保證子組件能正確地顯示在目前這個組件之上。
所以paintComponent就是本身這個容器自己畫出自己組件的方法了。如果只是為了改變本身這個容器中的組件,只需要改寫paintComponent方法就可以了,如果還要保留容器中的原本組件就別忘了調(diào)用super.paintComponent(g)。如果要改寫paint方法來改變本身這個容器的組件,那么也別忘了要調(diào)用super.paint(g),不然出來的東西是不包含原組件、原邊框和子組件的。這個做個實(shí)驗(yàn)就可以很快驗(yàn)證的。 ?? ? ?? ?? ???public class MyDrawPanelextends JPanel{ public void paint(Graphics g){ super.paint(g); g.setColor(Color.orange); g.fillRect(20, 50, 100, 100); } public static void main(String[] args){ JFrame frame = new JFrame(); MyDrawPanel panel = new MyDrawPanel(); JLabel label = new JLabel("aaa"); panel.setBackground(Color.blue); panel.add(label); frame.getContentPane().add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); frame.setVisible(true); } }
以上這個程序除了JPanel本身正常顯示之外還會顯示出子組件label和一個方塊。如果注釋掉super.paint(g),那么就只能顯示出方塊了。
? ??? 不過我還發(fā)現(xiàn)了一個更神奇的地方。 那就是以上這些只適用于Swing,如果換成awt就不同了。
awt要改變組件樣式,只能重寫paint方法了,因?yàn)樗菦]有paintComponent方法的。什么?你有發(fā)現(xiàn)這個方法?!如果你看清楚你就會發(fā)現(xiàn)這個方法不是paintComponent而是paintComponents方法,后面多了一個s ?? ?? 這個paintComponents方法按API說是用來把所有的容器內(nèi)組件都顯示出來的方法,我做了一下實(shí)驗(yàn),這個方法在容器對象初始化的時候應(yīng)該是沒有被自動調(diào)用的,當(dāng)你要用的時候只能自己調(diào)用了,不過好像只是顯示出子組件而已,因?yàn)閍wt中即使重寫paint方法而沒有調(diào)用父類的paint方法是不影響本身容器自己的組件顯示的。這是一個例子: ? ?? ?? ?? ???public class MyDrawPanelextends Panel{ public void paint(Graphics g){ //super.paint(g); g.setColor(Color.orange); g.fillRect(20, 50, 100, 100); paintComponents(g); } public static void main(String[] args){ JFrame frame = new JFrame(); MyDrawPanel panel = new MyDrawPanel(); JLabel label = new JLabel("aaa"); panel.setBackground(Color.blue); panel.add(label); frame.getContentPane().add(panel); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(300, 300); frame.setVisible(true); } }
??可以把paintComponents(g)注釋掉再看看效果。 ? ?? ? ? ?? ?總結(jié)了一下:Swing中改變組件樣式重寫paintComponent就可以了,其他paintBorder和paintChildren默認(rèn)就可以。awt中改變組件樣式要重寫paint方法,而且如果不需要調(diào)用super.paint(g)就可以保留原組件樣式,但是不會顯示子組件樣式,可以調(diào)用paintComponents(g)解決這個問題。
總結(jié)
以上是生活随笔為你收集整理的java paintComponent的一些解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java中static的作用
- 下一篇: Timer的schedule和sched