JCheckBox in JTable
public class MyTableModel extends AbstractTableModel {
Object[][] data;Object[] columnNames;
MyTableModel(Object[][] data, Object[] columnNames) {
this.data = data;
this.columnNames = columnNames;
}
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public Object getValueAt(int row, int col) {
System.out.println("第"+row+"行"+col+"列:"+data[row][col]);
return data[row][col];
}
// 该方法不一定要加入AbstractTableModel类,该方法设置列表的标题
public String getColumnName(int col) {
return columnNames[col] + "";
}
// 通过getClass()方法设置默认的控件,如true与false的默认控件是复选框,
// 该方法不一定要加入AbstractTableModel类
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
// 定义可以编辑的单元,true表示可编辑,false表示不可编辑
public boolean isCellEditable(int row, int col) {
return true;
}
// 将改变后的值保存在表格中
public void setValueAt(Object value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
}
应用上面的类:
public JScrollPane initTableHeadend(Object[][] data, Object[] columnNames) {
/**row:二维数组;columns:一维数组****/
TableModel model = new MyTableModel(data , columnNames);
//System.out.println(model.getColumnName(2));
JTable table = new JTable( model);
//table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setRowHeight(20); // 设置表格的行高度
// 使选择框成为一个单元格
table.setColumnSelectionAllowed(true);
TableColumnModel TCM=table.getColumnModel();
TCM.getColumn(1).setCellEditor(new DefaultCellEditor(this.tableHeadEndTypeJC)) ;
TCM.getColumn(6).setCellEditor(new DefaultCellEditor(this.varTypeJC)) ;
TCM.getColumn(9).setCellEditor(new DefaultCellEditor(this.positionJC)) ;
TCM.getColumn(10).setCellEditor(new DefaultCellEditor(this.fontSizeJC)) ;
TCM.getColumn(11).setCellEditor(new DefaultCellEditor(this.fontJC)) ;
TCM.getColumn(2).setCellEditor(new DefaultCellEditor(new JCheckBox()));
TCM.getColumn(12).setCellEditor(new DefaultCellEditor(new JCheckBox()));
TCM.getColumn(13).setCellEditor(new DefaultCellEditor(new JCheckBox()));
JScrollPane pane = new JScrollPane(table);
return pane;
}
期间碰到的异常:AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 11
// 该方法不一定要加入AbstractTableModel类
在下面抛出来的
public Object getValueAt(int row, int col) {
System.out.println("第"+row+"行"+col+"列:"+data[row][col]);
return data[row][col];
}
原因:是数组的列长度参差不起导致,如:
Object rows2[][] =
{ { "中国", 44,false,"滑雪","滑雪","滑雪","滑雪","滑雪","","","",new Boolean(true),false},
};
String columns2[] = { "类别","排列","是否打印", "标题或栏目名称", "变量名", "变量类型", "宽度", "行高", "对齐", "字体", "字号","加粗","加下划线" };
如果rows[0].length或rows[1].length不等于columns2.length,就会抛出该异常
修改:补齐漏掉的列。