[Resolvido]Editar valor de JTable

7 respostas
W

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.

7 Respostas

W

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

ViniGodoy

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?

W

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;
    }
}
ViniGodoy

Ué, seu getValueAt não retorna o valor do vencimento???

W

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

ViniGodoy

Pois é, mas o valor que vai para o “value” do getCellEditor é o mesmo que é obtido no getValueAt.

W

Obrigado ViniGodoy,
Realmente era no getValueAt que retornava vazio, mudei e fiz o tratamento para null, agora esta uma maravilha, Obrigado.

Criado 6 de setembro de 2010
Ultima resposta 7 de set. de 2010
Respostas 7
Participantes 2