我也想知道这个问题。在JTable中把focusable设为false之后,默认的是双击一个cell的时候开始进入编辑状态。但是在编辑完或放弃编辑后,单击其他区域的时候会抛出很多异常。即那个cell仍处于编辑状态,那个黑框取消不掉。下面是我的代码:
}else if (clickCount == 1){
if (isEditing()){
int row_edit =getEditingRow(); //获取正在编辑的行
int col_edit =getEditingColumn(); //获取正在编辑的列 Rectangle rect = getCellRect(row_edit, col_edit, false); //得到所在行列的巨型区域
if (!rect.contains(p)){ //p是鼠标所在点
try{
CellEditor ce = getCellEditor(row_edit, col_edit);
ce.stopCellEditing();
Object value = ce.getCellEditorValue();
FileListTableModel tableModel = getDefaultModel();
tableModel.setValueAt(value, row_edit, col_edit);
tableModel.fireTableDataChanged();
}catch(Exception evt){
System.out.println("error: "+ evt.getMessage()+"\n"+
"source: "+ evt.getCause()+"\n"+
"stack trace: ");
evt.printStackTrace(); } }else{
return;
}
}else{
.........................
}
}else if (clickCount == 1){
if (isEditing()){
int row_edit =getEditingRow(); //获取正在编辑的行
int col_edit =getEditingColumn(); //获取正在编辑的列 Rectangle rect = getCellRect(row_edit, col_edit, false); //得到所在行列的巨型区域
if (!rect.contains(p)){ //p是鼠标所在点
try{
CellEditor ce = getCellEditor(row_edit, col_edit);
ce.stopCellEditing();
Object value = ce.getCellEditorValue();
FileListTableModel tableModel = getDefaultModel();
tableModel.setValueAt(value, row_edit, col_edit);
tableModel.fireTableDataChanged();
}catch(Exception evt){
System.out.println("error: "+ evt.getMessage()+"\n"+
"source: "+ evt.getCause()+"\n"+
"stack trace: ");
evt.printStackTrace(); } }else{
return;
}
}else{
.........................
}
int col = table.getSelectedColumn();
table.getCellEditor(row, col).stopCellEditing();
Object o = table.getValueAt(row, col);
--------------------------------CellEditor ce = JTable.getCellEditor(row_edit, col_edit);
ce.stopCellEditing();
Object value = ce.getCellEditorValue();
DefaultTableModel tableModel = (DefaultTableModel)JTable.getDefaultModel();
tableModel.setValueAt(value, row_edit, col_edit);--------------------------------
TableCellEditor中没有getValue()这个函数。的调用CellEditor.getCellEditorValue()
获取编辑后得新值,然后在TableModel中用
setValueAt(Object aValue, int rowIndex, int columnIndex) 保存编辑后得值,
然后用tableModel.fireTableDataChanged(); 刷新JTable。