Capturar dados de uma linha clicada JTable

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:

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…

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!!

1 curtida

[quote=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…[/quote]

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

[quote=evertonsilvagomesjava][quote=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…[/quote]

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

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…

[quote=BrunoCarlo][quote=evertonsilvagomesjava][quote=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…[/quote]

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

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…[/quote]

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.

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.)

[quote=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.)[/quote]

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.

Ops. Tire o JTable da frente.

seuTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);  

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:

[code]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?
								
	}});[/code]

Meu model:

[code]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;
		
	}
	
	
}

}[/code]

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:

[code]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()));
								
			}
	}});[/code]