Duvidas JTable gravar no banco

5 respostas
X

Boa noite,

Fiz um JTable para apresentar os resultados de uma consulta.
Pela quantidade maciça de posts falando para não usar DefaultTableModel, eu resolvi seguir a dica e fiz um model conforme alguns posts do ViniGodoy.
Bom o código ficou assim:

package tela.model;

import estcar.LocalidadesPais;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class CadLocalidadesPaisTableModel extends AbstractTableModel {
    
    private static final int COL_COD_PAIS = 0;
    private static final int COL_DES_PAIS = 1;
    
    private List<LocalidadesPais> valores;
    
    public CadLocalidadesPaisTableModel(Collection<LocalidadesPais> valores){
        this.valores = new ArrayList<LocalidadesPais>(valores);
    }

    @Override
    public int getRowCount() {
        return valores.size();
    }

    @Override
    public int getColumnCount() {
        return 2;
    }
    
    @Override
    public String getColumnName(int columnIndex) {
        String retorno = null;
        if (columnIndex == COL_COD_PAIS) {
            retorno = "Código";
        }  
        if (columnIndex == COL_DES_PAIS) {
            retorno = "Descrição";
        }  
        return retorno;
        
    }
    
    @Override
    public Object getValueAt(int row, int column) {  
        LocalidadesPais pais = valores.get(row);
        switch(column){
            case COL_COD_PAIS:
                return pais.getCodPais();
            case COL_DES_PAIS:
                return pais.getDescPais();
            default:
                return null;
        }
    }
    
    @Override
    public  void setValueAt(Object aValue, int rowIndex, int columnIndex) {  
        try {  
           if (columnIndex == COL_COD_PAIS) {
                valores.get(rowIndex).setDescPais(aValue.toString());
            }  
        } catch (Exception e) { 
        }  
    }
    
    @Override
    public Class getColumnClass(int columnIndex) {
        switch(columnIndex){
            case COL_COD_PAIS:
                return Integer.class;
            case COL_DES_PAIS:
                return String.class;
            default:
                return null;
        }
    }
    
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {   
        return columnIndex == COL_DES_PAIS;  
    }  
    
    public LocalidadesPais get(int row) {  
        return valores.get(row);  
    }  
  
   
    public void add(LocalidadesPais pais) {  
        valores.add(pais);
        fireTableRowsInserted(valores.size()-1, valores.size()-1);  
    }  
  
    public List<LocalidadesPais> getParametros() {  
       return Collections.unmodifiableList(valores);  
    } 

}

Tenho algumas duvidas:

  • Para cada tabela do meu sistema tenho ter uma TableModel diferente? Ou seja, se tiver 20 tabelas, terei que ter 20 classes estendendo a AbstractTableMode?
  • Digamos que tenho mais de uma coluna editável, como ficaria o método isCellEditable, teria que criar IF e retornar true caso seja os índices das colunas igual ao parâmetro columnIndex?
  • Em outros tópicos pessoal falou que o JTable é apenas a parte “vísivel”, e que para as informações do JTable serem inseridas no banco, precisaria buscar no model. É isso mesmo? Não entendi direito, exemplo, tenho meu model vou passar ele para o banco, mas como? Seria por aquele método public LocalidadesPais get(int row), ele iria me retornar uma lista de valores (objeto LocalidadesPais), então pegaria na lista e iria inserir nos campos do banco?
    Gostaria de exemplos ou material de consulta/aprendizado para implementar o delete e edição dos campos apresentados na JTable, sabendo que não são todos os campos da tabela do banco listados. Gera uma pesquisa, e da pesquisa o que for editado quero gravar.

5 Respostas

ViniGodoy

Sim. Existem models prontos que te poupam desse trabalho, e não tem os problemas do Default, como o ObjectTableModel:

O retorno geralmente fica assim:

return columnIndex == COL_DES_PAIS || columnIndex == COL_SIGLA_PAIS;
- Em outros tópicos pessoal falou que o JTable é apenas a parte "vísivel", e que para as informações do JTable serem inseridas no banco, precisaria buscar no model. É isso mesmo? Não entendi direito, exemplo, tenho meu model vou passar ele para o banco, mas como? Seria por aquele método public LocalidadesPais get(int row), ele iria me retornar uma lista de valores (objeto LocalidadesPais), então pegaria na lista e iria inserir nos campos do banco?

No seu código, lá no botão de salvar da tela, você vai chamar o método getParametros() - o melhor seria chamar de getLocalidades() - e então chamar o DAO para salvar a lista que esse objeto retorna:

for (LocalidadesPais pais : model.getParametros()) { paisDao.salvar(pais); }

A exclusão segue a mesma lógica.
Esse seria um código de exclusão de um botão de “excluir”:

//Pega a linha selecionada do JTable
int selected = JTable.getSelectedRow();
if (selected == -1) `
   return;
//Pega o país que está naquela linha
LocalidadesPais pais = paisModel.get(selected);
//Chama o dao para excluir
paisDao.excluir(pais); 
//Exclui da tabela
paisModel.remove(pais);
douglaskd

esta sua pergunta me fez parar os estudos com java desktop, pra mim, obsoleto, perto do WPF ou até mesmo win forms com c#

ainda uso na faculdade, tcc, mas ja percebi que não é produtivo, quando você esta em um projeto, o que mais importa é a lógica de negócios, e quando você precisa fazer algo pouco mais sofisticado como mudar cor das linhas, insetir componentes dentro da jtable, carregar eventos, ai ja se perde um tempo que não agrega valor ao projeto.

quem sabe se um dia se inventarem um framework para dev desktop, como o telerik pra java a coisa não melhore um pouco.

ViniGodoy

douglaskd:
esta sua pergunta me fez parar os estudos com java desktop, pra mim, obsoleto, perto do WPF ou até mesmo win forms com c#

ainda uso na faculdade, tcc, mas ja percebi que não é produtivo, quando você esta em um projeto, o que mais importa é a lógica de negócios, e quando você precisa fazer algo pouco mais sofisticado como mudar cor das linhas, insetir componentes dentro da jtable, carregar eventos, ai ja se perde um tempo que não agrega valor ao projeto.

quem sabe se um dia se inventarem um framework para dev desktop, como o telerik pra java a coisa não melhore um pouco.

Já tentou o JavaFX?

De qualquer forma, ainda acho que está há anos luz do QT.

douglaskd

ViniGodoy:
douglaskd:
esta sua pergunta me fez parar os estudos com java desktop, pra mim, obsoleto, perto do WPF ou até mesmo win forms com c#

ainda uso na faculdade, tcc, mas ja percebi que não é produtivo, quando você esta em um projeto, o que mais importa é a lógica de negócios, e quando você precisa fazer algo pouco mais sofisticado como mudar cor das linhas, insetir componentes dentro da jtable, carregar eventos, ai ja se perde um tempo que não agrega valor ao projeto.

quem sabe se um dia se inventarem um framework para dev desktop, como o telerik pra java a coisa não melhore um pouco.

Já tentou o JavaFX?

De qualquer forma, ainda acho que está há anos luz do QT.

então, ouvi dizer que ele nasceu morto então nao peguei pra testar;.

X

Desculpe “reviver”, mas não tive mais tempo vir até o fórum e dar uma resposta.

Bom tive que fazer inúmeras mudanças em meu projeto, bom, o que fiz foi criar “modos de trabalho” . Ou seja, o usuário poderá pesquisar, cadastrar, editar ou excluir as informações.
Então para cada tela ele verifica as permissões deste usuário e liberar ou não as ações (botões).

Ficou assim:

...
else if (btnModoEditar.isSelected() == true) {
            if ("".equals(txtPais.getText())) {
                JOptionPane.showMessageDialog(null, "Não é possível editar um país com nome Nulo!\nFavor inserir o nome do país e tentar novamente!", "EstCar - Buscar País", JOptionPane.ERROR_MESSAGE);
                txtPais.requestFocus();
            } else {
           local.ExcluirPaises(txtCodPais.getText(), txtPais.getText());
            tabelaPaises.setModel(new CadLocalidadesPaisTableModel(local.BuscarPais(txtCodPais.getText(), "")));
            txtCodPais.setText(null);
            txtPais.setText(null);
            txtPais.requestFocus();
            }
        } else if (btnModoExcluir.isSelected() == true) {
             local.ExcluirPaises(txtCodPais.getText());
            tabelaPaises.setModel(new CadLocalidadesPaisTableModel(local.BuscarPais("", "")));
            txtCodPais.setText(null);
            txtPais.setText(null);
            txtPais.requestFocus();
        }
private void tabelaPaisesMouseClicked(java.awt.event.MouseEvent evt) {                                          
        if (btnModoEditar.isSelected() == true) {
            txtCodPais.setText(tabelaPaises.getModel().getValueAt(tabelaPaises.getSelectedRow(), 0).toString());
            txtPais.setText(tabelaPaises.getModel().getValueAt(tabelaPaises.getSelectedRow(), 1).toString());
        } else if (btnModoExcluir.isSelected() == true) {
            txtCodPais.setText(tabelaPaises.getModel().getValueAt(tabelaPaises.getSelectedRow(), 0).toString());
            txtPais.setText(tabelaPaises.getModel().getValueAt(tabelaPaises.getSelectedRow(), 1).toString());
        }
    }

Então a cada “clique” nos registros da tabela, ele joga essa informações de volta para os jTextField. E como o usuário selecionou o editar ou excluir, eu limito as alterações destes campos com enable false para cada um.

Ou seja, uma verdadeira gambiarra.

Para entender vai a tela:

SUA SUGESTÕES,
seria ao invés de ter feito “modos de trabalho”, ter o pesquisar, editar, salvar e excluir em cada tabela, e limitar o usuario a utilização deste botoes.
e fazer os botões interagir com a tabela utilizando essa ObjectTableModel?
Seria digamos “o ideal”, ou “correto”?

Criado 18 de setembro de 2013
Ultima resposta 2 de out. de 2013
Respostas 5
Participantes 3