У меня есть JTable, отображающий строки из базы данных SQL. Таблица сравнительно небольшая (всего 4 столбца и до 1000 строк).
Я хотел бы дать пользователю возможность редактировать любые ячейки в таблице, но при этом стараться не ограничивать его настолько, чтобы он использовал диалоговое окно редактирования (это упрощает проверку и проверку ошибок, но менее интуитивно понятно). )
Я пробовал несколько разных способов управления выборками редактирования, используя метод valueChanged моего JTable, но мне не очень повезло.
Я бы хотел, чтобы каждая строка редактировалась и записывалась в базу данных по завершении редактирования. Мне бы хотелось, чтобы после нажатия на ячейку, чтобы начать редактирование этой строки, никакие другие строки не могут быть выбраны, пока пользователь не закончит редактирование строки (другие строки выделены серым цветом). После редактирования каждой ячейки и нажатия кнопки ввода выбор редактирования должен перейти к следующему столбцу в той же строке.
Кто-нибудь может подсказать, как мне этого добиться?
// 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;
}
}