国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

輕量級Swing組件概述

開發 后端
本文介紹輕量級Swing組件,Swing的GUI總是由頂層容器組件和輕量級swing組件組合建立,頂層容器和其他組件區別主要在于頂層容器沒有自身的paint邏輯。

在Swing頂層重量級容器組件的一個繪制場景中,可以看到是經由awt-windows eventloop到了底層事件后觸發paint繪制;然而對輕量級Swing組件,其paint都是通過java代碼中對repaint調用而觸發,其會向RepaintManager.addDirtyRegion,同時 scheduleProcessingRunnable。這是整個GUI生命周期內對繪制的兩種不同的觸發方式,但觸發后的處理都是交由 RepaintManager。

回過頭去看,JFrame被構造的時候就會創建root pane, layered pane,content pane, glass pane等,這些沒有對等體的輕量級Swing組件在構造時都將repaint。雖然在創建windows對等窗口之前這些Swing組件就已經在要求繪制,但是RepaintManager能夠協調好這個步調(具體即是當收到repaint請求時要判斷情況,像這時的請求因為頂層容器還沒有繪制則不會記錄到重畫區)。所以最終效果就是在peer.pshow的時候只能看到一個空窗口,隨后底層消息到來后通過paint回調畫這些子組件,***hello world才顯示出來。如果眼神好,能夠看出這有一個“閃爍”。
這是一個最簡單的Swing應用程序的基本運行機制分析,下面再具體分析。

Swing的GUI總是由頂層容器組件和輕量級Swing組件組合建立,頂層容器和其他組件區別主要在于頂層容器沒有自身的paint邏輯。所有頂層容器都是通過使用底層系統API來繪制對等體的方式進行paint,自身沒有java2d的paint邏輯實現,對等體畫成什么樣頂層容器就是什么樣,它只是可以控制對等體的一些可配顯示屬性。所以效果就是比如在windows平臺上畫一個jframe,除在桌面上顯示一個窗口還會在任務欄上顯示一個條目。Swing的 4個頂層容器都是在addNotify時才會getToolkit().createPeer(this)(Frame/Dialog/Window), 而addNotify并不是在構造時被調用,而是在pack/show或setvisible(這3個所謂的realized具現化方法)時被調用。創建了對等體peer后還要通過peer.pShow(show/setVisible(true)調用)調用才會要求底層系統進行顯示(所以只有pack是不會顯示窗口的)。在顯示窗口后底層消息隊列得到通知,此后隨著窗口被最小化后恢復或被遮蓋后恢復等系統操作后同樣能從底層消息得到通知,這時的監聽處理將有選擇地通知給RepaintManager一個重畫請求進行窗口內容-子組件重畫。

而輕量級Swing組件將繪制有關的職責都委托給了ui成員對象,ui對象使用JAVA2D API 進行繪制,paint成什么樣那就是這個組件的樣子。具體就是在構造的時候即要 updateUI{setUI(UIManger.getUI(this))}。UIManger會根據當前L&F的選擇,根據 this.uiClassID來得到ui成員類并建立實例,以后的paint回調等都推托給ui成員類paint,這也算是一種策略模式。Setui的過程中除了保存這個ui實例外,將repaint來通知RepaintManager進行paint回調完成組件繪制。輕量級Swing組件在addNotify時也會去創建對等體getToolkit().createPeer(this)( LightWeightPeer),但這個peer的實現(NullComponentPeer)是個空殼子,只是作為一個輕量級組件的標記,以后的很多事件處理等都要判斷peer是否instance of LightWeightPeer從而能夠進行不同處理。同樣的Addnotify也不是在構造時被調用,而是在被加入container時被調用。

注意:構造方法本身就是狀態模式的***狀態,所以GUI組件的構造方法里就應該要努力完成自身的繪制來符合自己的地位。輕量級組件就是按這個意義在構造方法里去通知repaintmanager進行自身繪制的,但是頂層容器卻將真正的繪制意圖createPeer延遲到了具現方法里。這是因為首先一個合乎思維的表達邏輯是先有容器,再將子組件向容器里添加,所以最頂層容器總是先行構造出來,然后再被一層層地追加輕量級子組件。如果最頂層容器在構造時就去具現,則就要求后續的構造都應該在EDT中進行,而且每次add子組件都要導致revalidate;但若將最頂層容器的繪制分離延遲到具現方法里,則可以表達是在容器里盛滿了要顯示的子組件后再一股腦具現繪制出來的概念,類似于在進行一次web頁面的完整加載,然后注意在具現方法執行后如果要操作組件都在EDT中進行即可,而且頂層容器提供一個特有的 pack方法,用來一次性對所有子組件驗證大小位置進行重布局,pack之后再show,這樣的一次性計算展現是最有效率的。

頂層容器和輕量級組件就是這樣誕生并繪制的,在此后的生命周期里,都將按事件監聽機制完成GUI隨需而變,無論是系統事件,還是因為repaint調用主動post事件,事件到來后再在EDT中執行監聽器里的paint繪制。Swing已經提供的頂層容器和輕量級組件因各自的定義已經注冊了各自的paint監聽,開發人員可以再行維護或按此模式開發新組件從而滿足應用的需要。比如,jbutton默認有mousepress listener,在mousepress事件到來后,監聽響應中會設置鼠標顏色加深來表示按下,然后再調用repaint要求重畫,隨后在EDT中執行 jbutton的paint回調,此時按深顏色繪制,于是一個被按下的效果就出來了。

下面在具體分析各類事件的處理。

對于頂層容器的受底層事件消息的觸發,當得到的通知是因為expose暴露隱藏區(暴露被遮蔽的部分或恢復最小化或***次繪制等)時,處理過程會涉及到雙緩存的處理,即如果可能,直接使用緩存中的舊圖像信息進行覆蓋而不再重新繪制。

所謂雙緩存機制是將一整片的顯示內容暫時寫入一張內存空間里,然后一次性內存拷入顯示區來進行顯示,這樣處理是因為如果直接寫入顯示區,隨著顯示區被該寫入線程逐漸寫入,可能經歷多次屏幕刷新,導致每次刷新都形成過程圖像,給人眼造成閃爍感覺;同時一個副收益就是可以針對每個窗口都做緩存待用(而不僅僅是針對一個屏幕雙緩存),當窗口被遮擋的部分重現時直接拷貝緩存來覆蓋,不用再執行繪畫邏輯,提高了效率。

現在的OS一般都提供雙緩存機制支持,如果底層系統自身支持以每個窗口為單位做雙緩存,則該expose消息將被本地處理,不需要通知進行子組件的繪制;如果底層不支持,則該消息會到達wcomponetpeer.handleexpose中進行回調處理,此時Swing機制下有一個參數控制的雙緩存機制可以提供。這里的參數控制需要從RepaintManager的構造過程說起。

首先RepaintManager可以通過static setCurrentManager(SomeCurrentManager)來進行全局指定。默認情況使用 currentRepaintManager(){new RepaintManager(BUFFER_STRATEGY_TYPE)}得到一個延遲創建的單例。RepaintManager有一段靜態類初始化過程,涉及到雙緩存設置:

  1. static{  
  2. nativeDoubleBuffering="true".equals(AccessController.doPrivileged(  
  3. newGetPropertyAction("awt.nativeDoubleBuffering")));//JVM的啟動參數控制,默認false  
  4. Stringbs=AccessController.doPrivileged(  
  5. newGetPropertyAction("swing.bufferPerWindow"));//是否每窗口緩存。  
  6. if(headless){  
  7. BUFFER_STRATEGY_TYPE=BUFFER_STRATEGY_SPECIFIED_OFF;  
  8. }  
  9. elseif(bs==null){  
  10. BUFFER_STRATEGY_TYPE=BUFFER_STRATEGY_NOT_SPECIFIED;  
  11. }  
  12. elseif("true".equals(bs)){  
  13. BUFFER_STRATEGY_TYPE=BUFFER_STRATEGY_SPECIFIED_ON;  
  14. }  
  15. else{  
  16. BUFFER_STRATEGY_TYPE=BUFFER_STRATEGY_SPECIFIED_OFF;  
  17. }  
  18. }  
  19. privateRepaintManager(shortbufferStrategyType){  
  20. //Ifnativedoublebufferingisbeingused,doNOTuse  
  21. //Swingdoublebuffering.  
  22. doubleBufferingEnabled=!nativeDoubleBuffering;  
  23.  
  24. this.bufferStrategyType=bufferStrategyType;  
  25.  
  26. }  
  27. publicvoidsetDoubleBufferingEnabled(booleanaFlag){  
  28. doubleBufferingEnabled=aFlag;  
  29.  
  30. privatesynchronizedPaintManagergetPaintManager(){  
  31. if(paintManager==null){  
  32. PaintManagerpaintManager=null;  
  33. if(doubleBufferingEnabled&&!nativeDoubleBuffering){  
  34. switch(bufferStrategyType){  
  35. caseBUFFER_STRATEGY_NOT_SPECIFIED:  
  36. if(((SunToolkit)Toolkit.getDefaultToolkit()).  
  37. useBufferPerWindow()){//windows下是否禁用vistadwm,
    在沒有聲明bufferPerWindow的情況下由windows系統特性確定paintmanager。  
  38. paintManager=newBufferStrategyPaintManager();  
  39. }  
  40. break;  
  41. caseBUFFER_STRATEGY_SPECIFIED_ON:  
  42. paintManager=newBufferStrategyPaintManager();  
  43. break;  
  44. default:  
  45. break;  
  46. }  
  47. }  
  48. //nullcasehandledinsetPaintManager  
  49. setPaintManager(paintManager);  
  50. }  
  51. returnpaintManager;  
  52. }  
  53. voidsetPaintManager(PaintManagerpaintManager){  
  54. if(paintManager==null){  
  55. paintManager=newPaintManager();  
  56. }  
  57.  

【編輯推薦】

  1. 淺談Swing中的Look&Feel
  2. Swing組件大全隨著Java風潮一起來席卷國內
  3. 全面比較Swing與SWT
  4. Swing程序中調用JavaFX代碼
  5. SWT和Swing代碼的區別
責任編輯:佚名 來源: csdn
相關推薦

2009-07-17 14:38:51

輕量級Swing組件

2009-07-17 12:54:13

2009-07-16 11:19:48

外部線程Swing組件

2023-02-03 15:21:52

2023-09-27 00:12:23

2016-10-14 16:35:39

2009-07-16 17:09:02

Swing應用程序

2009-09-11 08:26:49

Linux系統CRUX 2.6Linux

2023-08-09 08:01:38

場景Redis接口

2009-07-16 16:46:39

Swing窗體

2009-07-10 17:43:10

Swing.table

2021-03-02 09:35:33

Python循環開發

2022-03-14 08:02:08

輕量級動態線程池

2022-12-29 09:49:06

輕量級架構決策

2023-09-14 09:31:21

Docker容器

2023-06-27 16:42:18

Tinygrad深度學習工具

2009-07-15 13:06:38

Swing組件

2009-07-10 18:06:59

JTree Swing

2020-11-11 12:13:59

JS

2022-08-10 12:21:07

PythonWebBottle
點贊
收藏

51CTO技術棧公眾號

欧美视频亚洲视频| 99久久精品国产精品久久| www.久久色.com| 男女在线观看视频| 四虎影院在线域名免费观看| 国产成人啪午夜精品网站男同| 97伦理在线四区| 日本午夜一区| 午夜精品久久久久久久久久久 | 中国黄色录像片| 国产精品毛片| 国产一区二区三区免费不卡| 中文字幕乱码亚洲无线精品一区| 色综合天天在线| 日韩欧美一区二区视频在线播放 | 亚洲欧洲在线播放| 国产成人精品视频免费看| 免费在线观看视频一区| 精品日本一区二区| 亚洲天堂一区二区| 亚洲加勒比久久88色综合| 操人在线观看| 国产欧美日韩麻豆91| 久久久999视频| 99视频在线精品| 国产男女激情视频| 国产精品网站在线播放| 亚洲一级免费在线观看| 亚洲男人天堂一区| 国产另类第一区| 亚洲人体大胆视频| 亚洲午夜久久久影院| 超碰国产一区| 国产性猛交xxxx免费看久久| 亚洲青青一区| 亚洲免费在线观看视频| 日本视频三区| 色av成人天堂桃色av| 男人和女人做事情在线视频网站免费观看| 久久er99精品| 3344国产精品免费看| 久久精品蜜桃| 欧美日韩一级二级三级| 丝袜美腿av在线| 26uuu另类欧美亚洲曰本| 国产免费成人av| 欧美日韩一区二区高清| 精品国产乱码一区二区三区四区| 日韩福利电影在线| 成年人视频在线免费| 亚洲国产精品一区二区www| 手机成人在线| 国产iv一区二区三区| 天天综合天天操| 人妖欧美一区二区| 色综合久久88色综合天天看泰| 污网站在线播放| 日韩欧美国产三级| 国产精品久久久久久精| 欧美在线啊v一区| 亚洲成人人体| 成人黄色生活片| 国产精品综合久久| 性疯狂做受xxxx高清视频| 成人免费va视频| 国产一区二区精品在线| 国产成人精品影视| 波多野结衣av在线播放| 亚洲国产小视频在线观看| 久久精品福利| 日本在线播放不卡| 国产欧美日韩亚州综合| 激情小视频在线观看| 亚洲人成电影网站| 婷婷综合五月| 成年人观看网站| 欧美性大战久久久| 91精品久久久久久综合五月天| 激情视频一区二区| 国产精品三级视频| 爱搞国产精品| 国产精品99久久久久久久 | 首页亚洲中字| 亚洲女人被黑人巨大进入| 亚洲最大在线| 男女裸体影院高潮| 91福利在线观看| 国产精品极品| 欧美日韩成人黄色| 精品电影一区| 啊啊啊啊啊啊啊视频在线播放| 欧美精品一区二区久久久| av在线资源网| 韩剧1988免费观看全集| 肉丝袜脚交视频一区二区| 免费激情网址| 欧美精品在线第一页| 日本伊人精品一区二区三区观看方式| 亚洲一本大道| 久久久免费观看| 高潮按摩久久久久久av免费| 久久99精品国产99久久| 日韩视频二区| 欧美日韩成人一区二区三区| 自拍偷自拍亚洲精品播放| 久久亚洲精品人成综合网| 国产亚洲欧美aaaa| 狠狠久久婷婷| 亚洲精华国产精华| 91超碰caoporn97人人| 羞羞色国产精品网站| 男女h黄动漫啪啪无遮挡软件| 欧美日韩在线免费观看| 成人精品毛片| 国产激情在线观看视频| 亚洲最新av网址| 狠狠色丁香婷婷综合| 成人av在线播放观看| 欧美日韩国产精品自在自线| 亚洲澳门在线| 久久国产精品高清| 一本大道av一区二区在线播放| 另类在线视频| 无限资源日本好片| 欧美男插女视频| 久久综合九色综合97婷婷| 国产精品高潮久久| 久久免费视频网| 久久久久久久久97黄色工厂| 国产精品亲子伦av一区二区三区| 不卡中文字幕在线| 亚洲精品久久久久久久久| 日韩成人精品在线| sm在线观看| 欧美少妇一级片| 亚洲女同精品视频| www.亚洲国产| 成人福利一区| 台湾十八成人网| 日本精品一区二区三区在线播放视频| 羞羞答答成人影院www| 黄色av资源| 国产精品日本精品| 亚洲专区在线| 污污片在线免费视频| 欧洲av一区| 久久只精品国产| 成人短视频软件网站大全app| 日韩av免费一区| 亚洲国产精品嫩草影院| 中文字幕免费一区二区| 麻豆传媒在线免费| 超碰超碰超碰超碰超碰| 日韩网站免费观看| 亚洲男同性恋视频| 激情亚洲网站| 中文字幕在线视频网站| 国产伦精品免费视频| 欧美色视频日本版| 亚洲精品影视| 91精品产国品一二三产区| 黄色av免费在线播放| 国产精品久久久久福利| 欧美三区免费完整视频在线观看| 丝袜亚洲精品中文字幕一区| 天天干天天草天天| 国产精品第一视频| 在线一区二区三区四区| 激情综合网av| 欧美人与动xxxxz0oz| 久久精品国产亚洲a∨麻豆| 亚洲日本无吗高清不卡| 欧美日本高清视频| 日本韩国视频一区二区| 国产乱理伦片在线观看夜一区| 久草在线综合| 香蕉成人app免费看片| 免费看黄色一级大片| 精品欧美一区二区在线观看| 国产成人精品网址| 国产成人手机高清在线观看网站| 91亚洲精品国产| 欧美日韩高清一区二区| 国产九九视频一区二区三区| 图片婷婷一区| gogo高清午夜人体在线| 亚洲jizzjizz妇女| 亚洲乱码国产乱码精品天美传媒| 高清在线观看日韩| 亚洲精品免费看| 香蕉国产成人午夜av影院| 欧美成人家庭影院| 午夜av不卡| 国产h片在线观看| 日韩成人手机在线| 国产精品视频区1| 伊人伊成久久人综合网小说| 亚洲一二三区在线观看| 久久国产成人午夜av影院| 真实原创一区二区影院|