TableCellRenderer用法实践(一)

转载:http://blog.csdn.net/chosen0ne/article/details/4453267

Swing组件根据其所操作的数据类型分为两种,一种是标量数据类型的组件,一类是复合数据类型的组件。标量数据类型的组件操作的是基本类型的数据,如字符串、布尔、数字等,此类型组件包括JTextField、JCheckBox、JLabel、JButton等。复合数据类型的组件操作的是诸如向量、矩阵和非线形等类型的数据。向量数据类型的组件有JComboBox、JList,矩阵数据类型的组件有JTable,非线形数据类型的组件如 JTree。 
     为更形象地展现各种类型的数据,复合数据类型的组件往往采用标量数据类型组件来表现每种数据元素。比如JTable的某一列数据是字符串类型,那么该列的单元格往往用JLabel方式展现每个字符串;如果一列数据是布尔类型,那么该列的单元格往往用JCheckBox方式展现每个布尔值。 
     如何实现复合数据类型的组件的渲染呢?最直接的是在paint方法中一个一个地根据数据类型画出每一个组件,但这种方法很显然代码复用率很低,大量重复了相应标量型组件的代码,代码的维护和同步会非常困难,也不容易实现皮肤切换。 
     为解决此问题,Swing体系中提出了所谓渲染器(Renderer)的概念,其核心思想是使用接口,封装和复用已有标量型组件的渲染代码,降低代码重复率,提高组件的可扩展性。

JTable负责管理表格的可视外观,在绘制每个单元格时,调用getCellRenderer(int row,int col)获得当前单元格的渲染器,即得到一个Component,然后将其绘制展现。TableCellRenderer是一个接口,只有一个方法:

Component getTableCellRendererComponent(JTable table,
                                        Object value,
                                        boolean isSelected,
                                        boolean hasFocus,
                                        int row,
                                        int column)

其中,row和column标识一个单元格。也就是说,可以根据row和column的不同(单元格也就不同),获得不同的填充组件,这样只需要在该方法内进行相应的逻辑判断。例如,可以实现同一列的不同行渲染效果不同,可以是单元格的背景色不同,或者是单元格内的字体不同诸如此类。下面的列子是,实现偶数行被划一道行线的效果:

[java] view plain copy

print?

  1. import java.awt.*;
  2. import javax.swing.*;
  3. import javax.swing.table.*;
  4. public class RoundColorTable extends JFrame {
  5. private String[] colname = {"第1列","第2列","第3列","第4列","第5列"}; //表头信息
  6. private String[][] data = new String[10][5]; //表内容
  7. private JTable table;
  8. public RoundColorTable() {
  9. //表内容赋值
  10. for(int i = 0; i < 10; i++) {
  11. for(int j = 0; j < 5; j++) {
  12. data[i][j] = "( " + (j+1) + ", " + (i+1) + " )";
  13. }
  14. }
  15. table = new JTable(new DefaultTableModel(data,colname));
  16. TableCellRenderer tcr = new ColorTableCellRenderer();
  17. table.setDefaultRenderer(Object.class,tcr);//为JTable增加渲染器,因为是针对于表格中的所有单元格,所有用Object.class
  18. add(new JScrollPane(table),BorderLayout.CENTER);
  19. setVisible(true);
  20. setSize(500,300);
  21. setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  22. }
  23. public static void main(String args[]) {
  24. new RoundColorTable();
  25. }
  26. }
  27. class ColorTableCellRenderer extends DefaultTableCellRenderer
  28. {
  29. DefaultTableCellRenderer renderer=new DefaultTableCellRenderer();
  30. public Component getTableCellRendererComponent(JTable table, Object value,
  31. boolean isSelected, boolean hasFocus, int row, int column) {
  32. if(row%2 == 0){
  33. //调用基类方法
  34. return super.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);
  35. }
  36. else{
  37. return renderer.getTableCellRendererComponent(table, value, isSelected,hasFocus, row, column);
  38. }
  39. }
  40. //该类继承与JLabel,Graphics用于绘制单元格,绘制红线
  41. public void paintComponent(Graphics g){
  42. super.paintComponent(g);
  43. Graphics2D g2=(Graphics2D)g;
  44. final BasicStroke stroke=new BasicStroke(2.0f);
  45. g2.setColor(Color.RED);
  46. g2.setStroke(stroke);
  47. g2.drawLine(0,getHeight()/2,getWidth(),getHeight()/2);
  48. }
  49. }
时间: 2024-11-09 16:24:43

TableCellRenderer用法实践(一)的相关文章

Linux find命令的用法实践

一.find命令简介 Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下.即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限. 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统). 1.命令格

PHP命令空间namespace及use的用法实践总结

看PHP中的命名空间和use namespace app\admin\model; use think\Model; use think\Db; 综上可以看出,命名空间就是相当于一个文件夹的路径. 同一个命名空间下,不能有相同的类文件. 同名的类文件可以存在于不同的命名空间下面. 用了命名空间,可以方便的调用其他文件夹下的文件. 只需要通过using.import.use引入命名空间下的文件即可. 从5.3开始你可以使用命名空间来组织你的代码了. 不同的命名空间内可以包含相同名字的类.函数以及常

java反射--Field用法实践

Field是一个位于java.lang.reflect包下的类,用来描述类的属性信息,功能主要包括: 获取哦大年对象的成员变量类型 对成员变量重新设值 Field类对象: Class.getFields(): 获取类中public类型的属性,返回一个包含某些 Field 对象的数组,该数组包含此 Class 对象所表示的类或接口的所有可访问公共字段getDeclaredFields(): 获取类中所有的属性(public.protected.default.private),但不包括继承的属性,

CountDownLatch用法实践

项目中写多线程时,需要判断所有线程是否执行完毕,所以想到了添加累加器来判断.这个累加器使用什么变量,找到了以下2种方式. 1. 类似AtomicInteger这种提供原子操作的类型AtomicInteger count = new AtomicInteger(0);count.getAndIncrement(); 2.CountDownLatchCountDownLatch主要有两个方法:countDown()和await().countDown():用于使计数器减一,其一般是执行任务的线程调用

html实践——IFE task 02(CSS选择器)

====任务描述==== [原链接]http://ife.baidu.com/task/detail?taskId=2 任务目的 针对设计稿样式进行合理的HTML架构,包括以下但不限于: 掌握常用HTML标签的含义.用法 能够基于设计稿来合理规划HTML文档结构 理解语义化,合理地使用HTML标签来构建页面 掌握基本的CSS编码,包括以下但不限于: 了解CSS的定义.概念.发展简史 掌握CSS选择器的含义和用法 实践并掌握CSS的颜色.字体.背景.边框.盒模型.简单布局等样式的定义方式 任务描述

一个小型线上网站的产生历程

自学了一段时间web开发后面试了份全站实习工作(就是前后端包括服务器搭建都一个人完成).然后就开始了第一次真实搭建一个线上运营的网站的历程... 整个网站包括6个可显示页面,其中3个为动态生成页面.由于是企业的一个业务使用网站(就是用户通过登录我们网站使用公司提供的某项业务),不涉及支付,涉及的数据库表规模和实际日访问量都不会太大,此外涉及一个用调用实际业务代码(C代码)的问题. 前后我的主要开发时间大概是2周,2周后我基本已经闲着在关注安全问题和做些小改善了...所以估计出来的网站还是比较粗糙

百度前端技术学院—-小薇学院(HTML+CSS课程任务)

任务一:零基础HTML编码 课程概述 作业提交截止时间:04-24 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量以及学习难度的合理性,但即使如此,真正决定课程效果的,还是你的每一次思考和实践. 课程多数题目的解决方案都不是唯一的,这和我们在实际工作中的情况也是一致的.因此,我们的要求不仅仅是实现设计稿的效果,更是要多去思考不同的解决方案,评估不同方案的优劣,然后使用在该场景下最优雅的方式去实现.那些最终没有被我们采纳的方案,同

为Jenkins增加ssl(https)的访问支持(Windows/Linux)

前言: 增加ssl(https)的访问可以为部署在公网下的jenkins提供更安全的问题,最明显的好处应该是登录和jenkins-ci.jar的调用. 比如jenkins-ci.jar的调用,一般在windows下通过明文账号密码的传输请求是非常不安全的:有关windows配置和实践参考以下文章: http://www.cnblogs.com/EasonJim/p/6086018.html(这篇是关于windows的配置方法) http://www.cnblogs.com/EasonJim/p/

layUI独立组件layer-laydate-laypage项目实践用法

layUI官网:http://www.layui.com/ 有以下四个独立组件(可单独使用): 弹出层组件layer链接:http://layer.layui.com/ 日期组件laydate链接:https://www.layui.com/laydate/ 分页组件laypage链接:https://www.layui.com/laypage/ 轻量的JavaScript模板引擎laytpl链接:https://www.layui.com/laytpl/(暂未使用) 项目中实践用法汇总 项目技