【发布时间】:2012-02-27 15:52:27
【问题描述】:
我有一个 JTable 显示来自 SQL 数据库的行。该表相对较小(只有 4 列,最多 1000 行)。
我想让用户有机会编辑表格中的任何单元格,但希望避免对其进行过多限制,以至于他们必须使用编辑对话框(这使得错误检查和验证更容易,但不太直观)
我尝试了几种使用 JTable 的 valueChanged 方法控制编辑选择的不同方法,但运气不佳。
我希望在编辑结束时编辑每一行并将其写入数据库。我希望一旦单击单元格开始编辑该行,在用户完成编辑该行之前不能选择其他行(其他行显示为灰色)。编辑每个单元格并按 Enter 后,编辑选择应跳转到同一行的下一列。
谁能指点我如何做到这一点?
// Create table with database data
table = new JTable(new DefaultTableModel(data, columnNames)) {
public Class getColumnClass(int column) {
for (int row = 0; row < getRowCount(); row++) {
Object o = getValueAt(row, column);
if (o != null){
return o.getClass();
}
}
return Object.class;
}
@Override
public boolean isCellEditable(int row, int col){
return true;
}
@Override
public boolean editCellAt(int row, int column) {
boolean ans = super.editCellAt(row, column);
if (ans) {
Component editor = table.getEditorComponent();
editor.requestFocusInWindow();
}
return ans;
}
@Override
public void valueChanged(ListSelectionEvent source) {
super.valueChanged(source);
if (table!=null)
table.changeSelection(getSelectedRow(), getSelectedColumn()+1, false, false);
}
};
编辑 - 带有表格指针的自定义单元格编辑器似乎是一个开始
public class ExchangeTableCellEditor extends AbstractCellEditor implements TableCellEditor {
private JTable table;
JComponent component = new JTextField();
public ExchangeTableCellEditor(JTable table) {
this.table = table;
}
public boolean stopCellEditing() {
boolean ans = super.stopCellEditing();
//now we want to increment the cell count
table.editCellAt(table.getSelectedRow(), table.getSelectedColumn()+1);
return ans;
}
@Override
public void cancelCellEditing() {
//do nothing... must accept cell changes
}
@Override
public Object getCellEditorValue() {
return ((JTextField)component).getText();
}
@Override
public Component getTableCellEditorComponent(JTable arg0, Object value,
boolean arg2, int arg3, int arg4) {
((JTextField)component).setText((String)value);
return component;
}
}
【问题讨论】:
-
请编辑您的问题,在sscce 中包含您遇到的任何问题。
-
编辑了一个示例,说明我在编辑时如何尝试更改选择。谢谢
-
不要让 CellEditor 变得聪明——永远不会!这里特别是指不重新开始编辑,这会混淆所有内部更新......
-
顺便说一句,实现无效 - 它必须在编辑因编辑器内部原因终止时通知其侦听器(例如,当用户提交值时)参见 DefaultCellEditor 源代码示例