成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Swing組件的paint方法的處理流程

開發 后端
本文介紹Swing組件的paint方法的處理流程,Swing組件的paint方法是內部接口方法,一般用戶不要直接調用這個方法,它總是在事件調度線程中調用。

昨晚回去后還是覺得Component對象本身說的太簡單,想來想去,覺得內容實在是太多,有必要補充兩個續文說明Component的其它概念。今天介紹Swing組件paint方法的處理流程,這個流程能使我們理解許多Swing機制。

Swing組件的paint方法是內部接口方法,一般用戶不要直接調用這個方法,它總是在事件調度線程中調用。一般說來除了系統刷新事件觸發這個方法, Component的repaint也觸發這個方法的調用。repaint方法常用于當組件狀態發生變化時刷新界面使用。repaint方法是Swing 中少數幾個線程安全的方法,可以在任何線程中調用它。它的原理是往事件隊列中post一個PAINT事件。由于事件隊列的事件是被事件調度線程同步執行的,所以這個方法總是線程安全的。事件調度線程從PAINT事件中獲取事件源組件,從系統申請到圖形設備資源后,調用該組件的update方法。 update是AWT時代遺留下來的產物,本意是AWT組件畫好組件背景后,再調用paint方法畫出組件的前景。Swing出現后這個方法就被棄用了,所有邏輯都轉到paint方法里。Update只是簡單地調用paint方法來完成組件的渲染。老的Java教材上經??梢钥吹剑^repaint調度 update方法,update接著調用paint方法,自定義組件需要重載paint方法等話語,就是因為這個歷史造成的。

現在JComponent的實現已經把paint方法改造成可以嵌套多重機制地方,這些機制包括層次渲染、邊框、透明背景、雙緩沖以及皮膚等。這些機制分別實現不同目的的組件提供了方便。

圖形用戶界面的組件按照其在組件樹上的角色可以分為容器組件和葉組件。Swing模型把葉組件當作是特殊、沒有子組件的容器組件,只是JComponent繼承Container類,所有Swing組件繼承JComponent的原因。

JComponent在paint方法中首先根據組件是否需要使用雙緩沖,封裝好圖形設備對象,然后經過一番處理后調用paintComponent方法畫出自身,然后調用paintBorder畫出邊框,最后調用paintChildren來完成子組件的渲染。

paintComponent意思是畫出組件自身,不包括子組件。因此前一文章中的MyButton可以通過覆蓋paintComponent方法來完成 MyButton的重畫。在JComponent實現中,JDK 6的paintComponent的代碼為:

  1. protectedvoidpaintComponent(Graphicsg){  
  2. if(ui!=null){  
  3. GraphicsscratchGraphics=(g==null)?null:g.create();  
  4. try{  
  5. ui.update(scratchGraphics,this);  
  6. }  
  7. finally{  
  8. scratchGraphics.dispose();  
  9. }  
  10. }  

可以看出,背景透明機制在這兒實現。首先UI Delegate對象判斷Component是否背景透明的,如果不是透明的,則使用背景色填充整個Component區域,然后調用paint(g, c)來完成組件在這種LookAndFeel種的渲染。了解了這些后,我們幾乎就明白了Swing如何實現背景透明和如何切換皮膚。由于后面的文章還會對 UI Delegate和皮膚機制詳細描述,這兒就到此為止。

目前還不要求實現皮膚,在這種情況下只需要重載paintComponent方法就行了,如果需要背景透明機制,可以模仿上面代碼,MyButton的paintComponent可以這樣寫:

  1. publicvoidpaintComponent(Graphicsg){  
  2. if(isOpaque()){  
  3. g.setColor(getBackground());  
  4. g.fillRect(0,0,getWidth(),getHeight());  
  5. }  
  6. if(pressed){//按鈕按下去了  
  7. //畫出按下的樣子  
  8. }else{  
  9. //畫出抬起的樣子  
  10. }  


paintChildren完成容器類組件的子組件的渲染。JDK缺省的實現是調用各個自組件的paint方法。一般來說不需要重載這個方法。如果想改變諸如組件Z-order遮擋順序,可以覆蓋這個方法,從相反順序調用組件的paint方法。

到這兒我們對Swing的結構有了更深化的理解,UI Delegate機制也已經初露倪端。還有幾個重要Swing Component概念或者機制沒有講,明天的續文再對它們做出說明。

【編輯推薦】

  1. 概述Swing窗體的種類
  2. 淺談Swing線程三種
  3. Swing全屏幕模式
  4. 淺析Swing線程中的LookupEvent
  5. Swing文件選擇器的制作
責任編輯:佚名 來源: 百度空間
相關推薦

2009-07-10 09:38:06

Java swing組

2009-07-10 11:45:44

Java Swing

2009-07-10 16:29:32

Swing組件

2009-07-15 11:02:32

Swing組件

2009-07-14 17:21:42

Swing組件

2009-07-10 13:20:37

Swing容器組件

2009-07-10 10:19:57

JFormattedTSwing

2009-07-10 10:08:59

Spinner ModSwing組件

2009-07-10 14:58:13

JLabel組件JFC和Swing

2009-07-15 10:52:13

JTree組件

2009-06-09 16:53:22

Java Swing處理方法比較

2009-07-15 10:06:54

Swing實現MDI

2009-07-15 16:29:41

Swing繪畫

2009-07-10 18:06:59

JTree Swing

2009-07-17 12:54:13

2009-07-14 18:05:28

輕量級Swing組件

2009-07-17 14:38:51

輕量級Swing組件

2009-07-16 10:11:06

渲染器RendererSwing組件

2009-07-15 13:06:38

Swing組件

2009-07-16 11:19:48

外部線程Swing組件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久草热播 | 久久国产区 | 韩日免费视频 | 欧美一区二区三区在线 | 日日夜夜草 | 久草www| 精品国产精品国产偷麻豆 | 北条麻妃一区二区三区在线视频 | 久久久久免费精品国产小说色大师 | 99久久精品国产一区二区三区 | 久久亚洲天堂 | 三级成人在线观看 | 成人精品鲁一区一区二区 | 精品99在线 | 欧美日高清 | 国产欧美精品一区二区色综合 | 国产一区二区精品在线观看 | 日本a在线 | 久久久成人一区二区免费影院 | 91资源在线| 91色在线视频 | 日韩在线播放第一页 | 久久久国产精品视频 | 久久国产99| 国产成人一区二区 | 在线看一区二区三区 | 欧美国产在线一区 | 欧美老妇交乱视频 | 精品免费 | 91精品久久久久久久久中文字幕 | 91xh98hx 在线 国产 | 国产成人精品一区二 | 国产欧美性成人精品午夜 | 国产九九九九 | 亚洲成人自拍网 | 日韩一区二区三区精品 | 久草新在线 | 欧美日韩不卡合集视频 | 男女在线免费观看 | 一区二区三区视频在线观看 | 国产午夜三级一区二区三 |