java Swing JTable的实用技巧实例源码。无论对于什么样的一个应用程序来说,用表格的形式来显示数据是再平常不过的事情了。于是JTable就成为我们在所有Swing组件中最不可或缺的朋友。对于JTable的操作,大多数情况下我们都可以不假外求,因为JDK自带的例子SwingSet2给我们展示了足够多的功能。
在这个例子里,我们可以改变单元格的间距,行高,选择类型(Selection Style),是否显示水平线,甚至可以将表格内容打印出来。其中,表格除了文字之外还可以包含其他组件和内容,如SwingSet2种就加入了可以选择颜色的JComboBox和喜爱的食物所代表的图片。
但 有些时候,我们还会有一些其他的需求。例如说为了保护我们的眼睛,我们希望表格的内容是带有间隔色的,如奇数行显示蓝色,而偶数行显示白色。又或者我们希 望表格中某些列的内容是可编辑的,而且他列的内容是不可编辑的。又或者让表格中的列带有排序的功能,能让我们点一下表头它就自己按照从低到高或从高到低的 顺序自行排列。最后我们希望表格的表头和单元格力的内容能够居中显示。让我们一个一个来实现这些功能!
4.1 间隔色表格及单元格/表头居中显示
JTable的API并没有为我们提供更改表格行或列的颜色的能力。但是我们知道,表格的表头和内容的呈现形式都是由相应的Renderer来控制的,所以我们只需要继承单元格默认的Renderer并作相应的修改就可以达到目的:
由于实现了接口TableCellRenderer,我们只需要实现唯一的函数getTableCellRendererComponent(…)。在上例中我们看到,在函数中我们判断当前行是奇数还是偶数,如果是奇数,就设置其背景色为淡蓝色,否则就设其背景色为白色。在每次更新表格内容的时候,我们只需要调用下面的函数,就可以保证表格在内容被更改之后依然正确显示间隔色。
/** 为所有表格设置间隔色 **/
private void setRenderColor(){
for( int i = 0; i
}
另外,如果我们想要让单元格中的内容居中显示的话,请注意到在设置间隔色部分下面的函数,通过setHorizontalAlignment(SwingConstants.CENTER)我们就可以让单元格内容居中显示。
虽然JTable表格的表头在默认情况下应该是居中显示的,但不知道为什么,在我的应用程序中表格的表头总是左对齐显示,这让我恼火不已。由于和单元格一样,表头的各项显示指标也是由其Renderer控制的,所以只需要设置一下表头的Renderer就能达到目的:
DefaultTableCellRenderer renderer = (DefaultTableCellRenderer)table.getTableHeader().getDefaultRenderer();
renderer.setHorizontalAlignment(renderer.CENTER);
利用这种方法,如果我们需要让他右对齐似乎也不是什么难事,对吗?
4.2 让某些单元格不可编辑
有些时候,我们希望有些行/列可以被编辑,而有些行/列不能被编辑。如下就是一例,我的程序希望第一列(编号列)的内容可以被用户通过双击进行编辑,而其他列则不能被用户编辑。单元格能否被编辑取决于JTable的isCellEditable(int row,int column)。如果该函数返回true则(row,column)所代表的单元格可以被编辑,否则该单元格不能被编辑。于是我建立了一个名为SingleUnitEditableTable的类,他继承自JTable,并Overwrite了isCellEditable(int row,int column)方法:
//设置单元格不可编辑,为缺省实现
public boolean isCellEditable(int row, int column) {
if( editableColumn != -1){
if( column == editableColumn )
return true;
return false;
}
return false;
}
其中的editableColumn是一个内部属性,用来指定哪个列可以被编辑。通过这个例子,我相信,如果你想实现奇数行/列可编辑而偶数行/列不可被编辑或者满足特定条件的单元格不可被编辑这样的JTable易如反掌了吧?下面就是我的应用程序的结果:
第一列可编辑
其他列均不可编辑
4.3 JTable自排序
这个问题已经由JDK6.0帮我们解决了,在这个版本,JDK为我们提供了一个名为TableRowSorter的类,在程序中我们只需要写2行代码即可实现表格内容的排序:
TableRowSorter sorter = new TableRowSorter(tableModel);
accAllTable.setRowSorter(sorter);
看到“编号”列旁边的箭头了吗?如果我们用鼠标点击表头,JTable就会自动为我们由小到大排序,再点一下,表格就会从大到小排序,真是十分方便。而对于JDK6.0之前的应用程序就没有这么好的运气了,我们需要自己实现一个TableRowSorter,并且自己生成一个表头的Renderer来实现排序小箭头,真是繁琐啊!我这里倒是有一个不错的实现,如果有人需要的话可以给我留言。不过自己实现Renderer采用的是JLabel,会改变表头的模样,不如默认的表头好看,所以可能的话还