日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Swing組件中的渲染器Renderer

Swing組件根據(jù)其所操作的數(shù)據(jù)類型分為兩種。標(biāo)量數(shù)據(jù)類型的組件操作的是基本類型的數(shù)據(jù),如字符串、布爾、數(shù)字等,此類型組件包括JTextField、JCheckBox、JLabel、JButton等。復(fù)合數(shù)據(jù)類型的組件操作的是諸如向量、矩形和非線形等類型的數(shù)據(jù)。向量數(shù)據(jù)類型的組件有JComboBox、JList,矩形數(shù)據(jù)類型的組件有JTable,非線形數(shù)據(jù)類型的組件如 JTree。

濟(jì)源網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián)公司,濟(jì)源網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為濟(jì)源上千提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)公司要多少錢,請找那個(gè)售后服務(wù)好的濟(jì)源做網(wǎng)站的公司定做!

為更形象地展現(xiàn)各種類型的數(shù)據(jù),復(fù)合數(shù)據(jù)類型的組件往往采用標(biāo)量數(shù)據(jù)類型組件來表現(xiàn)每種數(shù)據(jù)元素。比如JTable的某一列數(shù)據(jù)是字符串類型,那么該列的單元格往往用JLabel方式展現(xiàn)每個(gè)字符串;如果一列數(shù)據(jù)是布爾類型,那么該列的單元格往往用JCheckBox方式展現(xiàn)每個(gè)布爾值。

如何實(shí)現(xiàn)復(fù)合數(shù)據(jù)類型的組件的渲染呢?最直接的是在paint方法中一個(gè)一個(gè)地根據(jù)數(shù)據(jù)類型畫出每一個(gè)組件,但這種方法很顯然代碼復(fù)用率很低,大量重復(fù)了相應(yīng)標(biāo)量型組件的代碼,代碼的維護(hù)和同步會(huì)非常困難,也不容易實(shí)現(xiàn)皮膚切換。

為解決此問題,Swing體系中提出了所謂渲染器Renderer的概念,其核心思想是使用接口,封裝和復(fù)用已有標(biāo)量型組件的渲染代碼,降低代碼重復(fù)率,提高組件的可擴(kuò)展性。

如何使用渲染器返回的組件渲染當(dāng)前的單元格呢?JTable在自己內(nèi)部隱藏了一個(gè)所謂的CellRendererPane組件,該組件是一個(gè)“零實(shí)現(xiàn)”的容器組件。雖然被添加到JTable上,但它是不可見的,其paint和update方法都為空,僅僅作為臨時(shí)容納渲染組件的容器,目的是將渲染組件粘合到JTable組件樹上,使得渲染組件有效化,以便使它們達(dá)到渲染前的正確狀態(tài)。下面代碼演示了CellRendererPane的概要結(jié)構(gòu):

 
 
 
  1. public class CellRendererPane extends Container implements Accessible  
  2. {  
  3. //構(gòu)造函數(shù)  
  4. public CellRendererPane() {  
  5. super();  
  6. //注意CellRendererPane的布局管理器為空,后面渲染時(shí)有用!  
  7. setLayout(null);  
  8. //不可見,使之不被顯示在JTable上  
  9. setVisible(false);  
  10. }  
  11. //零實(shí)現(xiàn)  
  12. public void invalidate() { }  
  13. //零實(shí)現(xiàn)  
  14. public void paint(Graphics g) { }  
  15. //零實(shí)現(xiàn)  
  16. public void update(Graphics g) { }  
  17. ......  
  18. //下面是CellRendererPane的paintComponent方法:  
  19. public void paintComponent(Graphics g, Component c, Container p,
     int x, int y, int w, int h, boolean shouldValidate) {  
  20. ......  
  21. if (c.getParent() != this) {  
  22. //如果渲染組件c還沒有添加當(dāng)前CellRendererPane中  
  23. //添加進(jìn)去  
  24. this.add(c);  
  25. }  
  26.  
  27. c.setBounds(x, y, w, h);  
  28.  
  29. if(shouldValidate) {  
  30. c.validate();  
  31. }  
  32. //下面主要處理雙緩沖問題,可略去  
  33. ......  
  34. //準(zhǔn)備圖形對象  
  35. Graphics cg = g.create(x, y, w, h);  
  36. try {  
  37.  
  38. c.paint(cg);  
  39. }  
  40. }  
  41. }  

渲染器Renderer的核心思想都體現(xiàn)在上面紅色代碼標(biāo)注的部分。將JTable的圖形對象傳遞給組件的paint的方法,產(chǎn)生的結(jié)果是將組件畫到了JTable上。其實(shí)Swing打印的原理也大抵如此,只不過這兒的圖形對象變成了打印機(jī)的圖形對象。雖然大部分Swing組件都專門對打印進(jìn)行了專門的處理(主要是因?yàn)橛幸恍﹫D形元素不希望被打印的,比如填充的內(nèi)容往往不希望打印,可能是太耗墨了),但基本過程是一樣的。

渲染器的思想很像是攝像機(jī)、鏡子等成像原理。作個(gè)比喻,如果你想獲取某人的圖像,一種方法是將此人一點(diǎn)點(diǎn)用筆畫出來。另種方法是通過光線將此人照到鏡子里或用照相機(jī)拍攝下來。其好處是不管是什么物體,都可以映射出來,具有很強(qiáng)的可擴(kuò)展性。比如JTable中,表格中不僅可以使用JLabel、 JCheckBox、JComboBox等簡單組件作為渲染器,而且可以使用其它任何的Swing組件進(jìn)行渲染,包括復(fù)雜的組件JTable(比如實(shí)現(xiàn)表格套表的風(fēng)格)、自定義的組件,渲染器方法帶來的好處不僅僅是組件代碼的復(fù)用,更帶來了無限的可擴(kuò)展性!

渲染器思想在Swing中有著廣泛的應(yīng)用。除利用它們實(shí)現(xiàn)JTable、JList、JTree和JComboBox等標(biāo)準(zhǔn)組件,還可以實(shí)現(xiàn)界面設(shè)計(jì)工具中屬性頁、類似UML設(shè)計(jì)圖、類似于MS Excel風(fēng)格的電子表格等更為復(fù)雜的界面組件,甚至IDE中常見的界面設(shè)計(jì)工具也是利用了渲染器的思想,它把整個(gè)組件樹當(dāng)作一個(gè)大渲染器,渲染出當(dāng)前圖形用戶界面的設(shè)計(jì)效果。

渲染器是Swing展現(xiàn)復(fù)雜數(shù)據(jù)結(jié)構(gòu)的利器。但是Swing組件不僅僅被用作展現(xiàn)數(shù)據(jù),通常還是編輯數(shù)據(jù)的地方。實(shí)際上純粹展現(xiàn)數(shù)據(jù)的Swing組件很少,標(biāo)準(zhǔn)組件中也許只有JLabel。復(fù)合數(shù)據(jù)類型的組件往往使用渲染器原理實(shí)現(xiàn)組件的渲染,使用所謂in-place editor實(shí)現(xiàn)組件的編輯。渲染器Renderer和Editor的結(jié)合賦予了Swing強(qiáng)大的靈活性,JTable、等組件這兩種原理結(jié)合的代表。后續(xù)文章將講述in-place editor在Swing中的使用。


文章標(biāo)題:Swing組件中的渲染器Renderer
本文地址:http://www.dlmjj.cn/article/cosjhhd.html