[Resolvido] Problema com JTable - como dar repaint?

5 respostas
M

Olá a todos,

Tenho um JScrollPane com um JTable dentro e estou tentando coloca-lo em um JFrame. Mas isso não ocorre na inicialização do programa, e sim a pedido do usuário.
O problema é que ao colocar o scrollpane no frame não é mostrada a tabela. Apenas depois de minimizar (ou algumas outras operações) é que a tabela é mostrada.
Imagino que isso signifique que o frame não foi redesenhado após adição do scrollpane.

O código a seguir replica o comportamento:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;

public class Teste extends JFrame{
	JPanel painel;
	
	public Teste() {		
		painel = new JPanel(new BorderLayout());
		
		JButton botao = new JButton("Criar tabela");
		botao.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				preencher();
			}
		});
		
		painel.add(botao, BorderLayout.NORTH);

		this.setContentPane(painel);		
		this.setSize(300, 300);
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);	
	}
	
	public void preencher() {
		String[] colunas = {"A", "B"};  
		Integer[][] linhas = {{0, 0}, {1, 10}, {2, 20}, {3, 30}};  
		
		JTable table = new JTable(linhas, colunas);
		table.setFillsViewportHeight(true);
		JScrollPane scrollPane = new JScrollPane(table); 
		
		painel.add(scrollPane, BorderLayout.CENTER);
	}
	
	public static void main(String[] args) {
		new Teste();
	}
}

Já tentei usar o repaint(), mas não sei para que componentes devo enviar a mensagem de repaint.

Alguém saberia como resolver isso?

Grato pela atenção

5 Respostas

davidbuzatto

Crie a tabela e o scroll pane fora do método preencher (apenas uma instância de cada). O seu método preencher deve mexer só com os dados da tabela (através do TableModel).

M

O código serve apenas para replicar o que ocorre.

De qualquer forma acabei encontrando a solução por acaso.

...
 JTable table = new JTable(linhas, colunas);
		table.setFillsViewportHeight(true);
		JScrollPane scrollPane = new JScrollPane(table); 
		
		painel.add(scrollPane, BorderLayout.CENTER);
		this.validate();
...

Grato pela atenção.

davidbuzatto

Ainda acho que você não deveria ficar (re)criando os componentes a cada chamada do método… Enfim, se resolveu, tudo bem.
[]´s

ViniGodoy

manwe:
O código serve apenas para replicar o que ocorre.

De qualquer forma acabei encontrando a solução por acaso.

Na verdade, era mais fácil ler a documentação:

M

@davidbuzatto Como disse, o código era apenas para mostrar o problema. O programa real não recria os componentes a cada chamada, era simplesmente um exemplo. Mas obrigado pela dica de qualquer forma.

@ViniGodoy OK,essa nota da documentação passou despercebida. Obrigado pela informação.

Criado 29 de dezembro de 2009
Ultima resposta 30 de dez. de 2009
Respostas 5
Participantes 3