假设我创建的Jtable名称为table,table存的是PersonItem的信息:
1.首先创建PersonItem的demo:
class PersonItem {
private String name;
private String age;
private String sex;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
2,,创建一个MyTableModel继承AbstractTableModel ,并重写一些方法,作为table的model:
class MyTableModel extends AbstractTableModel {
private String[] columnNames = new String[] { "num", "name", "age", "sex" };
ArrayList<PersonItem> itemList = new ArrayList<PersonItem>();
private Class[] typeNames = new Class[] { java.lang.String.class,
java.lang.String.class, java.lang.String.class,
java.lang.String.class };
@Override
public int getRowCount() {
return itemList.size();
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
if (columnIndex == 0) {
return rowIndex + 1;
} else if (columnIndex == 1) {
return itemList.get(rowIndex).getName();
} else if (columnIndex == 2) {
return itemList.get(rowIndex).getAge();
} else if (columnIndex == 3) {
return itemList.get(rowIndex).getSex();
}
return "";
}
@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
if (columnIndex == 1) {
itemList.get(columnIndex).setName(aValue.toString());
} else if (columnIndex == 2) {
itemList.get(columnIndex).setAge(aValue.toString());
} else if (columnIndex == 3) {
itemList.get(columnIndex).setSex(aValue.toString());
}
fireTableRowsUpdated(rowIndex, rowIndex);
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
if (columnIndex == 0) {// 第一列为需要,不允许修改
return false;
} else {
return true;
}
}
@Override
public String getColumnName(int column) {
return columnNames[column];
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return typeNames[columnIndex];
}
public void add(int index) {
PersonItem item = new PersonItem();
item.setName("");
item.setAge("");
item.setSex("");
if (index < 0 || index > itemList.size()) {
itemList.add(item);// 没有指定在某一行后添加一行
} else {
itemList.add(index, item);// 指定在某一行后添加一行
}
fireTableDataChanged();
}
public void remove(int index) {
itemList.remove(index);
fireTableDataChanged();
}
}
3.table有添加和删除操作:
public void addRow(){
if (table.getCellEditor() != null && table.getRowCount() > 0) {
table.getCellEditor().stopCellEditing();
}
int selectRow = table.getSelectedRow();
if (selectRow > -1) {// 指定某行被选中,在此行下面添加行
model.add(selectRow + 1);
table.setRowSelectionInterval(selectRow + 1, selectRow + 1);// 选择selectRow这一行
table.setColumnSelectionInterval(1, 1);// 选择第一列
} else {// 没有指定在某一行下添加,默认添加到最后
model.add(table.getRowCount());
table.setRowSelectionInterval(table.getRowCount() - 1,table.getRowCount() - 1);
table.setColumnSelectionInterval(1, 1);
}
table.scrollRectToVisible(table.getCellRect(table.getSelectedRow(), 1,true));//将消息转发到父控件
table.editCellAt(table.getSelectedRow(), 1);
table.requestFocus();
}
public void deleteRow() {
if (table.getCellEditor() != null && table.getRowCount() > 0) {
table.getCellEditor().stopCellEditing();
}
int selectRow = table.getSelectedRow();
if (selectRow < 0) {// 没有行被选中,不继续执行
return;
}
model.remove(selectRow);// 删除指定的某行
if (table.getRowCount() > 0) {
if (selectRow > 0) {
selectRow = selectRow - 1;
}
table.setRowSelectionInterval(selectRow, selectRow);
table.setColumnSelectionInterval(1, 1);
} else {
selectRow = -1;
}
table.requestFocus();
}
4.设置表格的表头居中:
DefaultTableCellRenderer render = (DefaultTableCellRenderer) table.getTableHeader().getDefaultRenderer();
render.setHorizontalAlignment(DefaultTableCellRenderer.CENTER);