Atualizar JTable no evento do botão

9 respostas
A

Pessoal

Eu tenho uma JTable comum, ja com os dados e após uma consulta no banco é criada uma tabela e novamente alterada gostaria de saber se tem como eu fazer a tabela atualizar sem precisa fechar e abrir o frame ??? E poderia dar um exeplo simples só da parte do evento do botão…

Valew

9 Respostas

marcioa1

zopo,

Sua table foi montada a partir de um model ? Se sim, limpe o model ( algo como seuModel.rows.clear() ) e depois de montar o model novamente, disparar fireTableDataChanged()

Márcio

A

Desculpe mas acho que perguntei coisa errada…

Seguinte, a tabela é retornada de uma outra classe e colocada em um JScrollPane e nesta classe é criada primeiramente para a exibição do frame (ou seja em branco), quando a pessoa efetua a consulta é retornada a tabela com os resultados (também de outra classe) e adicionada novamente no ScrollPane ja criado, só que quando é adicionada ele não atualiza no InternalFrame para a exibição dos dados…

E é esse o problema…

Eu ja tentei utilizar o .dispose() e depois o .setVisible(false) e o .setVisible(true) mas não funcionam pois quando é para exibir novamente o frame ele não abre e não acontece nenhum erro !!!

G

Olá,
Você deve remover a JTable do container e adicionar a nova JTable.

Caso seja a mesma JTable com novos dados, basta dar um JTable.revalidate();

Espero ter ajudado!

A

Cara não rolou...

Ai esta o código...

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Consulta extends JInternalFrame{
	Bd objeto=new Bd();
	java.awt.Dimension screenSize = java.awt.Toolkit.getDefaultToolkit().getScreenSize();
	JInternalFrame frame_consulta;
	JScrollPane tabela=new JScrollPane();
	public Consulta(JDesktopPane desk){
		Icon icone = new ImageIcon("logo.gif");
		JLabel icon=new JLabel(icone);
		frame_consulta = new JInternalFrame( "Consulta de Livros", false, false, false, false );
			desk.add( frame_consulta );

			Container consulta_container = frame_consulta.getContentPane();
			consulta_container.setLayout( new BorderLayout() );
			
			JPanel panel=new JPanel();
			panel.setLayout(new GridLayout(7,2));
			JPanel panel1=new JPanel();
			panel1.setLayout(new FlowLayout());
			
			JLabel nome_l=new JLabel("Nome: ");
			final JTextField nome_t=new JTextField(20);
			
			JLabel codigo_l=new JLabel("Código: ");
			final JTextField codigo_t=new JTextField(20);
			
			JLabel autor_l=new JLabel("Autor: ");
			final JTextField autor_t=new JTextField(20);
			
			JLabel ano_l=new JLabel("Ano: ");
			final JTextField ano_t=new JTextField(20);
			
			JLabel edicao_l=new JLabel("Edição: ");
			final JTextField edicao_t=new JTextField(20);
			
			JButton act_consulta=new JButton (">>> Consulta <<<");
			act_consulta.addActionListener( new ActionListener() {
				public void actionPerformed( ActionEvent e ){	
					act_consulta(nome_t.getText(), codigo_t.getText(), autor_t.getText(), ano_t.getText(), edicao_t.getText());
				}
			});
			JButton act_limpar=new JButton (">>> Limpar <<<");
			act_limpar.addActionListener( new ActionListener() {
				public void actionPerformed( ActionEvent e ){	
					nome_t.setText("");
					codigo_t.setText("");
					ano_t.setText("");
					edicao_t.setText("");
					autor_t.setText("");
					tabela=new JScrollPane();
				}
			});
			JButton act_consulta_fecha=new JButton (">>> Fechar <<<");
			act_consulta_fecha.addActionListener( new ActionListener() {
				public void actionPerformed( ActionEvent e ){	
					tabela=new JScrollPane();
					frame_consulta.dispose();
				}
			});
			
			panel.add(nome_l);
			panel.add(nome_t);
			panel.add(codigo_l);
			panel.add(codigo_t);
			panel.add(autor_l);
			panel.add(autor_t);
			panel.add(ano_l);
			panel.add(ano_t);
			panel.add(edicao_l);
			panel.add(edicao_t);
			
			panel.add(act_limpar);
			panel.add(act_consulta);
			panel.add(act_consulta_fecha);
			
			panel1.add(tabela);
			tabela.setPreferredSize(new java.awt.Dimension(600,250));
			consulta_container.add(panel, BorderLayout.NORTH);
			consulta_container.add(panel1, BorderLayout.CENTER);
			frame_consulta.pack();
			frame_consulta.setVisible(true);
	}
	public void act_consulta(String nome, String codigo, String autor, String ano, String edicao){
			//frame_consulta.dispose();
			objeto.openBD();
			tabela = new JScrollPane(objeto.criarTabela(nome, codigo, autor, ano, edicao));
			objeto.closeBD();
			tabela.setPreferredSize(new java.awt.Dimension(600,250));
			tabela.setAutoscrolls(true);
			tabela.revalidate();
			//frame_consulta.setVisible(true);
	}
	public static void main(JDesktopPane desk){
			Consulta con=new Consulta(desk);
			con.setVisible(true);
	}
}
P

Véio eu acho que você criou essa tabela da maneira mais complicada. Tentar fazer o seguinte cria uma classe extends tableModel e seta o modelo dessa sua tabela com essa sua classe dai quando você quizer incluir ou excliur você
basta você fazer um objeto desse seu modelo e alterá-lo.

colosos_colossus

e pols como eu faço para actualizar apenas uma linha selecionada? Seguinte eu tenho um frame para alterar e quando eu clicar no botão sair da tela eu quero que atualize apenas a linha que foi selecionada anteriormente!

criador

Você está utilizando um DefaultTableModel para a sua tabela ???
Se sim, é só realimentar o método table.setDataVector(Object[][], Object[]); com os novos dados e logo abaixo, repintar a tabela com o comando table.repaint();

Acredito que isto faça com que sua tabela trabalhe dinamicamente neste sentido.

Abraço!

colosos_colossus

a minha tabela foi criada no NetBeans
la ta assim:

tabelaPri = new javax.swing.JTable();

tabelaPri.setModel(new javax.swing.table.DefaultTableModel(
    new Object [][] {

    },
    new String [] {
        "CODPRI", "DESPRI", "POSPRI", "RGCODUSU", "RGUSUARIO", "RGDATA", "RGEVENTO"

    }
));

tabelaPri.getTableHeader().setResizingAllowed(false);
tabelaPri.getTableHeader().setReorderingAllowed(false);

tabelaPri.setVerifyInputWhenFocusTarget(false);
G
Criado 1 de junho de 2005
Ultima resposta 13 de mar. de 2012
Respostas 9
Participantes 7