swing JTable根据单元格不同内容,对单元格进行个性化渲染

网上搜索的多为整列渲染,摸门不着,甚是苦恼。琢磨出一种“逐格”渲染的方法,供象我一样曾经苦恼过的朋友参考。

一、先写一个“渲染”类,继承自DefaultTableCellRenderer

此类要渲染一个表,表中单元格存放图片或文本的本地路径(即你想让单元格显示文本或图片)。每个单元格里都有一个标签(JLabel,文本或图片显示在标签上),当然,也可以是按钮等组件。根据不同的文件扩展名,在标签上加载不同内容。
渲染表格时,系统应该是逐格扫描,因此,此类中重写的方法
getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
的参数也有如下解释:
JTable table:要渲染的表,在使用此类的对象时要和所要渲染的表关联,因此表(对象)就会传入此类的对象中;
Object value:扫描到的某单元格的值;
int row, int column:扫描到的某单元格的行、列索引。

public class PicAndTextTabCellRenderer extends DefaultTableCellRenderer {
	JLabel jLabel;
	String ext;                                // 单元格值的扩展名如:txt、jpg等
	String s;                                  // 文本文件内容
	ImageIcon oriIcon;                         // 由文件路径生成的源图标
	ImageIcon resultIcon;                      // 由大图处理后的“结果图标”
	public PicAndTextTabCellRenderer() {
		jLabel = new JLabel();
	}
	//@Override
	public Component getTableCellRendererComponent(JTable table, Object value,
			boolean isSelected, boolean hasFocus, int row, int column) {
		ext = FileUtil.getExtension((String)value); // 自己写的获取扩展名方法
		if (ext.equals("txt")) {                              // 如果单元格内容为纯文本(txt)
			jLabel.setIcon(null);                             // “打扫”按钮上的图标
			jLabel.setText("");                               // “打扫”按钮上的文本
			jLabel.setVerticalAlignment(SwingConstants.NORTH);// 文本考上显示
			s = FileUtil.getStringFromDisk((String)value);
			jLabel.setText("<html>" + s + "</html>");         // 在标签面上自动换行
		} else if (ext.equals("jpg") || ext.equals("png")) {  // 图片只允许两种格式:jpg、png
			jLabel.setIcon(null);
			jLabel.setText("");
			jLabel.setVerticalAlignment(SwingConstants.CENTER);
			oriIcon = new ImageIcon((String)value);
			resultIcon = FileUtil.scaledIcon(oriIcon);        // 自己写的方法,由源图获取加工后的小图标
			jLabel.setIcon(resultIcon);
		} else {
			jLabel.setIcon(null);                             // 此清除很重要
			jLabel.setText("");
		}
		return jLabel;
	}
}

这个类描述的是如何渲染“一个单元格”,根据单元格的行、列(int row, int column)索引定位到一个单元格,再根据该单元格的值(Object value)决定如何渲染。个性化主要在这里表现出来。

二、再以“逐列”渲染的方式运用该类的对象

下面是一个供调用的“渲染”方法,只用提供一个参数:表,也就是:你要渲染哪个表,接下来怎么渲染“交给我”!
按列数逐列渲染,而列内又是逐个单元格渲染,这就实现了所有单元格的个性化渲染。

public static void renderBigFileTab(JTable jTable) {
	PicAndTextTabCellRenderer r;
	int colCount = jTable.getColumnCount(); // 列数
	for (int i = 1; i < colCount; i++) {    // 从第二列开始渲染(列渲染个性化,也可以是所有列)
		r = new PicAndTextTabCellRenderer();
		jTable.getColumnModel().getColumn(i).setCellRenderer(r);
	}
}

代码:
jTable.getColumnModel().getColumn(i).setCellRenderer®;
将表对象jTable与渲染类对象r关联起来,相当于将表对象传递给了渲染类的对象,该对象获得了表,便可以从中“抽取”某个单元格的值,进而做单元格内的“文章”。
以上代码中,单元格内可以是标签、按钮等不同组件,渲染的内容可以是文字、图片、背景颜色等,可根据自己的需求对代码做相应调整。

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值