网上搜索的多为整列渲染,摸门不着,甚是苦恼。琢磨出一种“逐格”渲染的方法,供象我一样曾经苦恼过的朋友参考。
一、先写一个“渲染”类,继承自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关联起来,相当于将表对象传递给了渲染类的对象,该对象获得了表,便可以从中“抽取”某个单元格的值,进而做单元格内的“文章”。
以上代码中,单元格内可以是标签、按钮等不同组件,渲染的内容可以是文字、图片、背景颜色等,可根据自己的需求对代码做相应调整。