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

Swing組件中的渲染器Renderer

開發 后端
本文介紹Swing組件中的渲染器Renderer,Swing組件根據其所操作的數據類型分為兩種,一種是標量數據類型的組件,一類是復合數據類型的組件。

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

為更形象地展現各種類型的數據,復合數據類型的組件往往采用標量數據類型組件來表現每種數據元素。比如JTable的某一列數據是字符串類型,那么該列的單元格往往用JLabel方式展現每個字符串;如果一列數據是布爾類型,那么該列的單元格往往用JCheckBox方式展現每個布爾值。

如何實現復合數據類型的組件的渲染呢?最直接的是在paint方法中一個一個地根據數據類型畫出每一個組件,但這種方法很顯然代碼復用率很低,大量重復了相應標量型組件的代碼,代碼的維護和同步會非常困難,也不容易實現皮膚切換。

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

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

  1. public class CellRendererPane extends Container implements Accessible  
  2. {  
  3. //構造函數  
  4. public CellRendererPane() {  
  5. super();  
  6. //注意CellRendererPane的布局管理器為空,后面渲染時有用!  
  7. setLayout(null);  
  8. //不可見,使之不被顯示在JTable上  
  9. setVisible(false);  
  10. }  
  11. //零實現  
  12. public void invalidate() { }  
  13. //零實現  
  14. public void paint(Graphics g) { }  
  15. //零實現  
  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還沒有添加當前CellRendererPane中  
  23. //添加進去  
  24. this.add(c);  
  25. }  
  26.  
  27. c.setBounds(x, y, w, h);  
  28.  
  29. if(shouldValidate) {  
  30. c.validate();  
  31. }  
  32. //下面主要處理雙緩沖問題,可略去  
  33. ......  
  34. //準備圖形對象  
  35. Graphics cg = g.create(x, y, w, h);  
  36. try {  
  37.  
  38. c.paint(cg);  
  39. }  
  40. }  
  41. }  

渲染器Renderer的核心思想都體現在上面紅色代碼標注的部分。將JTable的圖形對象傳遞給組件的paint的方法,產生的結果是將組件畫到了JTable上。其實Swing打印的原理也大抵如此,只不過這兒的圖形對象變成了打印機的圖形對象。雖然大部分Swing組件都專門對打印進行了專門的處理(主要是因為有一些圖形元素不希望被打印的,比如填充的內容往往不希望打印,可能是太耗墨了),但基本過程是一樣的。

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

渲染器思想在Swing中有著廣泛的應用。除利用它們實現JTable、JList、JTree和JComboBox等標準組件,還可以實現界面設計工具中屬性頁、類似UML設計圖、類似于MS Excel風格的電子表格等更為復雜的界面組件,甚至IDE中常見的界面設計工具也是利用了渲染器的思想,它把整個組件樹當作一個大渲染器,渲染出當前圖形用戶界面的設計效果。

渲染器是Swing展現復雜數據結構的利器。但是Swing組件不僅僅被用作展現數據,通常還是編輯數據的地方。實際上純粹展現數據的Swing組件很少,標準組件中也許只有JLabel。復合數據類型的組件往往使用渲染器原理實現組件的渲染,使用所謂in-place editor實現組件的編輯。渲染器Renderer和Editor的結合賦予了Swing強大的靈活性,JTable、等組件這兩種原理結合的代表。后續文章將講述in-place editor在Swing中的使用。

【編輯推薦】

  1. 介紹Swing線程相關處理
  2. 淺析Swing客戶端知識
  3. Swing線程解決方案
  4. 全面比較AWT和Swing
  5. 概述JSci.swing包的核心
責任編輯:佚名 來源: CSDN博客
相關推薦

2009-07-16 10:26:49

渲染器接口Swing

2009-07-15 13:48:26

Swing模型和渲染器

2017-12-26 14:27:24

2010-08-13 11:02:27

Flex渲染器

2009-07-10 13:20:37

Swing容器組件

2014-06-18 10:34:41

Android字體渲染器OpenGL ES

2009-06-22 15:07:45

原則和技巧JSF自定義復合組件

2009-07-10 10:19:57

JFormattedTSwing

2022-04-18 08:09:44

渲染器DOM掛載Vue.js

2009-07-10 14:58:13

JLabel組件JFC和Swing

2009-07-15 10:52:13

JTree組件

2010-08-13 11:21:31

Flex渲染器

2009-07-10 16:29:32

Swing組件

2022-08-14 23:04:54

React前端框架

2009-07-15 11:02:32

Swing組件

2009-07-14 17:21:42

Swing組件

2009-06-22 13:27:01

JSF組件模型

2009-07-10 18:06:59

JTree Swing

2009-07-17 12:54:13

2010-06-30 13:45:05

ZKZK 5.0.3
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 不用播放器看的av | 成人在线免费观看 | 午夜在线影院 | 另类视频在线 | 狠狠操av | 亚洲精品91| 美女视频一区二区三区 | 亚洲精品久久久久avwww潮水 | 亚洲视频中文字幕 | 久久久久久国产精品mv | 夜夜艹天天干 | 免费一级黄色电影 | 香蕉国产在线视频 | 一级黄色录像片子 | 色一情一乱一伦一区二区三区 | 日韩欧美一级片 | 国产午夜精品一区二区三区四区 | 精品一区二区在线观看 | gav成人免费播放视频 | 一级中国毛片 | 亚洲欧美视频 | 在线看91 | 一级二级三级黄色 | 婷婷久久精品一区二区 | 久久不射电影网 | 女同videos另类 | 国内精品视频免费观看 | 日韩免费一区二区 | 一区二区成人 | 久草在线在线精品观看 | 久草综合在线视频 | 亚洲精品乱码久久久久久蜜桃91 | 亚洲成人自拍网 | 国产在线精品一区二区 | 久久精品中文 | 久久中文字幕一区 | 毛片毛片毛片毛片 | 中文字幕一区二区三区精彩视频 | 午夜黄色 | 精品亚洲一区二区三区 | 国产玖玖 |