Ajuda com Jtable e thread

9 respostas
JavaKaiser

[size=15]E ai galera,

to com um problemao ja tem alguns dias e nao sei mais o que fazer…

criei uma tabela e ela precisa ser atualizada constantemente…
dai caçando informação aqui no forum, vi alguns posts que diziam que a melhor saida era fazer uma thread para atualizar a tabela…
criei a thread, e…ela simplesmente nao atualiza…
pior que via debug ela atualiza…

alguem tem uma idéia o porque ou o que eu posso fazer?[/size]

9 Respostas

B

A cada atualização invoke o updateUI da tabela.

JavaKaiser

ok…
vou testar e coloco o resultado
vlw

ViniGodoy

Faltou dizer:

  1. Como você está fazendo a atualização? É através do model?
  2. Seu model é o lixo do DefaultTableModel ou você criou um model próprio?
  3. Pode postar o código da classe de sua Thread extra aqui?
  4. Se criou um model próprio, pode posta-lo também?

Geralmente não é necessário chamar um método como UpdateUI. O model dispara um evento para a JTable que quando o recebe se pinta sozinha.

JavaKaiser
é....testei fazer uns testes com o updateUI ..mas tb nao funcionou... aqui ta postado a classe que cria minha tabela e a que chama tb.... se alguem puder dar uma ajuda agradeço........
package br.com.platina.visual;

import br.com.platina.factory.*;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.ScrollPaneConstants;
import javax.swing.text.PlainView;
import javax.swing.text.StyledEditorKit.BoldAction;

import com.sun.org.apache.xerces.internal.impl.RevalidationHandler;
import ch.randelshofer.quaqua.QuaquaLookAndFeel;
import ch.randelshofer.quaqua.QuaquaManager;
import ch.randelshofer.quaqua.subset.Quaqua14ColorChooserLAF;

import com.birosoft.liquid.LiquidLookAndFeel;

public class PlatinaViewer extends JFrame implements Runnable {
	static JTable jtable = new JTable();
	static CanalEmUso canalEmUso;
	static LoadLibraryboard libraryboard = new LoadLibraryboard();
	String EntradaSaida = "";
	int canais;
	private JTable tabela = null;
	private JScrollPane scrollTabela = null;

	/**
	 * 
	 * Inicializa a classe
	 * 
	 * 
	 * 
	 */

	public PlatinaViewer() {

		// Cria o titulo do frame

		super("Platina Server");

		super.update(getGraphics());
		// Inicia a placa
		JOptionPane.showMessageDialog(null, libraryboard.IniciaPlaca(
				"C://Shcti//ShConfig.ini", "C://Shcti//ShIndex.ini"));

		// Configura a posicao
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		setBounds(300, 150, screenSize.width = 400, screenSize.height = 413);

		// Adiciona o JScrollPane que contem a JTable
		getContentPane().add(getScrollTabela(), BorderLayout.CENTER);
		// Mostra o formulario na tela

		// Tela Fixa true = tamanho alteravel ou false = tamanho fixo
		setResizable(false);
		setDefaultCloseOperation(this.EXIT_ON_CLOSE);
		setVisible(true);
	}

	public void run() {

		getScrollTabela();
		createJTable();
		Thread thread = new Thread(PlatinaViewer.this);
		thread.start();

	}

	/**
	 * Cria o scroll onde irá conter a jtable
	 */
	private JScrollPane getScrollTabela() {
		if (scrollTabela == null) {
			scrollTabela = new JScrollPane(createJTable());
			scrollTabela
					.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

		}
		if (scrollTabela != null) {
			scrollTabela = new JScrollPane(createJTable());
			scrollTabela
					.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

		}

		return scrollTabela;

	}

	/**
	 * Cria a JTable
	 */
	public JTable createJTable() {

		ArrayList dados = new ArrayList();
		// Cria os Headers
		String[] colunas = new String[] { "Canais", "Status" };
		// edicao de texto true = escrita disponivel false = nao disponivel
		boolean[] edicao = { false, false };
		// Conta o numero de Canais
		System.out.println("sdaaaaaaaaaa");
		for (canais = 0; canais < libraryboard.GetMaxchannel(); canais++) {
			// Pega o Status
			dados.add(new String[] { "" + canais,
					libraryboard.ShowStatePlatina(canais) });

			if (libraryboard.ShowStatePlatina(canais) == "Canal Livre") {
				EntradaSaida = "";
				libraryboard.StopRecToFile(canais);
			}

			if (libraryboard.ShowStatePlatina(canais) == "Tocando") {
				EntradaSaida = "Interna";
			}
			if (canalEmUso != null) {
				if (canalEmUso.getName() != "Thread :" + canais
						& canalEmUso.isAlive() == false
						& libraryboard.ShowStatePlatina(canais) == "Canal em Uso") {
					System.out
							.println("Thread Criadaaaa");
					if (EntradaSaida == "") {
						EntradaSaida = "Externa";
					}
					Thread threadAtendimento = new Thread(canalEmUso);
					threadAtendimento.start();
					new CanalEmUso("Thread :" + canais).run(canais,
							EntradaSaida);

				}
			} else if (libraryboard.ShowStatePlatina(canais) == "Canal em Uso") {
				System.out
						.println("Thread criada com canal nulo");
				if (EntradaSaida == "") {
					EntradaSaida = "Externa";
				}
				Thread threadAtendimento = new Thread(canalEmUso);
				threadAtendimento.start();
				new CanalEmUso("Thread :" + canais).run(canais, EntradaSaida);

			}

		}

		// insere os atributos pedidos pelo construtor
		TabelaPlatina modelo = new TabelaPlatina(dados, colunas, edicao);

		jtable = new JTable(modelo);

		return jtable;

	}

}

e a classe da tabela é a seguinte....
tentei seguir o tutorial aqui do guj...ela aparece legal..só nao atualiza...

package br.com.platina.visual;

import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.BorderFactory;
import javax.swing.JTable;
import javax.swing.RepaintManager;
import javax.swing.table.AbstractTableModel;

import sun.awt.RepaintArea;

public class TabelaPlatina extends AbstractTableModel {

	private ArrayList linhas = null;
	private String[] colunas = null;
	// Edicao de colunas true = insere texto false nao insere os dados
	private boolean[] colsEdicao;

	/**
	 * Contrutor Da classe Platina, recebe-la os dados a serem exibidos e as
	 * colunas que devem ser criadas da Platina Viewer.
	 */
	public TabelaPlatina(ArrayList dados, String[] colunas, boolean[] edicao) {
		setLinhas(dados);
		setColunas(colunas);
		colsEdicao = edicao;
	}


	/**
	 * Retorna o numero de colunas no modelo
	 */
	public int getColumnCount() {

		return getColunas().length;

	}

	/**
	 * Retorna o numero de linhas existentes no modelo
	 */
	public int getRowCount() {
		return getLinhas().size();
	}

	/**
	 * Obtem o valor na linha e coluna
	 */
	public Object getValueAt(int rowIndex, int columnIndex) {
		String[] linha = (String[]) getLinhas().get(rowIndex);
		// Retorna o objeto que esta na coluna
		return linha[columnIndex];
	}

	public String[] getColunas() {
		return colunas;
	}

	public ArrayList getLinhas() {
		return linhas;
	}

	public void setColunas(String[] strings) {
		colunas = strings;

	}

	public void setLinhas(ArrayList list) {
		linhas = list;

	}

	/**
	 * Seta o valor na linha e coluna
	 * 
	 * @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int)
	 */
	public void setValueAt(Object value, int row, int col) {
		String[] linha = (String[]) getLinhas().get(row);
		// Altera o conteudo no indice da coluna passado
		linha[col] = (String) value;
		// dispara o evento de celula alterada
		fireTableCellUpdated(row, col);

	}

	/**
	 * Retorna se a celula pode ser editada
	 * 
	 * @see javax.swing.table.TableModel#isCellEditable(int, int)
	 */
	public boolean isCellEditable(int row, int col) {
		return colsEdicao[col];
	}

	/**
	 * Adiciona o array na linha
	 */
	public void addRow(String[] dadosLinha) {
		getLinhas().add(dadosLinha);
		// Informa a jtable de que houve linhas incluidas no modelo
		// COmo adicionamos no final, pegamos o tamanho total do modelo
		// menos 1 para obter a linha incluida.
		int linha = getLinhas().size() - 1;
		fireTableStructureChanged();
		
		fireTableCellUpdated(linha, linha);
		
		return;
	}

	/**
	 * Remove a linha pelo indice informado
	 * 
	 * @param row
	 */
	public void removeRow(int row) {
		getLinhas().remove(row-1);
		// informa a jtable que houve dados deletados passando a
		// linha reovida
		fireTableRowsDeleted(row, row);

	}
	

	/**
	 * Remove a linha pelo valor da coluna informada
	 */
	public boolean removeRow(String val, int col) {
		// obtem o iterator
		Iterator i = getLinhas().iterator();
		int linha = 0;
		// Faz um looping em cima das linhas
		while (i.hasNext()) {
			// Obtem as colunas da linha atual
			String[] linhaCorrente = (String[]) i.next();
			linha++;
			
			// compara o conteudo String da linha atual na coluna desejada
			// com o valor informado
			if (linhaCorrente[col].equals(val)) {
				getLinhas().remove(linha);
				// informa a jtable que houve dados deletados passando a
				// linha removida
				System.out.println("remove row");
				fireTableRowsDeleted(linha, linha);
				return true;
			}
		}
		// Nao encontrou nada
		return false;
	}

	/**
	 * Retorna o nome da coluna.
	 */
	public String getColumnName(int col) {
		return getColunas()[col];
	}

}

se alguem puder me dar umas dicas de como fazer desde já agradeço....

JavaKaiser

alguem tem alguma idéia?

Cabazzo

JavaKaiser,

Tu podes fazer o seguinte:

Cria um temporizador:

javax.swing.Timer temporizador = new Timer(10000, new ActionListener()
            {  // 1000 = 1 segundo
               public void actionPerformed(ActionEvent e){
                   DefaultTableModel dtm = (DefaultTableModel) jtable.getModel();
                   dtm.setNumRows(0);                   
                   metodoParaAtualizarTabela();                   
               }
            });
            temporizador.setCoalesce(true);
            temporizador.start();

Neste caso ele vai rodar a cada 10 segundos
É uma idéia.

Fernando_Generoso_da

Eu não sei, mas em vez de utilizar fireTableCellUpdated(linha, linha), utilize sempre fireTableDataChanged()…ve se muda alguma coisa…

outra coisa…isso só vai funcioanr quando houver mudanças no model…Não sei se é isso que vc precisa

JavaKaiser

ok…
vou tentar entao dos dois jeitos…
Cabazzo…
nunca utilizei este timer, mas pelo que vc citou de exemplo parece que ele pode funcionar…

Fernando
e é isso mesmo que eu preciso…
pq eu preciso mostrar sempre que tem uma mudança de valor…

entao vou testar depois eu posto o resultado…

vlw até aqui galera

JavaKaiser

tentei criar o temporizador mas nao deu certo,

ele até executou em paralelo, mas ele nao atualizou a tabela mesmo assim…
ja tentei fazer algumas modificaçoes mas mesmo assim ele nao atualiza…

alguem tem idéia do pq?

precisa utilizar alguma parte envolvendo algum renderer da tabela??

Criado 18 de julho de 2008
Ultima resposta 21 de jul. de 2008
Respostas 9
Participantes 5