Edição controlada de uma seleção de linha na JTable
Eu tenho uma JTable exibindo linhas de um banco de dados SQL. A tabela é relativamente pequena (apenas 4 colunas e até 1000 linhas).
Gostaria de dar ao usuário a oportunidade de editar qualquer célula da tabela, mas quero evitar restringi-la tanto, para que eles usem uma caixa de diálogo de edição (isso facilita muito a verificação e validação de erros, mas é menos intuitivo)
Tentei algumas maneiras diferentes de controlar as seleções de edição usando o método valueChanged da minha JTable, mas não tive muita sort
Gostaria que cada linha fosse editada e gravada no banco de dados ao final da edição. Gostaria que, uma vez que uma célula tenha sido clicada para iniciar a edição dessa linha, nenhuma outra linha possa ser selecionada até que o usuário termine de editar a linha (outras linhas estarão acinzentadas). Após editar cada célula e pressionar Enter, a seleção de edição deve pular para a próxima coluna na mesma linh
Alguém pode dar dicas sobre como eu posso conseguir iss
// 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
publ,ic 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);
}
};
Edit - editor de célula personalizado com ponteiro de tabela parece ser um começo
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;
}
}