日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java paintComponent的一些解读

發(fā)布時(shí)間:2025/4/16 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java paintComponent的一些解读 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先,paintComponent()是swing的一個(gè)方法,相當(dāng)于圖形版的main(),是會(huì)自執(zhí)行的。如果一個(gè)class中有構(gòu)造函數(shù),則執(zhí)行順序是先執(zhí)行構(gòu)造函數(shù),再執(zhí)行這個(gè)。


下面直接轉(zhuǎn)載一個(gè)網(wǎng)友關(guān)于paintComponent()的介紹:

(我們明天就開始java游戲設(shè)計(jì)之旅啦!)


下面看看Swing中paint與paintComponent的區(qū)別。 查API文檔,查得在類Jcomponent下的paint方法有以下解釋: ? ? ??“This method actually delegates the work ofpainting to three protected ? ?? ? ?? ?methods:?paintComponent,?paintBorder,and?paintChildren.They're called in the ? ?? ? ?? order listed to ensure that children appear ontop of component itself.”
也就是說(shuō)當(dāng)Swing中的paint方法被調(diào)用時(shí),paintComponent、paintBorder、? ? ?? paintChildren這三個(gè)方法也會(huì)被按順序調(diào)用,之所以要按這個(gè)順序調(diào)用是為了保證子組件能正確地顯示在目前這個(gè)組件之上。
所以paintComponent就是本身這個(gè)容器自己畫出自己組件的方法了。如果只是為了改變本身這個(gè)容器中的組件,只需要改寫paintComponent方法就可以了,如果還要保留容器中的原本組件就別忘了調(diào)用super.paintComponent(g)。如果要改寫paint方法來(lái)改變本身這個(gè)容器的組件,那么也別忘了要調(diào)用super.paint(g),不然出來(lái)的東西是不包含原組件、原邊框和子組件的。這個(gè)做個(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); } }
以上這個(gè)程序除了JPanel本身正常顯示之外還會(huì)顯示出子組件label和一個(gè)方塊。如果注釋掉super.paint(g),那么就只能顯示出方塊了。
? ??? 不過(guò)我還發(fā)現(xiàn)了一個(gè)更神奇的地方。 那就是以上這些只適用于Swing,如果換成awt就不同了。
awt要改變組件樣式,只能重寫paint方法了,因?yàn)樗菦]有paintComponent方法的。什么?你有發(fā)現(xiàn)這個(gè)方法?!如果你看清楚你就會(huì)發(fā)現(xiàn)這個(gè)方法不是paintComponent而是paintComponents方法,后面多了一個(gè)s ?? ?? 這個(gè)paintComponents方法按API說(shuō)是用來(lái)把所有的容器內(nèi)組件都顯示出來(lái)的方法,我做了一下實(shí)驗(yàn),這個(gè)方法在容器對(duì)象初始化的時(shí)候應(yīng)該是沒有被自動(dòng)調(diào)用的,當(dāng)你要用的時(shí)候只能自己調(diào)用了,不過(guò)好像只是顯示出子組件而已,因?yàn)閍wt中即使重寫paint方法而沒有調(diào)用父類的paint方法是不影響本身容器自己的組件顯示的。這是一個(gè)例子: ? ?? ?? ?? ???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)就可以保留原組件樣式,但是不會(huì)顯示子組件樣式,可以調(diào)用paintComponents(g)解決這個(gè)問(wèn)題。

總結(jié)

以上是生活随笔為你收集整理的java paintComponent的一些解读的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。