Pessoal,
No meu aplicativo, tenho uma JTable que possui em uma coluna um coponente personalizado, porém preciso que o valor deste componente possa ser alterado. O problema, digito o valor no campo ou seleciono a data, pois é um componente para calendario, mas ao sair do campo o conteudo é apagado, no cellEditor o conteudo chega como vazio, alguem tem ideia do que esqueci de fazer.
Uso AbstractTableModel.
[Resolvido]Editar valor de JTable
7 Respostas
Pessoal,
Estava verificando e notei que o problema esta no meu AbstractTableModel, ele recebe o valor, atualiza o objeto, porém não muda este objeta na lista, vou postar o codigo do setValueAt
@Override
public void setValueAt(Object valor, int linha, int coluna) {
Parcelas p = valores.get(linha);
switch (coluna) {
case 2:
p.setVencimento(GuiUtils.converteData(valor.toString()));
}
fireTableDataChanged();
}
alguem sabe me dizer o que esta errado
O seu model está certo. Você só não precisa disparar o evento de DataChanged nele pq, a princípio, ele só é chamado pelo JTable quando ele já tem certeza que o valor da tabela mudou (a menos, claro, que você use o setValueAt diretamente em seu código, o que geralmente é um erro conceitual).
Como está seu método getValueAt? E como é a programação do seu editor personalizado?
ViniGodoy,
Vou postar todo o codigo do meu AbstractTableModel e CellEditor.
Abaixo o AbstractTableModel
public class ParcelasTableModel extends AbstractTableModel {
private List<Parcelas> valores;
public ParcelasTableModel(List<Parcelas> lista) {
this.valores = lista;
}
@Override
public boolean isCellEditable(int row, int column) {
if (column == 0 || column == 1) {
return false;
}
return true;
}
@Override
public int getRowCount() {
return valores.size();
}
@Override
public int getColumnCount() {
return 3;
}
@Override
public String getColumnName(int column) {
switch (column) {
case 0:
return "Parcela";
case 1:
return "Valor Parcela";
case 2:
return "Vencimento";
default:
throw new IllegalArgumentException("Invalid column " + column);
}
}
@Override
public Object getValueAt(int row, int column) {
Parcelas parcelas = valores.get(row);
switch (column) {
case 0:
return parcelas.getParcelas();
case 1:
return GuiUtils.getInstance().valorMoeda(parcelas.getValorparcelas());
case 2:
return "";
default:
throw new IllegalArgumentException("Invalid column " + column);
}
}
@Override
public void setValueAt(Object valor, int linha, int coluna) {
Parcelas p = valores.get(linha);
switch (coluna) {
case 2:
p.setVencimento(GuiUtils.getInstance().retornaData(valor.toString()));
}
fireTableDataChanged();
}
@Override
public Class<?> getColumnClass(int c) {
return String.class;
}
}
agora o CellEditor
public class MyCellEdit extends AbstractCellEditor
implements TableCellEditor {
JComponent component = new JTextField();
@Override
public boolean stopCellEditing() {
String s = (String) getCellEditorValue();
boolean valido = true;
for (int i = 0; i < s.length(); i++) {
Character caractere = s.charAt(i);
if (!Character.isDigit(caractere)) {
if (!caractere.equals('/')) {
valido = false;
break;
}
}
}
if (!valido) {
JOptionPane.showMessageDialog(null,
"Valor inválido");
return false;
}
return super.stopCellEditing();
}
public Component getTableCellEditorComponent(
JTable table, Object value,
boolean isSelected, int rowIndex, int vColIndex) {
if (isSelected) {
//
}
((JTextField) component).setText((String) value);
return component;
}
public Object getCellEditorValue() {
return ((JTextField) component).getText();
}
@Override
public boolean isCellEditable(EventObject o) {
return true;
}
}
Ué, seu getValueAt não retorna o valor do vencimento???
ViniGodoy,
Isso mesmo, pois a data é digitada pelo usuario na tabela, então na primeira execução era null, para evitar nullPointExeception, coloquei para retornar o valor vazio e não mudei, agora que você postou para verificar o getValueAt, notei este erro, vou fazer o tratamento para null e retornar a data para testar se esta certo, já volto a postar se deu certo ou não
Pois é, mas o valor que vai para o “value” do getCellEditor é o mesmo que é obtido no getValueAt.
Obrigado ViniGodoy,
Realmente era no getValueAt que retornava vazio, mudei e fiz o tratamento para null, agora esta uma maravilha, Obrigado.