Capturar dados de uma linha clicada JTable

11 respostas
evertonsilvagomesjav

Pessoal boa noite, como faço pra quando eu clicar em uma linha da minha JTable eu consiga buscar os dados dessa linha?

Exemplo:

Coluna_Nome Coluna_Musica
Everton Sei la.mp3

Eu tenho minha classe artista e quando eu clicar nessa linha da JTable que contem Everton e Sei la.mp3 e clicar no meu JButton eu consiga pegar esses dados para um List.

Mas a duvida real e como capturar os dados da linha da JTable.

Vlw :thumbup:

11 Respostas

B

1º:
Implemente/crie um javax.swing.event.ListSelectionListener

2º:
Adicione o listener que vc criou na tabela, atraves do ListSelectionModel;

myTable.getSelectionModel();

JTable.getSelectionModel()

3º: no teu listener, é só pegar a linha selecionada, atraves do table, e capturar os dados…

viniciusgundim

Pega o primeiro valor da primeira couluna:

jtb.getModel().getValueAt(  jtb.getSelectedRow() ,0);

Pega o primeiro valor da segunda coluna:

jtb.getModel().getValueAt(  jtb.getSelectedRow() ,1);

E assim vai!!

evertonsilvagomesjav

BrunoCarlo:
1º:
Implemente/crie um javax.swing.event.ListSelectionListener

2º:
Adicione o listener que vc criou na tabela, atraves do ListSelectionModel;

myTable.getSelectionModel();

JTable.getSelectionModel()

3º: no teu listener, é só pegar a linha selecionada, atraves do table, e capturar os dados…

Esse ListSelectionListener e evento do JTable? Tipo eventos de buttons como addActionListener()…? Como faço á implementaçao?

B

evertonsilvagomesjava:
BrunoCarlo:
1º:
Implemente/crie um javax.swing.event.ListSelectionListener

2º:
Adicione o listener que vc criou na tabela, atraves do ListSelectionModel;

myTable.getSelectionModel();

JTable.getSelectionModel()

3º: no teu listener, é só pegar a linha selecionada, atraves do table, e capturar os dados…

Esse ListSelectionListener e evento do JTable? Tipo eventos de buttons como addActionListener()…? Como faço á implementaçao?

Então, seguinte, em swing temos para cada tipo de evento uma interface, no caso do apresentado é para quando a seleção de linhas na tabela muda, action listeners são para botões…

evertonsilvagomesjav

BrunoCarlo:
evertonsilvagomesjava:
BrunoCarlo:
1º:
Implemente/crie um javax.swing.event.ListSelectionListener

2º:
Adicione o listener que vc criou na tabela, atraves do ListSelectionModel;

myTable.getSelectionModel();

JTable.getSelectionModel()

3º: no teu listener, é só pegar a linha selecionada, atraves do table, e capturar os dados…

Esse ListSelectionListener e evento do JTable? Tipo eventos de buttons como addActionListener()…? Como faço á implementaçao?

Então, seguinte, em swing temos para cada tipo de evento uma interface, no caso do apresentado é para quando a seleção de linhas na tabela muda, action listeners são para botões…

Eu sei que actionListener e pra buttons, é pq nunca implementei um evento para clicar em linhas de JTable por isso to confuso =/. Chegando em casa vou postar a classe ai se vc tiver como me ajuda com algum exemplo? Vou tentar implementar algo com o que foi falado aqui no topico.

ViniGodoy

Primeiro de tudo, faça sua tabela ter seleção por linha:

seuTable.setSelectionMode(JTable.ListSelectionModel.SINGLE_SELECTION);

Depois, adicione um selectionListener:

seuTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @override public void valueChanged(ListSelectionEvent e) { artistas.add(seuTableModel.get(suaTable.getSelectedRow())); } }

Para pegar o artista que está selecionado, basta perguntar ao seu tableModel, como fiz ali em cima. Como o seu ArtistaTableModel provavelmente tem o método get, que retorna um artista, é só usa-lo.

Se você está usando o DefaultTableModel. Bom, aí é um problema. Se você tiver todos os dados na sua tabela, e puder reconstruir o artista a partir dali (o que normalmente não é verdade), terá que dar um new no artista, copiar todos os dados da tabela para esse novo artista, e aí atribuí-lo a lista. Muito trabalho, duplicação de dados, e alta chance de erros.

(PS: Eu sei que vc provavelmente não usa o Default, mas não custa mostrar para quem eventualmente use o trabalhão que seria continuar insistindo no erro.)

evertonsilvagomesjav

ViniGodoy:
Primeiro de tudo, faça sua tabela ter seleção por linha:

seuTable.setSelectionMode(JTable.ListSelectionModel.SINGLE_SELECTION);

Depois, adicione um selectionListener:

seuTable.getSelectionModel().addListSelectionListener(new ListSelectionListener() { @override public void valueChanged(ListSelectionEvent e) { artistas.add(seuTableModel.get(suaTable.getSelectedRow())); } }

Para pegar o artista que está selecionado, basta perguntar ao seu tableModel, como fiz ali em cima. Como o seu ArtistaTableModel provavelmente tem o método get, que retorna um artista, é só usa-lo.

Se você está usando o DefaultTableModel. Bom, aí é um problema. Se você tiver todos os dados na sua tabela, e puder reconstruir o artista a partir dali (o que normalmente não é verdade), terá que dar um new no artista, copiar todos os dados da tabela para esse novo artista, e aí atribuí-lo a lista. Muito trabalho, duplicação de dados, e alta chance de erros.

(PS: Eu sei que vc provavelmente não usa o Default, mas não custa mostrar para quem eventualmente use o trabalhão que seria continuar insistindo no erro.)

Vini realmente nao uso DefaultTableModel vc ja me ajudou d mais sobre isso ne kkk. Agora essa método setSelectionMode() tem como passar esse static JTable.ListSelectionModel.SINGLE_SELECTION por parametro? Nao consigo =/. Agora implementando uma Classe local de método com ListSelectionModel deu porém tive que implementar um monte de métodos da interface nos quais nao sei usa-los.

ViniGodoy

Ops. Tire o JTable da frente.

seuTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
evertonsilvagomesjav

Vini deu certo dessa maneira, porém nao estou entendo o motivo de estar dando um "ArrayIndexOutOfBoundsException: -1" ou seja esta dando uma exceçao no indice do meu list, porém da esta exceçao quando eu seleciono uma linha e clico no meu comboBox, agora a pergunta nao era pra estar dando essa exceçao quando eu clicar no comboBox porque o combo num tem nada haver com o evento do jTable..

Olha o codigo:

this.table = new JTable();
		this.table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		this.table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){

			@Override
			public void valueChanged(ListSelectionEvent arg0) {
						
				if(listArtista.size() > 0){
					
					listArtista.removeAll(listArtista);
					
				}
							
				listArtista.add(modelTable.getArtista(table.getSelectedRow())); // quando eu seleciono a linha de um JTable tudo bem, mas quando eu clico no meu comboBox ele entra aqui e da á exceçao pq?
									
		}});

Meu model:

package com.br.models.tables;

import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;

import com.br.artistas.Artista;

public class TableModel extends AbstractTableModel {

	List<Artista> listArtistas;
	
	private final int COLUNA_NOME_ARTISTA = 0;	
	private final int COLUNA_NOME_MUSICA = 1;
	private final int COLUNA_NOME_GENERO = 2;
	
	public TableModel(List<Artista> list){
		
		this.listArtistas = new ArrayList(list);
		
	}
		
	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return 3;
	}

	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return this.listArtistas.size();
	}

	@Override
	public Object getValueAt(int row, int column) {

		Artista artista = this.listArtistas.get(row);
		
		if(this.COLUNA_NOME_ARTISTA == column){
			
			return artista.getNomeArtista();
			
		}

		if(this.COLUNA_NOME_MUSICA == column){
			
			return artista.getNomeMusica();
			
		}
		
		if(this.COLUNA_NOME_GENERO == column){
			
			return artista.getGenero();
			
		}
		
		
		return null;
	}
	
	@Override
	public String getColumnName(int column){
		
		if(column == this.COLUNA_NOME_ARTISTA){
			
			return "Nome";
			
		}
		
		if(column == this.COLUNA_NOME_GENERO){
			
			return "Genero";
			
		}
		
		if(column == this.COLUNA_NOME_MUSICA){
			
			return "Música";
			
		}
		
		return null;
		
	}
	
	public void addLista(List<Artista> list){
		
		this.listArtistas = list;
		
		  
		this.fireTableDataChanged();
				
	}
	
	public Artista getArtista(int linha){
		
		if(this.listArtistas.size() > 0){
					
			return this.listArtistas.get(linha);
			
		}else{
			
			return null;
			
		}
		
		
	}

}
ViniGodoy

Quando a table perde a seleção, esse método é chamado com o índice -1 na seleção para indicar que isso ocorreu. Só teste essa situação no seu if.

evertonsilvagomesjav
ViniGodoy:
Quando a table perde a seleção, esse método é chamado com o índice -1 na seleção para indicar que isso ocorreu. Só teste essa situação no seu if.

Puuts isso ae mesmo VIni!!! Fiz do jeito que vc disse ficou perfeito:

this.table.getSelectionModel().addListSelectionListener(new ListSelectionListener(){

			@Override
			public void valueChanged(ListSelectionEvent arg0) {
						
				if(listArtista.size() > 0){
					
					listArtista.removeAll(listArtista);
					
				}
				
				if(table.getSelectedRow() != -1){
				
					listArtista.add(modelTable.getArtista(table.getSelectedRow()));
									
				}
		}});
Criado 1 de julho de 2010
Ultima resposta 3 de jul. de 2010
Respostas 11
Participantes 4