JTable (mais um dos mtos que postaram) referente a Listeners de Evento! [RESOLVIDO]

2 respostas
Tsunami1

Seguinte galera, espero que possam me ajudar.
Estou com dificuldade em fazer uma JTable com eventos…
O problema é o seguinte: quero uma JTable onde o programa pegue a célula que o usuário alterou, o valor antigo e o valor novo dela… (pra depois eu jogar essa alteração via SQL).
Pegar a alteração não é o problema pois eu já consegui com o TableModelListener (metodo tableChanged), mas eu não estou conseguindo descobrir como faz pra pegar o valor antigo da célula…

ai vai a parte do código:

table.getModel().addTableModelListener(new TableModelListener()
		{
			public void tableChanged(TableModelEvent e)
			{
				int row = e.getFirstRow();
				int column = e.getColumn();
				TableModel model = (TableModel) e.getSource();
				String columnName = model.getColumnName(column);
				Object data = model.getValueAt(row, column);
				
				JOptionPane.showMessageDialog(null, data.toString()); // mostra o valor já alterado
			}
		});

O problema é este, como eu pego o valor antigo, antes de ser alterado???


E o motivo de querer o valor antigo é que sempre que o usuario alterar o valor de uma célula, uma instrução sql do tipo (“UPDATE tabela SET “+columnName+”=” ‘"+data.toString()+"’ WHERE “+ columnName +” = "+ VALOR_ANTIGO) deve ser enviada pro banco de dados…

Podem me dar uma ajudinha nisso???
Valew!!!

2 Respostas

Dieval_Guizelini

Você deve criar uma classe que especialize da classe DefaultTableModel ou implemente TableModel.

Existe um método chamado setValue que será invocado e terá como parâmetro o novo valor entrado pelo usuário.

Para mais informações sobre isso, dê uma olhada no almanac.

[url]http://www.exampledepot.com/egs/javax.swing.table/pkg.html[/url]

ou um exemplo:

public class TiposCamposTableModel extends javax.swing.table.AbstractTableModel {
    private Tabela tabela;

    public TiposCamposTableModel(Tabela tab) {
       this.tabela = tab;    
    }
    
    @Override
    public String getColumnName(int column) {
        Campo c = tabela.getColuna(column);
        if( c != null ) {
            return c.getTitulo();
        } else {
            return super.getColumnName(column);
        }
    }
    
    public Tabela getTabela() {
        return this.tabela;
    }
    
        /**
     *  Returns <code>Object.class</code> regardless of <code>columnIndex</code>.
     *
     *  @param columnIndex  the column being queried
     *  @return the Object.class
     */
    @Override
    public Class getColumnClass(int columnIndex) {
        Campo c = tabela.getColuna(columnIndex);
        if( c == null ) return Object.class;
        Class tipo = Object.class;
        try {
            tipo = Class.forName(c.getClasse());
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(TiposCamposTableModel.class.getName()).log(Level.SEVERE, null, ex);
        }
        return tipo.getClass();
    }

    
    
    public void setTabela(Tabela tab) {
       this.tabela = tab;
       super.fireTableStructureChanged();
    }

    public int getRowCount() {
        int linhas = tabela.getRowCount();
        return linhas<1? 1 : linhas;
    }

    public int getColumnCount() {
        int cols = tabela.getColumnCount();
        return cols<1? 1 : cols;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        Registro r = tabela.getRegistro(rowIndex);
        if( r!=null && r.getValores().length > columnIndex ) {
            return r.getValores()[columnIndex];
        }
        return null;
    }
    
    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        Registro r = tabela.getRegistro(rowIndex);
        if( r!=null && r.getValores().length > columnIndex ) {
            r.setValor(aValue, columnIndex);
        }
    }

}

fw

Tsunami1

Dieval, obrigado pela ajuda!!!

O que vc postou não era bem o que eu queria, mas dentro do link http://www.exampledepot.com/egs/javax.swing.table/pkg.html eu achei exatamente!!!
o negocio era simples, apenas usar o método getValueAt(row, column) num evento de mouse assim que o usuario clicar na celula (pra eu poder salva-la antes do usuario fz a alteração). E eu não estava achando esse método…
Vlw!!!

Criado 1 de novembro de 2008
Ultima resposta 2 de nov. de 2008
Respostas 2
Participantes 2