ColorRenderer deixando carregamento de jtable lento

Boa tarde, tenho um sistema que ao abrir uma tela carrega um jtable, mas qdo estou usando o ColorRenderer demora qse 30 segundos para aparecer os dados na table mesmo tendo apenas uma linha, já quando tiro fora esse ColorRenderer o carregamento fica super rápido, qse q estantâneo.

olha como está o meu ColorRenderer

[code]

package model;

import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

/**
*

  • @author wagner
    */
    public class ColorRenderer extends DefaultTableCellRenderer {

    //private NumberFormat formatter = NumberFormat.getCurrencyInstance();

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) {
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);

    table.setRowHeight(25);
    setFont(new java.awt.Font(“Calibri”, 0, 11 ));
    setBorder(getBorder());

    if(!isSelected){
    if(row %2 ==0 && row != 1){
    c.setBackground(new Color(250,250,250));
    c.setForeground(new Color(100,100,100));
    } else{
    c.setBackground(Color.WHITE);
    c.setForeground(new Color(100,100,100));
    }
    }else{
    c.setBackground(new Color(150,150,150));
    c.setForeground(new Color(0,0,0));
    }

    return c;
    }
    }[/code]

e chamo na table assim:

table.setDefaultRenderer(Object.class, new ColorRenderer());

o que to fazendo de errado?

Difícil dizer. Use um profiler, meça e depois nos diga:
http://visualvm.java.net/

Resolvi da sequinte forma abaixo refiz o ColorRenderer e nao ficou mais lento:

[code]package model;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.border.Border;
import javax.swing.table.TableCellRenderer;
import java.awt.Color;
import java.awt.Component;
import javax.swing.table.DefaultTableCellRenderer;

public class ColorRenderer extends DefaultTableCellRenderer {

@Override
public Component getTableCellRendererComponent(JTable table, Object value,
    boolean isSelected, boolean hasFocus, int row, int column) {
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    
    table.setRowHeight(25);
    if(!isSelected){
        if(row %2 ==0 && row != 1){
            c.setBackground(new Color(250,250,250));
            c.setForeground(new Color(100,100,100));
        }else{
            c.setBackground(Color.WHITE);
            c.setForeground(new Color(100,100,100));
        }
    }else{
        c.setBackground(new Color(150,150,150));
        c.setForeground(new Color(0,0,0));
    }
    return this;
}

}[/code]

mas mesmo assim qro usar um profiler para testar meus métodos, tem um método que inicia ao abrir o programa de um relógio normal que está deixando o uso do processador e memória elevado, tipo uns 350MB, se desativo ele, o sistema fica com uns 50MB apenas na mem ram…

o que pode ser?

esse é o meu médoto do relogio:

public void iniciaRelogio(){ new Thread(){ public void run(){ try{ while(true){ d = new Date(); status.setText("Hora: "+sdf.format(d)+" - Data: "+sdfd.format(d)); } }catch(Exception e){ } } }.start(); }

e me aproveitando dos teus conhecimentos como faço um log correto que me passe os erros qdo tiver com essa classe abaixo?

[code]package model;

import java.io.IOException;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
public class GeradorLog {
private static GeradorLog instancia = null;
private String nomeArquivo = “log.txt”;
private Level level = null;
private Logger logger = null;
FileHandler fh = null;
private GeradorLog(){
if (level == null)
level = Level.ALL;

logger = Logger.getLogger("GeradorLog");
try {
  fh = new FileHandler(nomeArquivo,true);
  SimpleFormatter formatter = new SimpleFormatter();
  fh.setFormatter(formatter);
  logger.setUseParentHandlers(true);
  logger.addHandler(fh);
  logger.setLevel(level);
} catch (SecurityException e) {
  e.printStackTrace();
} catch (IOException e) {
  e.printStackTrace();
}

}
public void setLevel(Level level){
instancia.logger.setLevel(level);
}
public synchronized static GeradorLog getInstance(){
if (instancia == null){
instancia = new GeradorLog();
}
return instancia;
}
public void log(Level level, String mensagem){
logger.log(level, mensagem);
}
}[/code]

desculpa tanta pergunta, mas realmente estou precisando resolver estes problemas e to pesquisando na net e nao acho nada.

Esse while true, sem nenhum sleep, é muito intenso. Vai fazer o sistema rodar o loop milhares de vezes por segundo. Se a precisão do seu relógio for o segundo, coloque um sleep:

public void iniciaRelogio(){ new Thread(new Runnable() { @Override public void run(){ try{ while(true){ //É importante atualizar objetos do Swing somente dentro da Thread do Swing EventQueue.invokeLater(new Runnable() { @Override public void run() { d = new Date(); status.setText("Hora: "+sdf.format(d)+" - Data: "+sdfd.format(d)); } }); Thread.sleep(200); //Dorme 200 milisegundos } }catch(Exception e){} }).start(); }

Uma maneira com menos código é usar o timer do Swing, veja:

ahhhh… blz…

vou testar…

obrigado!