Swing颇受欢迎的JTable类为显示大块数据提供了一种简单的机制。JTable有很多东西是用于数据的生成和编辑,其中的很多东西还可以自定义,从而更进一步增强其功能。本文会引导你一步步地进入JTable的世界。
Listing A包含了一个简单示例的代码,这个示例会说明常用JTable的行为。用户能够更改JTable的布局、拖放它的栏,或者通过拖动标题的分隔线来改变其大小。
这些列被保存在一个String数组里:
String[] columnNames = {"Product","Number of Boxes","Price"};
数据被初始化并保存在一个二维的对象数组里:
Object[][] data =
{
{"Apples", new Integer(5),"5.00"},
{"Oranges", new Integer(3),"6.00"},
{"Pears", new Integer(2),"4.00"},
{"Grapes", new Integer(3),"2.00"},
};
JTable是使用data和columnNames构成的:
JTable table = new JTable(data, columnNames);
Netbeans 中可以设置Model 的模式,在JTable 中右键选择“表内容”,在表模型中可以选择“用户指定的”或者是“定制代码”,选择第一个就可以在行中输入第一行字段,也就是表的标题,在列标签里可以指定表的列数。
根据用户的设置,生成的代码:
TableInfo.setModel(new javax.swing.table.DefaultTableModel( new Object [][] { {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null}, {null, null, null, null, null, null, null, null, null, null, null, null, null} }, new String [] { "学号", "姓名", "出生年月", "性别", "学校", "地址", "学院", "专业", "手机号码", "班级", "Email", "QQ号", "备注" } ) { Class[] types = new Class [] { java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class, java.lang.String.class }; boolean[] canEdit = new boolean [] { false, false, false, false, false, false, false, false, false, false, false, false, false }; public Class getColumnClass(int columnIndex) { return types [columnIndex]; } public boolean isCellEditable(int rowIndex, int columnIndex) { return canEdit [columnIndex]; } });
生成的表的样式是:
这种方式在向表中添加字段的时候只能用setValueAt(Object aValue, int row,int column)
TableModel model=this.TableInfo.getModel(); for(int i=0;i<row;i++) { model.setValueAt(str[i+1][1],i,0); model.setValueAt(str[i+1][2],i,1); model.setValueAt(str[i+1][3]+str[i+1][4],i,2); model.setValueAt(str[i+1][5],i,3); model.setValueAt(str[i+1][6],i,4); model.setValueAt(str[i+1][7],i,5); model.setValueAt(str[i+1][8],i,6); model.setValueAt(str[i+1][9],i,7); model.setValueAt(str[i+1][10],i,8); model.setValueAt(str[i+1][11],i,9); model.setValueAt(str[i+1][12],i,10); model.setValueAt(str[i+1][13],i,11); model.setValueAt(str[i+1][14],i,12); }比较容易出的问题是在删除表中的某一项时,上面初始化的创建的行数并不一定都会被填满值,所以用函数.getRowCount()获得的行数是所有的行包括NULL值得,这样就会产生“空指针的错误”,在操作前要先判断。
Tbmodel1 = new javax.swing.table.DefaultTableModel( new Object [][]{ }, new String [] { "ID", "PA" } );在“初始化后代码”中加入(patternTable 是表名称)
patternTable.setColumnSelectionAllowed(false); patternTable.setCellSelectionEnabled(false); patternTable.setRowSelectionAllowed(true); patternTable.setShowGrid(true); patternTable.setShowHorizontalLines(true); patternTable.setShowVerticalLines(true);
生成的表的样式是:
生成的表示没有行线和列线的,这个表中现在还没有字段,插入一行内容就会多一行,不会出现行中没有值得情况,可以调用DefaultTableModel中的
addRow(Object[] rowData)函数来插入一行信息。而且这种方式在删除记录的时候不会出现空指针的情况,但是就外观来说,没有行线