ColorRenderer deixando carregamento de jtable lento

4 respostas
zicky23

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
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;
   }
}

e chamo na table assim:

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

o que to fazendo de errado?

4 Respostas

ViniGodoy

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

zicky23

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

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;
    }
}

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?

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);
  }
}

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

ViniGodoy

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:

zicky23

ahhhh… blz…

vou testar…

obrigado!

Criado 15 de setembro de 2013
Ultima resposta 16 de set. de 2013
Respostas 4
Participantes 2