Linha selecionada de jTable sempre retorna -1

8 respostas
L

Olá! Estou com um probleminha persistente. Já procurei várias informações sobre o probela aqui e em outros fórums e até encontrei respostas legais, mas nenhuma delas funciona!!! O probelama é o seguinte: consegui retornar os valores a serem preenchidos na JTable, mas, ao tentar selecionar uma linha, ele sempre retorna o valor -1, utilizando o método getSelectedRow(). Mesmo a linha ter sido selecionada pelo usuário, o valor retornado é sempre -1. Abaixo está o código referente ao problema, dentro de um botão Excluir, que é o que quero.

private JButton getBExcluir() {
		if (bExcluir == null) {
			bExcluir = new JButton();
			bExcluir.setBounds(new Rectangle(410, 414, 90, 25));
			bExcluir.setText("Excluir");
			bExcluir.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {

                                        //Pois bem, aqui, ao ter selecionado a linha, deveria retornar o valor da linha, mas só volta -1... o que está acontecendo?
					if(jTable.getSelectedRow() < 0)
					{
						JOptionPane.showMessageDialog(null,
								"Selecione uma linha primeiro!", "Denttal!",
								JOptionPane.INFORMATION_MESSAGE, null);
												
					}else{
						int opcao;
						Object[] botoes = {"Sim", "Não"};
						opcao = JOptionPane.showOptionDialog(null,
								"Deseja mesmo excluir este item?",
								"Sim", JOptionPane.YES_NO_OPTION,
								JOptionPane.QUESTION_MESSAGE,
								null, botoes, botoes[0]);
						if(opcao == JOptionPane.YES_OPTION){
							System.out.println("Funcionou!");
							validate();
						}
					}
				}
			});
			};
		return bExcluir;
	}

8 Respostas

Linkel

Fera, você já observou se a jTable não está sendo “deselecionada” antes da execução desse método?

L

Olá, amigo!

Bem, sinceramente, não consegui encontrar se a jTable de fato está sendo deselecionada. É o seguinte, a minha jTable não é chamada diretamente como está aí. Até a criação da tabela, o caminho é o seguinte:

Criei private jTable e private jScrollpane, ambos recebendo null.
O início vai por um método chamado initialize(), que chama a getContentPane.
Dentro da getContentPane() é adicionada uma jScrollPane, no qual é chamda pelo método getScrollPane().
Dentro da getScrollPane() tem uma 'jScrollPane = new jScrollPane(getJTable).
Dentro da getJTable() há a chamada dos métodos para criar a tabela, e retorna ‘return(jTable)’ para a new jScrollpane(getJTable()).
Por fim retorna para a jContentPane para exibir a tabela.

Asim não achei exatamente um jeito de a tabela tá sendo descelecionada. Se quiser, posso postar todo o código.

Abração e obrigado pela a ajuda!!!

Linkel

Brother, então posta aqui o código pra gente ver… Assim fica mais fácil dizer…
Um abraço!

L

Linkel:
Brother, então posta aqui o código pra gente ver… Assim fica mais fácil dizer…
Um abraço!

Ok. Aí vai o código…

package gui;

import java.util.*;
import java.awt.*;
import javax.swing.*;
import java.sql.*;
import java.awt.Dimension;
import dados.*;
import javax.swing.table.*;
import java.awt.event.*;

import javax.swing.JPanel;
import java.awt.BorderLayout;
import java.awt.HeadlessException;
import java.awt.Rectangle;
import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import negocios.*;
import excecoes.DenttalException;
import javax.swing.JLabel;
import javax.swing.border.TitledBorder;
import javax.swing.JTextField;
import javax.swing.JComboBox;

public class TelaAlmoxarifado extends JFrame{

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane;
	
	private JScrollPane jScrollPane;
	private JTable jTable = null;
	private JButton bListar = null;
	private Fachada fachada = null;  //  @jve:decl-index=0:
	private JButton bExcluir = null;
	private JLabel border1 = null;
	private JLabel border2 = null;
	private JLabel border3 = null;
	private JLabel labelFounds = null;
	private JLabel labelNumFounds = null;
	private JButton bAlterar = null;
	private JButton bImprimir = null;
	private JLabel border4 = null;
	private JButton bCadastrar = null;
	private JButton bRelatorio = null;
	private JLabel labelEntrada = null;
	private JTextField campoEntrada = null;
	private JLabel labelTipoConsulta = null;
	private JComboBox listaConsulta = null;
	private JButton bConsultar = null;
	private String lista[] = {"Código", "Nome", "Descrição"};
	
	public TelaAlmoxarifado()
	throws DenttalException
	{
			  super();
			  initialize();		  
	} 
	
	private void initialize() 
	throws DenttalException{
		
		if(testeConn() == true)
		{
			this.setSize(640, 480);
			this.setContentPane(getJContentPane());
			this.setTitle("Denttal");
			this.setVisible(true);
			this.setLocationRelativeTo(null);
			this.setResizable(false);
		}else{
			JOptionPane.showMessageDialog(null,
					"Erro na conexão com banco de dados.\n" +
					"Entre em contato com o administrador.",
					"Denttal - Conexão BD",
					JOptionPane.ERROR_MESSAGE, null);
			}
	}
	
	private boolean testeConn()
	{
		Connection conn;
		boolean conn2 = false;
		try { 
			conn = ConnectionFactory.getConnection();
		 	conn.createStatement(); 
		 	return conn2 = true;
		} 
		catch (SQLException sqlex) 
		{  
			
			return conn2 = false;
		} 
	}
	
	private Fachada getFachada(){
		if (fachada == null)
		{
			fachada = new Fachada();
		}
		return fachada;
	}
	
	private JPanel getJContentPane() 
	throws DenttalException{
		if (jContentPane == null) 
		{
			
			labelTipoConsulta = new JLabel();
			labelTipoConsulta.setBounds(new Rectangle(261, 53, 78, 16));
			labelTipoConsulta.setText("Consulta por");
			labelEntrada = new JLabel();
			labelEntrada.setBounds(new Rectangle(262, 32, 53, 16));
			labelEntrada.setText("Entrada");
			labelNumFounds = new JLabel();
			labelNumFounds.setBounds(new Rectangle(121, 411, 38, 16));
			labelFounds = new JLabel();
			labelFounds.setBounds(new Rectangle(38, 411, 81, 16));
			labelFounds.setText("Encontrados: ");
			jContentPane = new JPanel();
			jContentPane.setLayout(null);
			border1 = new JLabel();
			border1.setLayout(null);
			border1.setBounds(new Rectangle(244, 7, 357, 80));
			border1.setBorder(new TitledBorder("Pesquisa"));
			border2 = new JLabel();
			border2.setLayout(null);
			border2.setBounds(new Rectangle(24, 391, 149, 55));
			border2.setBorder(new TitledBorder("Resultados"));
			border3 = new JLabel();
			border3.setLayout(null);
			border3.setBounds(new Rectangle(213, 391, 389, 55));
			border3.setBorder(new TitledBorder("Confirmação"));
			border4 = new JLabel();
			border4.setLayout(null);
			border4.setBounds(new Rectangle(120, 7, 116, 80));
			border4.setBorder(new TitledBorder("Produto"));

			jContentPane.add(border1, null);
			jContentPane.add(border2, null);
			jContentPane.add(border3, null);
			jContentPane.add(border4, null);
			jContentPane.add(getJScrollPane(), null);
			jContentPane.add(getBListar(), null);
			jContentPane.add(getBExcluir(), null);
			jContentPane.add(labelFounds, null);
			jContentPane.add(labelNumFounds, null);
			jContentPane.add(getBAlterar(), null);
			jContentPane.add(getBImprimir(), null);
			jContentPane.add(getBCadastrar(), null);
			jContentPane.add(getBRelatorio(), null);
			jContentPane.add(labelEntrada, null);
			jContentPane.add(getCampoEntrada(), null);
			jContentPane.add(labelTipoConsulta, null);
			jContentPane.add(getListaConsulta(), null);
			jContentPane.add(getBConsultar(), null);
		}
		return jContentPane;
	}
	
	private JScrollPane getJScrollPane() 
	throws DenttalException{
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane(getJTable());
			jScrollPane.setBounds(new Rectangle(28, 95, 572, 280));
			labelNumFounds.setText(String.valueOf(getJTable().getModel().getRowCount()));
			//acima, esse método traz a quantidade de linhas buscadas
		}
		return jScrollPane;
	}
	
	private JTable getJTable() 
	throws DenttalException
	{  
		ResultSet resultset = null;
		try {
			resultset = getFachada().listarAlmoxarifado(resultset);//chama o métododo listar no DBConnection
			return(displayResultSet(resultset));			
		} 
		catch (SQLException e ) { 
			JOptionPane.showMessageDialog(null,
					"Erro!", "Denttal!",
					JOptionPane.ERROR_MESSAGE, null);
		} 

		return(jTable);
	}
	
	
	private JTable createTable(Vector rows, Vector columnHeads)
	{
		jTable = new JTable(rows, columnHeads);
		validate();
		return(jTable);
	}
	
	private JTable displayResultSet(ResultSet rs)
	throws SQLException 
	{ 
		boolean moreRecords = rs.next();
		
		Vector&lt;String&gt; columnHeads = new Vector&lt;String&gt;(); 
		Vector rows = new Vector();

		if (! moreRecords) 
		{ 
			ResultSetMetaData rsmd = rs.getMetaData(); 
			
			for (int i = 1; i &lt;= rsmd.getColumnCount(); ++i) 
				columnHeads.addElement(rsmd.getColumnName(i)); 
			
			JOptionPane.showMessageDialog(null,
					"Nenhum valor registrado!", "Denttal!",
					JOptionPane.INFORMATION_MESSAGE, null);
			
		}else{
			try 
			{ 

			ResultSetMetaData rsmd = rs.getMetaData(); 
			for (int i = 1; i &lt;= rsmd.getColumnCount(); ++i) 
				columnHeads.addElement(rsmd.getColumnName(i)); 

				do { 
					
					rows.addElement(getNextRow(rs, rsmd)); 
					
					} while (rs.next()); 

			}catch (SQLException sqlex) { 
				sqlex.printStackTrace(); 
				} 
		
		}//fim do else

		rs.close();//Fecha a conexão aberta no BDConnection

		return(createTable(rows, columnHeads));
	} 
	
	private Vector getNextRow(ResultSet rs, ResultSetMetaData rsmd) 
	throws SQLException 
	{ 
		Vector currentRow = new Vector(); 
		for (int i = 1; i &lt;= rsmd.getColumnCount(); ++i) 
			switch(rsmd.getColumnType(i)) { 
			case Types.VARCHAR: currentRow.addElement(rs.getString(i)); 
			break; 
			case Types.INTEGER:currentRow.addElement(new Long(rs.getLong(i))); 
			break; 
			case Types.DOUBLE:currentRow.addElement(rs.getDouble(i)); 
			break;
			} 
		return currentRow; 
	} 

	private JButton getBListar(){
		if (bListar == null) {
			bListar = new JButton();
			bListar.setBounds(new Rectangle(502, 414, 90, 25));
			bListar.setText("Listar");
			bListar.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {

					jTable.updateUI();
					jScrollPane.updateUI();
					
				}
			});
			};
		return bListar;
	}

	private JButton getBExcluir() {
		if (bExcluir == null) {
			bExcluir = new JButton();
			bExcluir.setBounds(new Rectangle(410, 414, 90, 25));
			bExcluir.setText("Excluir");
			bExcluir.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {

					if(jTable.getSelectedRow() &lt; 0)
					{
						JOptionPane.showMessageDialog(null,
								"Selecione uma linha primeiro!", "Denttal!",
								JOptionPane.INFORMATION_MESSAGE, null);
																			
					}else{
						int opcao;
						Object[] botoes = {"Sim", "Não"};
						opcao = JOptionPane.showOptionDialog(null,
								"Deseja mesmo excluir este item?",
								"Sim", JOptionPane.YES_NO_OPTION,
								JOptionPane.QUESTION_MESSAGE,
								null, botoes, botoes[0]);
						if(opcao == JOptionPane.YES_OPTION){
							System.out.println("ok");
							validate();
						}
					}
				}
			});
			};
		return bExcluir;
	}

	private JButton getBAlterar() {
		if (bAlterar == null) {
			bAlterar = new JButton();
			bAlterar.setBounds(new Rectangle(318, 414, 90, 25));
			bAlterar.setText("Alterar");
		}
		return bAlterar;
	}

	private JButton getBImprimir() {
		if (bImprimir == null) {
			bImprimir = new JButton();
			bImprimir.setBounds(new Rectangle(226, 414, 90, 25));
			bImprimir.setText("Imprimir");
		}
		return bImprimir;
	}
	
	private JButton getBCadastrar() {
		if (bCadastrar == null) {
			bCadastrar = new JButton();
			bCadastrar.setBounds(new Rectangle(134, 27, 90, 25));
			bCadastrar.setText("Incluir");
		}
		return bCadastrar;
	}

	private JButton getBRelatorio() {
		if (bRelatorio == null) {
			bRelatorio = new JButton();
			bRelatorio.setBounds(new Rectangle(134, 55, 90, 25));
			bRelatorio.setText("Relatório");
		}
		return bRelatorio;
	}

	private JTextField getCampoEntrada() {
		if (campoEntrada == null) {
			campoEntrada = new JTextField();
			campoEntrada.setBounds(new Rectangle(318, 30, 267, 20));
		}
		return campoEntrada;
	}

	private JComboBox getListaConsulta() {
		if (listaConsulta == null) {
			listaConsulta = new JComboBox(lista);
			listaConsulta.setBounds(new Rectangle(341, 53, 140, 20));
		}
		return listaConsulta;
	}

	private JButton getBConsultar() {
		if (bConsultar == null) {
			bConsultar = new JButton();
			bConsultar.setBounds(new Rectangle(495, 53, 90, 25));
			bConsultar.setText("Consultar");
		}
		return bConsultar;
	}
 
}  //  @jve:decl-index=0:visual-constraint="44,24"
Linkel

Fera, realmente está muito difícil detectar o porquê disso…
Não sou nenhum expert em jTable, rsrsr, mas acho que o problema pode estar na instância do método getJTable()… Por isso, você já tentou usar o retorno desse método ao invés de buscar diretamente no objeto jTable a linha selecionada? Posso estar dizendo besteira, mas acho que você deveria fazer isso, assim:

//... if (getJTable().getSelectedRowCount() &gt; 0) { // esse método acima vai retornar a quantidade de linhas selecionadas... JOptionPane.showMessageDialog(null,&quot;Selecione uma linha primeiro!&quot;); } //...Tente aí e diga se estou dizendo asneira, rsrsr…

L

Linkel:
Fera, realmente está muito difícil detectar o porquê disso…
Não sou nenhum expert em jTable, rsrsr, mas acho que o problema pode estar na instância do método getJTable()… Por isso, você já tentou usar o retorno desse método ao invés de buscar diretamente no objeto jTable a linha selecionada? Posso estar dizendo besteira, mas acho que você deveria fazer isso, assim:

//... if (getJTable().getSelectedRowCount() &gt; 0) { // esse método acima vai retornar a quantidade de linhas selecionadas... JOptionPane.showMessageDialog(null,&quot;Selecione uma linha primeiro!&quot;); } //...Tente aí e diga se estou dizendo asneira, rsrsr…

Olá, amigão!

Seguinte, também não sou nenhum expert em jTable, somos dois, então!!! Daí, o que você falou eu entendi, mas isso não trazia o problema em questão, mas sim uma falta de organização do código. Entretanto, consegui descobrir o problema através de outro colega em outro fórum. O erro estava em “criar” a tabela 2 vezes. 1º criava a tabela na getJScrollPane() e depois chava essa linha labelNumFounds.setText(String.valueOf(getJTable().getModel().getRowCount()));
Assim, ele criava a tabela, exibia ao usuário, mas depois criava outra tabela e, quando tinha a linha selecionada, não pertencia a mesma tabela. Enfim, uma tabela por cima da outra = confusão total!

Assim apenas mude o código acima para labelNumFounds.setText(String.valueOf(jTable.getRowCount()));e funfou certinho!!! E valew muito a sua ajuda!!!

O problema agora estar em atualizar a tabela para o usuário. Tentei os método validate() e rapaint(), mas não funcionaram… Sabe dizer o que seria?! :shock:

Abração!!! :smiley: :smiley: :smiley:

Linkel

Que bom que deu certo, mano!
Agora, para atualizar a tabela é só popular ela novamente com os dados, se é isso que entendi…
Eu uso DefaultTableModel para isso…

DefaultTableModel modelTabela = (DefaultTableModel) jTable.getModel(); modelTabela.setRowCount(0); // deleta todas as linhas... //... String[] dados = new string[2]; dados[0] = "Valor 1"; // valor na coluna 1... dados[1] = "valor 2"; // valor na coluna 2... //... modelTabela.addRow(dados); // atualiza os dados da tabela...Um abraço!

L

Olá, amigo!
Pois é, tentei o que você citou, mas ainda não está atualizando! Na verdade, eu não criei a minha jTable através de um Model. Criei nua e crua mesmo, como você pode ver no código. Daí, quando peço pra atualizar os dados, tipo, se acabei de inserir um valor no banco de dados, deveria imediatamente retornar os dados inseridos no BD para a jTable, mas não funfa nem a pau! Se eu soubesse que trabalhar com jTable seria tão difícil assim, dava um jeito de soltar tudo em uma jLista e entregar pro professor assim mesmo… :frowning:
Mas não vou desistir não. :roll: E qualquer coisa, amigão, manda aqui, blz?! Ahh, deixei um comment no seu blog, esse da assinatura. Olha lá!

Abraço!

Criado 11 de outubro de 2008
Ultima resposta 14 de out. de 2008
Respostas 8
Participantes 2