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值得,这样就会产生“空指针的错误”,在操作前要先判断。
第二种方式选择用户定制的代码,在右键-属性的代码标签中在-"初始化前代码"中加入 调用的是DefaultTableModel类
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)函数来插入一行信息。而且这种方式在删除记录的时候不会出现空指针的情况,但是就外观来说,没有行线