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]