Como capturar dados escolhidos em uma linha de uma tabela (JTable)?

Cordiais saudações, pessoal do GUJ.

Tenho uma tabela de itens de um pedido (podem ter muitos itens), cada item ocupa uma linha. Gostaria de saber como implementar um controle de evento que quando eu clico o botão esquerdo do mouse sobre uma linha da tabela o Java me retorna o número da linha.

Alguém pode dar um exemplo de implementação do controle de evento?

Obrigado,
Ronaldo

Adiciona um ListSelectionListener ao SelectionModel de sua JTable aí você trata o valueChanged(ListSelectionEvent), com o ListSelectionEvent você obtém a linha selecionada.

1 curtida

Tudo bem, Staroski?

Veja como criei minha tabela:

    JTable tbPedido;
    DefaultTableModel tableModel = new DefaultTableModel(new String[]{}, 0) {};
    JScrollPane scrollTable;
    String[] colunas = {"Id item", "Id produto",
        "Descrição do produto", "Quantidade",
        "Preco", "Total"};

Veja eu acrescentando as colunas na tabela:

        scrollTable = new JScrollPane();
        scrollTable.setBounds(35, 350, 800, 380);
        for(int i = 0; i < 6; i++) {
            tableModel.addColumn(colunas[i]);
        }
        
        tbPedido = new JTable(tableModel);
        
        scrollTable.setViewportView(tbPedido);

Agora veja como eu acrescento as linhas na tabela:

                    int cont = listaItens.size() - 1;
                    tableModel.addRow(new Object[] {
                        listaItens.get(cont).getId(),
                        listaItens.get(cont).getId_produto(),
                        listaItens.get(cont).getDescricao_produto(),
                        listaItens.get(cont).getQuantidade(),
                        listaItens.get(cont).getPreco(),
                        listaItens.get(cont).getQuantidade() * listaItens.get(cont).getPreco()
                        });

Eu tenho um metodo que faz o controle de eventos (todos eventos). Este método chama definirEventos(), veja um exemplo de tratamento de evento de botão:

        btNovo1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tableModel.setNumRows(0);
                numeroItens = 0;
                limparCamposPedido();
                setTFPedido(true);
                tfId_pedido.setEnabled(false);
            }
        });

Você pode escrever o código que trata a tabela como objeto e obtém a linha para mim? Não sei como escrever este código e não achei nenhum exemplo na internet.

Atenciosamente,
Ronaldo

Você chamou o objeto da sua JTable de tbPedido então esse é o objeto.
:person_shrugging:t2:

Agora é só obter o SelectionModel de seu tbPedido e depois adicionar um ListSelectionListener nesse SelectionModel.

Nem na documentação oficial do Java?

Staroski, dá para você mandar de novo para mim o endereço da documentação java. Apesar de naquela documentação que você tinha passado para mim, eu não encontrei nenhum exemplo de código.

Ensina como fazer o listener! É mais fácil.

Atenciosamente,
Ronaldo

É só pesquisar por “java api specification”. :man_shrugging:
Não sei qual versão você usa, de qualquer forma, vou mandar o link do Java 11.

Se está falando do link que postei na mensagem anterior, então você não leu o conteúdo, pois nele tem vários exemplos, inclusive usando JList e usando JTable.

Pelo histórico das suas dúvidas no último ano, se eu fizer isso você só vai copiar e não vai aprender, daí daqui há um mês vai ter as mesmas dúvidas.

Prefiro que aprenda e depois ajude a ensinar os colegas.

Como você implementa qualquer outro listener de algum componente?
Geralmente usa uma das seguintes formas:

  • uma inner class;
  • uma classe anônima;
  • uma expressão lâmbda (quando for um listener que só trata um único evento);

Escolha a que parecer mais simples.

Não sabe por onde começar?

  1. Abre a documentação da JTable, descubra qual é o método que retorna o ListSelectionModel dela.

  2. Abre a documentação desse ListSelectionModel e descobre qual é o método para adicionar um ListSelectionListener nele.

  3. Depois na implementação do listener você consulta a documentação do ListSelectionEvent pra descobrir como obter o valor da linha selecionada.

Não tem segredo, você tem que estudar as classes e interfaces que utiliza.

Não está dando certo, Staroski.
Veja o que eu fiz, sem resultado:

        tbPedido.addActionListener(new ActionListener() {
            public void valueChanged (ListSelectionEvent e) {
                // corpo de código
            }
        });

Não é o addActionListener(new ActionListener() que eu tenho que usar. Qual é?
Não achei nada de código na documentação.

Só pode estar de brincadeira… :frowning:

Print-screen do link que mandei:

Outro print-screen do link que mandei:

Em nenhum momento foi falado para adicionar um ActionListener na JTable.

Você vai adicionar um ListSelectionListener no ListSelectionModel da JTable.

Tenta prestar atenção e ler com calma as mensagens, senão está fazendo parecer que simplesmente ignora.

Leia a última mensagem, principalmente a partir do " Não sabe por onde começar?".

Staroski, tudo isto é grego para mim. Mas veja só: eu tenho uma lista que contem objetos que estão gravados em arquivo, na tabela item_pedido_cli. Essa lista é de um único pedido e está colocada na tabela. Tudo que eu queria é pegar o item correto da lista (objeto) que está na tabela através do número de linha da tabela toda vez que eu clicar em cima de um item.

Está muito difícil mas veja minha última tentativa:

        tbPedido.addTableModeListener(new ActionListener() {
            public void valueChanged (ListSelectionEvent e) {
                int linha = tbPedido.getRow()
                // corpo de código...
            }
        });

Sei que está tudo errado mas é o que deu para fazer.

Não é grego, é Java e tem uma documentação enorme sobre a linguagem.
O problema é que, mesmo lhe passando links da documentação, mesmo passando links com exemplos de código, aparentemente você os ignora e continua na tentativa e erro, inventando chamar métodos que não existem.

Sim, isso eu entendi desde sua primeira postagem e é exatamente para isso que você precisa adicionar um ListSelectionListener no ListSelectionModel da JTable.
É somente através do ListSelectionModel que você consegue adicionar um ListSelectionListener para tratar as seleções nos itens da JTable, da JList ou de qualquer outro componente que possua um ListSelectionModel.

O senhor continua ignorando o passo a passo que lhe foi passado e está “chutando” métodos que não existem…

Pare de insistir no TableModel e no ActionListener pois não são eles que vão resolver sua necessidade atual.
Já foi dito várias vezes que você precisa adicionar um ListSelectionListener no ListSelectionModel da JTable.

Vou repetir o passo a passo:

  • Primeiro você vai pegar o ListSelectionModel da sua JTable.
    Não é o TableModel, é o ListSelectionModel.
    Se não sabe como fazer isso, abre a documentação da JTable e veja qual é o método que retorna o ListSelectionModel dela;

  • Depois, com uma referência para o ListSelectionModel, você vai consultar a documentação do ListSelectionModel para descobrir qual é o método que você vai chamar para adicionar um ListSelectionListener;

  • Aí você vai implementar o seu ListSelectionListener.
    Não é ActionListener, é ListSelectionListener.
    Você vai tratar o único evento dessa interface, consulte a documentação do ListSelectionListener para ver que evento é esse;

  • A partir do ListSelectionEvent você consegue obter a linha que foi selecionada na JTable.
    Dá uma lida na documentação do ListSelectionEvent e veja qual é o método que retorna o que você quer.

2 curtidas