Capturar linha selecionada de uma JTable!

Explica é contexto de novo…?

Qual exatamente o erro, acontece quando e deveria ser qdo?
Se possível pode a Classe que tem o JTable pelo menos. (Se possível)

Abraço

Não deveria ser necessário chamar repaint. Poste seu model completo e a claase que tem o Table.

Entao eu tenho, umas jTextfields. e dois botoes, gravar e excluir.

qdo faço modificações nas Jt a jtable nao atualiza (Não insere, não excluir e não altera) na hora, e tem q fechar e abrir de novo a Jframe dai ela atualiza.

já tentei colocar umas linhas mas acho q não coloquei as corretas.

segue a tableModel:

Lembrando que no banco de dados esta tudo ok, em relação as atualizações o problema é somente na table

depois tenho uma outra bem boa pra vcs que essa eu nao achei aqui no forum rsrs

public class ProdutoTableModel extends AbstractTableModel {

    private static final int COL_CODIGO = 0;
    private static final int COL_PRODUTO = 1;
    private static final int COL_VALORPRODUTO = 2;
    private static final int COL_ATIVO = 3;
    private static final int COL_TIPOPRODUTO = 4;
    private List<Produto> listaProdutos;

    //Esse é um construtor, que recebe a nossa lista de livros  
    public ProdutoTableModel(List<Produto> listaProdutos) {
        this.listaProdutos = new ArrayList<Produto>(listaProdutos);
    }

    @Override
    public int getRowCount() {
        //Quantas linhas tem sua tabela? Uma para cada item da lista.  
        return listaProdutos.size();
    }

    @Override
    public int getColumnCount() {
        //Quantas colunas tem a tabela? Nesse exemplo, só 5.  
        return 5;
    }

    @Override
    public String getColumnName(int column) {
        //Qual é o nome das nossas colunas?  
        if (column == COL_CODIGO) {
            return "CÓDIGO";
        }
        if (column == COL_PRODUTO) {
            return "PRODUTO";
        }
        if (column == COL_VALORPRODUTO) {
            return "VALOR";
        }
        if (column == COL_ATIVO) {
            return "PRODUTO ATIVO";
        }
        if (column == COL_TIPOPRODUTO) {
            return "TIPO DE PRODUTO";
        }
        return ""; //Nunca deve ocorrer  
    }

    @Override
    public Object getValueAt(int row, int column) {
        //Precisamos retornar o valor da coluna column e da linha row.  
        Produto produto = listaProdutos.get(row);
        if (column == COL_CODIGO) {
            return produto.getIdProduto();
        } else if (column == COL_PRODUTO) {
            return produto.getProduto();
        } else if (column == COL_VALORPRODUTO) {
            return produto.getValorProduto();
        } else if (column == COL_ATIVO) {
            return produto.getProdutoContinuado();
        } else if (column == COL_TIPOPRODUTO) {
            return produto.getTipoProduto();
        }
        return ""; //Nunca deve ocorrer  
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {

        Produto produto = listaProdutos.get(rowIndex);
        if (columnIndex == COL_CODIGO) {
            produto.setIdProduto(rowIndex);
        } else if (columnIndex == COL_PRODUTO) {
            produto.setProduto(aValue.toString());
        } else if (columnIndex == COL_VALORPRODUTO) {
            produto.setValorProduto(Double.parseDouble(aValue.toString()));
        } else if (columnIndex == COL_ATIVO) {
            produto.setProdutoContinuado(Boolean.parseBoolean(aValue.toString()));
        } else if (columnIndex == COL_TIPOPRODUTO) {
            produto.setTipoProduto(aValue.toString());
        }
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        //Qual a classe das nossas colunas? Como estamos exibindo texto, é string.  
        return Integer.class;
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {

        //Indicamos se a célula da rowIndex e da columnIndex é editável. Nossa tabela toda é.  

//        if (columnIndex == COL_CODIGO) {
//            return false;
//        } else {
//            return true;
//        } 
        return false; // Aqui todas as celulas nao serão editaveis
    }

    public Produto get(int row) {
        return listaProdutos.get(row);
    }

    public void setRemoveRow(int row) {

        fireTableRowsDeleted(row, row);

    }
}
SeuModel.getValueAt(SeuModel.getSelectedRow(), 0).toString()) // o 0 é a 1ª coluna
1 curtida

Ué, mas cadê os métodos de atualização da JTable?

Deveria ter método assim no seu model:

[code]
public void remove(int row) {
//Remove da lista
listaProdutos.remove(row);
//Avisa a tabela que foi removido
fireTableRowsDeleted(row, row);
}

public void add(Produto produto) {
//Adiciona na lista
listaProdutos.add(produto);
//Avisa a tabela que um novo produto foi inserido.
fireTableRowsInserted(listaProdutos.size()-1, listaProdutos.size()-1);
}[/code]

No método de remover da interface gráfica, você faria algo como:

public void actionPerformed(ActionEvent evt) { int linhaSelecionada = seuTable.getSelectedRow(); if (linhaSelecionada == -1) return; Produto produtoSelecionado = seuModel.get(linhaSelecionada); new ProdutoDao().remove(produtoSelecionado); //Manda remover do BD seuModel.remove(linhaSelecionada); //Chama o remove do model para remover da tabela }

As chamadas a “fire” dentro do model avisam a tabela que ela foi modificada. Quando o model faz um “fire” a Table fica sabendo que deve se redesenhar.

Caramba! Funcionou eu estava quase acertando rsrs.
a parte do tablemodel eu ja tinha feito, porem nao tinha feito a parte grafica.
a parte excluir ja esta funfando vou terminar agora. depois vou precisar de mais um dica rsrs.

eu tinha tudo isso funcionando no default… inclusive um metodo de pesquisa rapida q era show de bola agora com o tablemodel nao consegui mais fazer funfar.
bem vou terminar aqui. depois conversamos mais sobre a pesquisa.

abraço e boa noite

Oi vini boa tarde. ontem eu consegui mais uns avanços, a parte de exclusão ficou perfeita porém adicionar ele adiciona com erros. Top:
ele aparece na tabela durante a insersão, porem fica picado os dados, só aparece o nome do produto e o valor o resto fica em branco.

  • e a parte de atualização tbm nao consegui. segue o codigo;

este trecho esta no tablemodel

    public void setAdd(Produto produto) {
        //Adiciona na lista  
        listaProdutos.add(produto);
        //Avisa a tabela que um novo produto foi inserido.  
        fireTableRowsInserted(listaProdutos.size()+1, listaProdutos.size()+1);
    }
    
    public void setAtualiza(Produto produto){
        
        fireTableDataChanged();
        
    }

na classe grafica esta assim;

    public void setGravarProduto() {

        produto.setProduto(tfProduto.getText());
        produto.setValorProduto(Double.parseDouble(tfValorProduto.getText().replaceAll(",", ".")));

        TipoProduto obj = (TipoProduto) listaTipoProdutos.get(jcTipoProduto.getSelectedIndex());
        produto.setIdTipoProduto(obj.getIdTipoproduto());

        new ProdutoDAO().setAdiciona(produto); //Manda adicionar no BD  
        tableModelProduto.setAdd(produto);  //Chama o add do model para adicionar na tabela  

        limparCampos();
        btGravar.setEnabled(false);

    }

    public void setAlterarProduto() {

        produto.setIdProduto(Integer.parseInt(tfIdProduto.getText()));
        produto.setProduto(tfProduto.getText());
        produto.setValorProduto(Double.parseDouble(tfValorProduto.getText().replaceAll(",", ".")));

        TipoProduto obj = (TipoProduto) listaTipoProdutos.get(jcTipoProduto.getSelectedIndex());
        produto.setIdTipoProduto(obj.getIdTipoproduto());

        if (jCheckBox.isSelected()) {
            produto.setProdutoContinuado(false);
        } else {
            produto.setProdutoContinuado(true);
        }
       
        new ProdutoDAO().setAltera(produto);
        tableModelProduto.fireTableDataChanged();
        
        limparCampos();
        btGravar.setEnabled(false);
    }

Abraço

O certo é size()-1 não size()+1 como você fez.

Você deve disparar no evento o índice que foi adicionado. Como ele já está na lista, ele será = size()-1.

Entao não é isso rs. eu tinha mudado para +1 para ver se mudava algo, mas nao era, e eu tinha esquecido de mudar para -1 novamente.
com isso nao consigo inserir corretamente e nem atualizar um campo.
Os codigos que passei estao corretos?

abs

Aparentemente sim.

Bom dia!.

olha como fica quando insere um produto novo.
e quando eu clico em cima tbm e mudo algo como o valor por exemplo ele tbm nao muda.

Já usou o depurador? Tem certeza de que esses campos estão preenchidos na classe no produto que está sendo inserido na tabela?

E nego está dificil rsrs
e olha que essa é fichinha pra outra que eu quero fazer. ne debug nao aparece erro nenhum.
deve estar falhando no update da jtable. pq esta inserindo normal.
veja como esta o jFrame:


public class FormProduto extends javax.swing.JFrame {

    Produto produto = new Produto(WIDTH, null, Double.NaN, rootPaneCheckingEnabled, PROPERTIES, null, null);
    ProdutoDAO produtoDAO = new ProdutoDAO();
    TipoProduto tipoProdutos = new TipoProduto();
    TipoProdutoDAO tipoProdutoDAO = new TipoProdutoDAO();
    JLabel tfIdProduto = new JLabel();
    // JcomboBox
    List<TipoProduto> listaTipoProdutos = tipoProdutoDAO.getUpdateJtableTipo();
    // Jtable
    List<Produto> listProdutos = new ProdutoDAO().getUpdateJtable();
    ProdutoTableModel tableModelProduto = new ProdutoTableModel(listProdutos);

    public FormProduto() {

        // AQUI TROCA O TAB PELO ENTER NA TRANSIÇÃO DE JTEXTFIELD
        HashSet conj = new HashSet(this.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
        conj.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
        this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, conj);

        initComponents();

        jTable1.setModel(tableModelProduto);
        setUpdateJtable();

    }

    private void btFecharActionPerformed(java.awt.event.ActionEvent evt) {                                         

        this.dispose();

    }                                        

    private void btLimparActionPerformed(java.awt.event.ActionEvent evt) {                                         

        limparCampos();

    }                                        

    private void formWindowOpened(java.awt.event.WindowEvent evt) {                                  

        setPreencheList();
        limparCampos();

    }                                 

    private void btGravarActionPerformed(java.awt.event.ActionEvent evt) {                                         

        setHabilitaBtGravar();

        if (tfIdProduto.getText().equals("")) {
            setGravarProduto();
        } else {
            setAlterarProduto();
        }

    }                                        

    private void tfProdutoFocusLost(java.awt.event.FocusEvent evt) {                                    

        produto.setProduto(tfProduto.getText().toString());

        if (produtoDAO.setProdutoExistente(produto) == false || tfProduto.getText().toUpperCase().equals("")) {
            tfValorProduto.setEnabled(false);
            btGravar.setEnabled(false);
            limparCampos();
        } else {
            tfValorProduto.setEnabled(true);
            tfValorProduto.requestFocus();
        }
    }                                   

    private void jTable1MouseClicked(java.awt.event.MouseEvent evt) {                                     

        int i = jTable1.getSelectedRow();
        tfIdProduto.setText(jTable1.getModel().getValueAt(i, 0).toString());
        tfProduto.setText(jTable1.getModel().getValueAt(i, 1).toString());
        tfValorProduto.setText(jTable1.getModel().getValueAt(i, 2).toString().replaceAll(",", "."));
        jcTipoProduto.setSelectedItem(jTable1.getModel().getValueAt(i, 4));

        produto.setIdProduto(Integer.parseInt(tfIdProduto.getText()));

        if (produtoDAO.getPesquisaProdutoContinuado(produto) == true) {
            jCheckBox.setSelected(false);
            tfProduto.setEnabled(true);
            tfValorProduto.setEnabled(true);
        } else {
            jCheckBox.setSelected(true);
            tfProduto.setEnabled(false);
            tfValorProduto.setEnabled(false);
        }
        btExcluir.setEnabled(true);

    }                                    

    private void btExcluirActionPerformed(java.awt.event.ActionEvent evt) {                                          

        setRemoveLinhaTable();
        limparCampos();

    }                                         

    private void tfValorProdutoFocusLost(java.awt.event.FocusEvent evt) {                                         

        jcTipoProduto.requestFocus();

    }                                        

    private void jcTipoProdutoItemStateChanged(java.awt.event.ItemEvent evt) {                                               

        btGravar.setEnabled(true);
        btGravar.requestFocus();

    }                                              

    private void btPesquisaActionPerformed(java.awt.event.ActionEvent evt) {                                           

        produto.setPesquisaRapida(tfPesquisaRapida.getText());

    }                                          
//
    // Variables declaration - do not modify                     
    private javax.swing.JButton btExcluir;
    private javax.swing.JButton btFechar;
    private javax.swing.JButton btGravar;
    private javax.swing.JButton btLimpar;
    private javax.swing.JButton btPesquisa;
    private javax.swing.JCheckBox jCheckBox;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTable1;
    private javax.swing.JComboBox jcTipoProduto;
    private javax.swing.JTextField tfPesquisaRapida;
    private javax.swing.JTextField tfProduto;
    private javax.swing.JFormattedTextField tfValorProduto;
    // End of variables declaration                   

    public void limparCampos() {

        tfIdProduto.setText("");
        tfProduto.setText("");
        tfValorProduto.setText("");
        tfPesquisaRapida.setText("");
        jCheckBox.setSelected(false);
        btGravar.setEnabled(false);
        btExcluir.setEnabled(false);
        jcTipoProduto.setSelectedItem(null);

    }

    private void setUpdateJtable() {

        DefaultTableCellRenderer rendererCentro = new DefaultTableCellRenderer();
        rendererCentro.setHorizontalAlignment(SwingConstants.CENTER);
        DefaultTableCellRenderer rendererEsquerda = new DefaultTableCellRenderer();
        rendererEsquerda.setHorizontalAlignment(SwingConstants.LEFT);

        TableColumnModel modeloDaColuna = jTable1.getColumnModel();

        modeloDaColuna.getColumn(0).setCellRenderer(rendererCentro);
        modeloDaColuna.getColumn(1).setCellRenderer(rendererEsquerda);
        modeloDaColuna.getColumn(2).setCellRenderer(rendererCentro);
        modeloDaColuna.getColumn(3).setCellRenderer(rendererCentro);
        modeloDaColuna.getColumn(4).setCellRenderer(rendererCentro);

        modeloDaColuna.getColumn(0).setMaxWidth(60);
        modeloDaColuna.getColumn(1).setMaxWidth(300);
        modeloDaColuna.getColumn(2).setMaxWidth(70);
        modeloDaColuna.getColumn(3).setMaxWidth(130);
        modeloDaColuna.getColumn(4).setMaxWidth(150);

    }

    private void setPreencheList() {

        for (TipoProduto tipoProduto : listaTipoProdutos) {

            jcTipoProduto.addItem(tipoProduto.getTipoProduto());

        }
    }

    public void setRemoveLinhaTable() {

        int linhaSelecionada = jTable1.getSelectedRow();
        if (tfIdProduto.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "Não há item selecionado para excluir");
        } else {
            produto = tableModelProduto.get(linhaSelecionada);
            new ProdutoDAO().setExcluir(produto); //Manda remover do BD  
            tableModelProduto.setRemove(linhaSelecionada);  //Chama o remove do model para remover da tabela  
        }
    }

    public void setHabilitaBtGravar() {

        if (tfProduto.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "O Campo produto não pode estar em branco!");
            btGravar.setEnabled(false);
        } else if (tfValorProduto.getText().equals("")) {
            JOptionPane.showMessageDialog(null, "O Campo valor do produto não pode estar em branco!");
            btGravar.setEnabled(false);
        } else if (jcTipoProduto.getSelectedItem() == null) {
            JOptionPane.showMessageDialog(null, "O Campo tipo de produto não pode estar em branco!");
            btGravar.setEnabled(false);
        }
    }

    public void setGravarProduto() {

        produto.setProduto(tfProduto.getText());
        produto.setValorProduto(Double.parseDouble(tfValorProduto.getText().replaceAll(",", ".")));

        TipoProduto obj = (TipoProduto) listaTipoProdutos.get(jcTipoProduto.getSelectedIndex());
        produto.setIdTipoProduto(obj.getIdTipoproduto());

        new ProdutoDAO().setAdiciona(produto); //Manda adicionar no BD  
        tableModelProduto.setAdd(produto);  //Chama o add do model para adicionar na tabela  

        limparCampos();
        btGravar.setEnabled(false);

    }

    public void setAlterarProduto() {

        produto.setIdProduto(Integer.parseInt(tfIdProduto.getText()));
        produto.setProduto(tfProduto.getText());
        produto.setValorProduto(Double.parseDouble(tfValorProduto.getText().replaceAll(",", ".")));

        TipoProduto obj = (TipoProduto) listaTipoProdutos.get(jcTipoProduto.getSelectedIndex());
        produto.setIdTipoProduto(obj.getIdTipoproduto());

        if (jCheckBox.isSelected()) {
            produto.setProdutoContinuado(false);
        } else {
            produto.setProdutoContinuado(true);
        }

        new ProdutoDAO().setAltera(produto);
        tableModelProduto.fireTableDataChanged();

        limparCampos();
        btGravar.setEnabled(false);
    }
}

Esse objeto produto que está sendo alterado no método altera, onde você define o valor dele?

O ideal seria obter o produto pelo model, altera-lo, e depois dar um fireTableRowsUpdated.

Mais ou menos assim:

[code]int linhaSelecionada = jTable1.getSelectedRow();
if (linhaSelecionada == -1)
return;

//Obtemos o produto que está dentro do JTable
produto = tableModelProduto.get(linhaSelecionada);
produto.setProduto(tfProduto.getText());
produto.setValorProduto(Double.parseDouble(tfValorProduto.getText().replaceAll(",", “.”)));

TipoProduto obj = (TipoProduto) listaTipoProdutos.get(jcTipoProduto.getSelectedIndex());
produto.setIdTipoProduto(obj.getIdTipoproduto());

//Salvamos a alteração no banco
new ProdutoDAO().setAdiciona(produto); //Manda adicionar no BD

//Avisamos a tabela que o produto mudou
tableModelProduto.fireTableRowsUpdated(linhaSelecionada, linhaSelecionada);[/code]

Bom dia. vini

Demorei para retornar por causa das provas.

continuo com problemas, na hora de inserir um item novo, sai falhado, somente o nome fica lá perfeito porem o resto dos dados não saem, e qdo clico em cima dele aparece uma mensagem de nullpointer.

o codigo estão acima ele deleta e altera com perfeição. o problema é somente na hora de inserir.

Vini, descobri que nesse metodo esta voltando o codigo como null.
é por isso que esta falhando na tela, porém ainda nao tenho ideia de como resolver.

    public void setAdd(TipoProduto tipoProduto) {
        //Adiciona na lista  
        this.listaProdutos.add(tipoProduto);
        //Avisa a tabela que um novo produto foi inserido.        
        fireTableRowsInserted(this.listaProdutos.size() - 1, this.listaProdutos.size() - 1);

    }

kra por favor me ajudem… alguem ai sabe dizer como q eu faço pra ficar passando o nome completo ,por exemplo, na linha selecionada em uma tabela pequena …
pq qando eu faço sempre fica com os 3 pontos …