电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

swing框架之renderer

18页
  • 卖家[上传人]:小**
  • 文档编号:89127405
  • 上传时间:2019-05-19
  • 文档格式:DOC
  • 文档大小:167KB
  • / 18 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、Swing框架之RendererSwing组件根据其所操作的数据类型分为两种,一种是标量数据类型的组件,一类是复合数据类型的组件。标量数据类型的组件操作的是基本类型的数据,如字符串、布尔、数字等,此类型组件包括JTextField、JCheckBox、JLabel、JButton等。复合数据类型的组件操作的是诸如向量、矩形和非线形等类型的数据。向量数据类型的组件有JComboBox、JList,矩形数据类型的组件有JTable,非线形数据类型的组件如JTree。为更形象地展现各种类型的数据,复合数据类型的组件往往采用标量数据类型组件来表现每种数据元素。比如JTable的某一列数据是字符串类型,那么该列的单元格往往用JLabel方式展现每个字符串;如果一列数据是布尔类型,那么该列的单元格往往用JCheckBox方式展现每个布尔值。如何实现复合数据类型的组件的渲染呢?最直接的是在paint方法中一个一个地根据数据类型画出每一个组件,但这种方法很显然代码复用率很低,大量重复了相应标量型组件的代码,代码的维护和同步会非常困难,也不容易实现皮肤切换。为解决此问题,Swing体系中提出了所谓渲染器

      2、(Renderer)的概念,其核心思想是使用接口,封装和复用已有标量型组件的渲染代码,降低代码重复率,提高组件的可扩展性。渲染器是如何工作的呢?我们以JTable的渲染代码来演示渲染器的工作原理。下面代码是从JTable的UI类javax.swing.plaf.basic.BasicTableUI中摘出的部分代码(JDK 6):/注:为清晰期间,只显示了关键代码public void paint(Graphics g, JComponent c) ./计算当前可显示区域的行列范围./ 画出表格的分割线paintGrid(g, rMin, rMax, cMin, cMax);/ 画出表格单元格的内容paintCells(g, rMin, rMax, cMin, cMax);/如果正在拖动列,画出正在被拖动的线paintDropLines(g);paintCells实现所有单元格的渲染过程:private void paintCells(Graphics g, int rMin, int rMax, int cMin, int cMax) .for(int row = rMin; row

      3、= rMax; row+) cellRect = table.getCellRect(row, cMin, false);for(int column = cMin; column = cMax; column+) /遍历表格的每一个单元格.paintCell(g, cellRect, row, column);cellRect.x += columnWidth;.渲染单元格的方法paintCell的实现:private void paintCell(Graphics g, Rectangle cellRect, int row, int column) if (如果当前格是正在编辑的) /重新设置编辑器的边框.else /获取当前格的渲染器TableCellRenderer renderer = table.getCellRenderer(row, column);/配置当前的渲染器Component component= table.prepareRenderer(renderer, row, column);/使用渲染器来渲染当前表格rendererPane.paintCompo

      4、nent(g, component, table, cellRect.x, cellRect.y,cellRect.width, cellRect.height, true);public Component prepareRenderer(TableCellRenderer renderer, int row, int column) Object value = getValueAt(row, column);./调用渲染器的配置方法配置并获取合适的渲染组件return renderer.getTableCellRendererComponent(this, value,isSelected, hasFocus,row, column);如何使用渲染器返回的组件渲染当前的单元格呢?JTable在自己内部隐藏了一个所谓的CellRendererPane组件,该组件是一个“零实现”的容器组件。虽然被添加到JTable上,但它是不可见的,其paint和update方法都为空,仅仅作为临时容纳渲染组件的容器,目的是将渲染组件粘合到JTable组件树上,使得渲染组件有效化,以便使它们达到渲染

      5、前的正确状态。下面代码演示了CellRendererPane的概要结构:public class CellRendererPane extends Container implements Accessible/构造函数public CellRendererPane() super();/注意CellRendererPane的布局管理器为空,后面渲染时有用!setLayout(null);/不可见,使之不被显示在JTable上setVisible(false);/零实现public void invalidate() /零实现public void paint(Graphics g) /零实现public void update(Graphics g) ./下面是CellRendererPane的paintComponent方法:public void paintComponent(Graphics g, Component c, Container p, int x, int y, int w, int h, boolean shouldValidate) .if (c.getPar

      6、ent() != this) /如果渲染组件c还没有添加当前CellRendererPane中/添加进去this.add(c);/构造函数将布局管理器设置为空,setBounds将渲染组件设置成相应的位置和尺寸c.setBounds(x, y, w, h);/将渲染组件在JTable的组件树上有效化,目的是如果渲染组件是一个有内部结构的复合组件,比如一个JTextField 和一个JButton构成的一个复合框组件,该过程将会使内部组件进行布局,并递归此过程,使得该组件达到正常显示应该达到的效果。if(shouldValidate) c.validate();/下面主要处理双缓冲问题,可略去./准备图形对象Graphics cg = g.create(x, y, w, h);try /调用渲染组件的重画方法渲染,注意由于cg其实是JTable的图形对象,因此其效果是将该组件渲染到JTable上相应单元格,从而达到了代码复用。c.paint(cg);.渲染器的核心思想都体现在上面红色代码标注的部分。将JTable的图形对象传递给组件的paint的方法,产生的结果是将组件画到了JTable

      7、上。其实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中的使用。Swing的API具有很强的灵活性和可扩展性,比如标准复合数据型组件一般不需要进行渲染器扩展,就可以实现许多应用,但是当遇到需要自定义扩展的需求时,Swing

      《swing框架之renderer》由会员小**分享,可在线阅读,更多相关《swing框架之renderer》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2 2022年小学体育教师学期工作总结 2022年家长会心得体会集合15篇
     
    收藏店铺
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.