Flicker na JTable ao Apagar e escrever de novo

5 respostas
SirDominque

Gente, Ajuda please :smiley:

Estou usando uma jTable.
Ela atualiza em uma thread.
O problema é ,

  1. Ela esta populada com 40 linhas e 4 colunas, o resto vazia.

  2. Ela apaga;

  3. Fica esbranquiçada

  4. Preenche os dados;

  5. volta pra 1

===

O problema é que ela fica esbranquiçada por muito tempo.
Como posso evitar isso? Acredito que tenha algo a ver com buffer. Porque meus dados vem de um server na internet.
Porque preciso atualizar a tabela.

Qual seria o jeito correto de fazer ? E qual o jeito mais fácil ? Queria os dois jeitos , por favor :stuck_out_tongue:

Obrigadão mestres

5 Respostas

ViniGodoy

Com qual frequência você está atualizando o JTable?
Está usando o comando EventQueue.invokeLater para disparar a atualização na thread do Swing?
Como a thread está fazendo essa atualização? Linha por linha, ou gerando um novo model e dando um único setModel?

SirDominque

ViniGodoy:
Com qual frequência você está atualizando o JTable?
Está usando o comando EventQueue.invokeLater para disparar a atualização na thread do Swing?
Como a thread está fazendo essa atualização? Linha por linha, ou gerando um novo model e dando um único setModel?

Atualizando a cada 7 Segundos

LInha por linha e sem eventQueue.invokelater.
SetvalueAt numa thread.

ViniGodoy

Crie um método setValues no seu TableModel que substitua todos os dados de uma só vez. Dispare uma vez só o evento fireTableDataChanged().
O setValueAt não deveria ser chamado diretamente pelo programador, somente pelo próprio JTable.
Espero sinceramente que você não esteja usando o DefaultTableModel.

Além disso, lembre-se que o Swing não é thread-safe e use o método EventQueue.invokeLater.

SirDominque

ViniGodoy:
Crie um método setValues no seu TableModel que substitua todos os dados de uma só vez. Dispare uma vez só o evento fireTableDataChanged().
O setValueAt não deveria ser chamado diretamente pelo programador, somente pelo próprio JTable.
Espero sinceramente que você não esteja usando o DefaultTableModel.

Além disso, lembre-se que o Swing não é thread-safe e use o método EventQueue.invokeLater.

Estou usando o Default rsrsr, vou fazer meu próprio model então.

E

Uma forma alternativa de você não ver mais esses flickers é usar o GlazedLists, que tem um algoritmo que otimiza o refrescamento da tela em um JTable (embora se a taxa de atualização de dados for excessiva é melhor você simplesmente ter um timer que amostra os dados e só refresca a tela depois de transcorridos, por exemplo, 300 ms.).

Usei o GlazedLists no caso de mostrar um “book” no caso de ordens da Bolsa de Valores (se alguém já viu um “book” de PETR4 vai saber do que eu estou falando), e um “timer” para mostrar estatísticas a respeito de mensagens UDP capturadas por vários canais simultaneamente.

Criado 7 de outubro de 2012
Ultima resposta 8 de out. de 2012
Respostas 5
Participantes 3