JTable是Swing常用的组件,可以用来显示数据及对数据的一些操作,笔者在这里陈述一下在编程过程自己对JTable使用的一些愚见。——欢迎补充交流,如需转载,请注明作者与出处。
在这里用一个小程序来探索JTable的一些功能的使用方法。新建一个demo类,并实例化JTable,如下:
public class Demo extends JFrame{
public Demo(){
setSize(340,180);
setLocationRelativeTo(null);
Container content = getContentPane();
Object[][] cellData = {{"row1-col1", "row1-col2"},{"row2-col1", "row2-col2"}};
String[] columnNames = {"col1", "col2"};
JTable table = new JTable(cellData, columnNames);
content.add(table,BorderLayout.NORTH);
setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main(String[]args){
new Demo();
}
}
然而,这并没有达到我们的目的,因为使用上面的代码并不能显示table的列名,如下图:原因是没有将table加入JScrollPane中,添加如下代码即可:
JScrollPane tablePane = new JScrollPane(table);
content.add(tablePane, BorderLayout.CENTER);
自此,我们就可以看到一个表格呈现在面前了
图书管理系统常常用到JTable ,在这里根据setViewportView()方法来实现一些简单的功能。
因为图书管理系统中table显示的图书信息等一般都是通过KeyListener,ActionListener等来触发的,
所以在触发之前cellData是没有显示出来的。相信有些程序猿跟我一开始一样以为这样能解决问题:
JTable table = new JTable(null, columnNames);但事与愿违,运行后会出现这样的错误提示
解决这个问题我们可以使用这样的方法:Object[][]cellData= { { null }, { null } };声明一个空的二维数组,以代替null。因为接下来会涉及到获取数据库信息来显示到table上,为此我在这里引用一个已写好的程序来展示:
在触发KeyListener或ActionListener事件之后我们可以设置一个model以使table不可编辑
DefaultTableModel model = new DefaultTableModel(result, heads) {// 使表格不可被编辑
public boolean isCellEditable(int row, int column) {
return false;
}
};
table = new JTable(model);
此时我们需要调用setViewportView()方法来显示获得数据:scrollPane.setViewportView(table);
以下是一些其他功能,不一一演示,仅列出于此:
一、对表格列的控制
1)设置列不可随容器组件大小变化自动调整宽度
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
2) 限制某列的宽度
TableColumn firsetColumn = table.getColumnModel().getColumn(0);
firsetColumn.setPreferredWidth(30);
firsetColumn.setMaxWidth(30);
firsetColumn.setMinWidth(30);
3) 设置当前列数
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
int count=5;
tableModel.setColumnCount(count);
4) 取得表格列数
int cols = table.getColumnCount();
5) 添加列
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
tableModel.addColumn("新列名");
6) 删除列
table.removeColumn(table.getColumnModel().getColumn(columnIndex));//
columnIndex是要删除的列序号
对表格行的控制与对列的控制大多相似,这里就不一一列举了。
二、取得用户所选的行
int selectRows=table.getSelectedRows().length;// 取得用户所选行的行数
DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
if(selectRows==1){
int selectedRowIndex = table.getSelectedRow(); // 取得用户所选单行
// 进行相关处理
}
if(selectRows>1)
int[] selRowIndexs=table.getSelectedRows();// 用户所选行的序列
for(int i=0;i<selRowIndexs.length;i++){
// 用tableModel.getValueAt(row, column)取单元格数据
String cellValue=(String) tableModel.getValueAt(i, 1);
}
}