Evento da jtable não funciona[resolvido]

15 respostas
P
ola, o evento da minha jtable não esta funcionando. Eu gostaria de usar 2 eventos na jtable o mouse
table.addMouseListener(new MouseListener() {...}
este funciona mas o outro evento
table.getModel().addTableModelListener(new TableModelListener() {

				@Override
				public void tableChanged(TableModelEvent arg0) {
				System.out.println("evento da jtable");
				}});
não funciona é que o evento do mouse eu preciso para abrir uma tela dependo do valor da linha da coluna 2 e este outro evento eu queria usar para alterar os valores na tabela e alterar tb no banco só posso usar um evento na jtable? obrigada :)

15 Respostas

rafaelviny

tenta implementar o mouse listener na sua tela

e dai adicionar na sua tabela

ex:

depois

P
ola rafaelviny, bah acho que não me expliquei direito é que tipo o evento do mouse ta funcionando tipo o codigo esta assim
table.addMouseListener(new MouseListener() {
				//da para alterar os itens da jtable ou pelo mouseReleased ou mousePressed*
				@Override
				public void mouseReleased(MouseEvent e) {
				System.out.println("mouseReleased");
				}
				
				@Override
				public void mousePressed(MouseEvent e) {
					System.out.println("pressed");
					
				}
				
				@Override
				public void mouseExited(MouseEvent e) {
					System.out.println("exited");
					
				}
				
				@Override
				public void mouseEntered(MouseEvent e) {
					System.out.println("entered");
					
				}
				
				
				public void mouseClicked(MouseEvent arg0) {
					if(table.getSelectedColumn()==3)
					{
						double valorNota = 0;
						String message="Não há itens para recuperar";
						String valor=null;
						Object notaBanco=table.getModel().getValueAt(table.getSelectedRow(), 2);
						valor=(String) notaBanco;
						valorNota=Double.parseDouble(valor);
						if (valorNota < 50.0){  
							try {
								System.out.println("select recuperacao from nota where rc_aluno='"+ t0.getText() +"' and disciplina='"+ table.getModel().getValueAt(table.getSelectedRow(), 0) +"' and modulo='"+ table.getModel().getValueAt(table.getSelectedRow(), 1) +"'");
								resultado = comando.executeQuery("select recuperacao from nota where rc_aluno='"+ t0.getText() +"' and disciplina='"+ table.getModel().getValueAt(table.getSelectedRow(), 0) +"' and modulo='"+ table.getModel().getValueAt(table.getSelectedRow(), 1) +"'");
								if(resultado.next())
								{
									message=resultado.getString(1);
								}

								message="Registre a data da recuperação";
								telaRecuperacao telarecup=new telaRecuperacao();
								telarecup.setVisible(true);
								Menu.w.add(telarecup);

							} 
							catch (SQLException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
						}

						JOptionPane.showMessageDialog(null, message);  

					
					}
				}
			});
o problema é que eu queria usar este outro metodo aqui
table.getModel().addTableModelListener(new TableModelListener()
para tipo alterar algo na tabela que esta na tela e alterar tambem aquele dado no banco mas não ta funcionando :/ muito obrigada pela ajuda
P
eu ate tentei fazer o seguinte
public void mouseReleased(MouseEvent e) {
					System.out.println("mouseReleased");
					StringBuilder sql = new StringBuilder("UPDATE nota SET ");  

					switch (table.getModel().getColumnCount()) {  
					case 0:  
						sql.append("observacao = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),3 ));  
						sql.append("'");  System.out.println(sql+"*");
						break;  
					case 1:  
						sql.append("atividade = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),4 ));  
						sql.append("'");  System.out.println(sql+"*");
						break;
					case 2:
						sql.append("atividade = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),5 ));  
						sql.append("'");  System.out.println(sql+"*");
						break;
					case 3:
						sql.append("atividade = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),6 ));  
						sql.append("'"); System.out.println(sql+"*"); 
						break;
					case 4:
						sql.append("atividade = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),7 ));  
						sql.append("'");  System.out.println(sql+"*");
						break;
					case 5 :
						sql.append("atividade = '");  
						sql.append(table.getModel().getValueAt(table.getSelectedRow(),8 ));  
						sql.append("'");  
						System.out.println(sql+"*");
						break;  
					default:
						System.out.println("bah "+sql);
						break;
					}
					sql.append(" WHERE rc_aluno='");  
					sql.append(t0.getText());  
					sql.append("'");  
					String update = sql.toString();  
					System.out.println(update);  
					//				try {
					//					comando.executeUpdate(update);
					//				} catch (SQLException e1) {
					//					// TODO Auto-generated catch block
					//					e1.printStackTrace();
					//				}  

				}
mas só entra no default e os prints que era para fazer aparecer os itens a serem mudados ficam vazios :/ há algum erro no codigo? mto obg :)
rafaelviny

nao tem como eu verificar se tem erro (sem tempo)
mas uma ideia posso dar:
na maioria dos sistemas (ERPs) em que trabalhei, quando tem uma JTABLE e queremos alterar algum item, eu seleciono a linha e o sistema aparesenta uma tela com os dados alterados, faço minhas aterações confirmo e os dados da tabela são atualizados (vc pode fazer uma tela extendendo de um JDialog e no construtor dar um setModal(true)) na tabela e no seu caso no banco tambem

fica a dica :lol:

outra coisa, use mais metodos

#  double valorNota = 0;  
#                         String message="Não há itens para recuperar";  
#                         String valor=null;  
#                         Object notaBanco=table.getModel().getValueAt(table.getSelectedRow(), 2);  
#                         valor=(String) notaBanco;  
#                         valorNota=Double.parseDouble(valor);  
#                         if (valorNota < 50.0){    
#                             try {  
#                                 System.out.println("select recuperacao from nota where rc_aluno='"+ t0.getText() +"' and disciplina='"+ table.getModel().getValueAt(table.getSelectedRow(), 0) +"' and modulo='"+ table.getModel().getValueAt(table.getSelectedRow(), 1) +"'");  
#                                 resultado = comando.executeQuery("select recuperacao from nota where rc_aluno='"+ t0.getText() +"' and disciplina='"+ table.getModel().getValueAt(table.getSelectedRow(), 0) +"' and modulo='"+ table.getModel().getValueAt(table.getSelectedRow(), 1) +"'");  
#                                 if(resultado.next())  
#                                 {  
#                                     message=resultado.getString(1);  
#                                 }  
#   
#                                 message="Registre a data da recuperação";  
#                                 telaRecuperacao telarecup=new telaRecuperacao();  
#                                 telarecup.setVisible(true);  
#                                 Menu.w.add(telarecup);

este processamento pode ser feito dentro de um metodo, o que deixaria seu codigo mais legivel

espero ter ajudado

P

bah ajudou sim vou fazer usando o jdialog do jeito que tu disseste porque fica mais facil saber o que vai ser alterado e tb mais seguro pq tu ve se tu quer alterar aquilo q tu alterou mesmo :slight_smile: ah e ocodigo vou jogar num metodo e chamar o mesmo ali .
Depois posto a solução ou mais duvidas :wink:
:)brigada pelas dicas

rafaelviny

por nada.
disponha…

carregar as informações em frames(JInternalFrame, JDialog, JFrames) e nao manipular nas tabelas sempre é a melhor opção (lembre de nao deixar alterar dados diretamente na tabela), alem de ficar mais bonito, apresentavel, profissional e facil aprendizagem por parte do usuario

P
a classe que extende o jdialog fica assim
import javax.swing.JDialog;


public class DadosQueSeraoAlteradosnaJtable extends JDialog{

	private static final long serialVersionUID = 1L;

	public DadosQueSeraoAlteradosnaJtable() {
		super();
		setModal(true);
                setSize (500,400);   
		setVisible (true);   
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE );
		setDefaultCloseOperation(javax.swing.WindowConstants.HIDE_ON_CLOSE);   
		setResizable(true);
	}

	
}
falta inserir algum atributo? e ah como fica a parte tipo de selecionar a linha na tabela e aparecer nesta classe? eu preciso inserir esta classe num frame? obg
rafaelviny

agora vc cria os campos que vc modificava na tabela nesse JDialog, e altera os dados nele, depois deleta a linha selecionada e coloca os novos dados

P
tah minha classe do jdialog esta assim
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class DadosQueSeraoAlteradosnaJtable extends JDialog implements ActionListener{

	private static final long serialVersionUID = 1L;
	JButton b,b1,b2,b3;
	Connection conexao;
	Statement comando;
	ResultSet resultado;
	private String observacao,atv1,atv2,atv3,atv4,atv5,atv6;//atributos para trocar na tabela
	private double nota;//atributos para trocar na tabela
	
	public DadosQueSeraoAlteradosnaJtable() {
		super();
		setModal(true);
		this.setTitle("Confirmação de alterações de dados");
		this.setLayout(null);
		
		b=new JButton("Salvar");
		b1=new JButton("Cancelar");
		
		b.setBounds (30, 120, 90, 25);
		b1.setBounds (180, 120, 90, 25);
		
		b.addActionListener(this);
		b1.addActionListener(this);
		
		add(b);add(b1);
		
		try {
			conexao = conecta.conectabanco();
			comando = conexao.createStatement();
		} catch (Exception x) {
			JOptionPane.showMessageDialog(null, "Erro na conexÄo do banco");
		}
		
		b.addActionListener (new ActionListener (){   
			public void actionPerformed (ActionEvent e){  
			
			}}); 
		
		b1.addActionListener (new ActionListener (){   
			public void actionPerformed (ActionEvent e){  
			
			}}); 
		
		this.setSize (500,400);   
		this.setVisible (true);   
		this.setDefaultCloseOperation(this.DISPOSE_ON_CLOSE );  
		this.setResizable(true);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}

	
}
como eu faço "altera os dados nele, depois deleta a linha selecionada e coloca os novos dados" tipo eu tenho os atributos para modificar da linha da tabela aqui? obg
rafaelviny

agora que vc altero os dados no JDialog e no banco so precisa alterar na tabela

P

ola,
ah para pegar a linha selecionada da jtable que esta na outra classe pensei no seguinte método

public void linhaSelecionadaDaJtable() { //crio um objeto da classe onde esta a tabela TelaDeInsercaoDeNotas tela=new TelaDeInsercaoDeNotas(); //atraves deste obj pego o painel onde a table esta sendo add Component[] components = tela.painel.getComponents(); for (Component component : components) { if ( component instanceof JTable ) { System.out.println("tem jtable"); } else { System.out.println("não contem jtable"); } //so entra no else:/ } }
só entra no else isso é pq eu to criando a jtable num metodo e chamando num botão?pq eu declaro ela no inicio da minha classe…
eu entendi errado?era para eu ter feito tudo a mesma tela?
mto obg :slight_smile:

guilherme.dio

Aparentemente vc esta instanciado outro Form, ou seja, esta em branco.

P


Aparentemente vc esta instanciado outro Form, ou seja, esta em branco.

não te entendi outro form em branco?
obg

rafaelviny

faça o seguinte

modifique seu construtor

public DadosQueSeraoAlteradosnaJtable(JInternalFrame seuFrame//ou o tipo de objeto da sua tela que tem a tabela) { this.seuFrame = seuFrame; // lembre de criar um seuFrame acima, mas nao instancia-lo

na tela que vc tem a jtable faz os getS dos dados que vc quer no seu JDialog

dai no seu dialog vc faz isso

dai joga para seu JTextField

para retornar os dados para sua tela com tabela

sentando como linha o tabela.getSelectedRow();

P

obrigada por toda ajuda mas agora não será mais necessário o uso da jtable para isto a minha idéia com botões foi aceita!
tu até ja me ajudou nesta tela http://www.guj.com.br/java/237541-salvar-texto-do-joptionpaneresolvido ,lembra?
vou voltar a utilizar a versão antiga da tela devido a maneira dos itens estarem salvos no banco e do jeito que tenho q jogar na tela tipo eu teria q fazer uma matriz enorme para pegar os itens do banco e depois jogar na tela e quanto maior a quantidade de dados maior seria o tempo das pesquisas!
obg
:slight_smile:

Criado 4 de maio de 2011
Ultima resposta 11 de mai. de 2011
Respostas 15
Participantes 3