Colocar cor na na linha da tabela

32 respostas
akiles

Pessoal bom dia!!
Alguem pode me ajudar, preciso colocar cor na linha da minha tabela mas estar aparecendo, dessa forma “java.awt.Color[r=255,g=200,b=0]”, eu preciso que sai a cor, alquem sabe onde estar o meu erro.

32 Respostas

D

não sei nem fazer a tabela… imagina a cor

ViniGodoy

O erro está em supor que a classe Color tem o toString() que você espera.
Ele imprime a cor certinho, nesse caso, 255 no componente vermelho, 200 no verde e 0 no azul.

Como você pretende imprimir a cor?

Se for no formato dos três componentes em hexa, como o HTML faz, faça o seguinte:

public String colorToHexa(Color color) { return String.format("%02x%02x%02x", color.getRed(), color.getGreen(), color.getBlue()); }

Se quiser pintar o fundo da célula com a cor em questão, você precisará criar um CellRenderer personalizado.

akiles

Bom dia Vinicius!!
Fazendo dessa forma esta dano erro
Exception in thread “AWT-EventQueue-0” java.lang.NullPointerException
eu tenho CellRenderer em uma class separada como fasso para colocar na linha

akiles
E essa
public class ColorRenderer extends JLabel implements TableCellRenderer {
	Border unselectedBorder = null;
	Border selectedBorder = null;
	boolean isBordered = true;

	public ColorRenderer(boolean isBordered) {
		this.isBordered = isBordered;
		setOpaque(true); 
	}

	public Component getTableCellRendererComponent(
			JTable table, Object color,boolean isSelected, boolean hasFocus,int row, int column) {
		Color newColor = (Color)color;
		setBackground(newColor);
		DadosDasBolsas bolsas = new DadosDasBolsas();
		long cont = bolsas.getAlarme();
		if (isBordered) {
			if (isSelected) {
				if (cont <= 50) {
					setBackground(newColor.black);
				}
			} else {
				setBackground(newColor.black);
			}
		}

//		setToolTipText("RGB value: " + newColor.getRed() + ", "
//				+ newColor.getGreen() + ", "
//				+ newColor.getBlue());
		return this;
	}
}
akiles
Como fasso para o montar minha tabela receber.
public class MostraTabalaCompleta extends AbstractTableModel {
	CustomTableCellRenderer cor = new CustomTableCellRenderer();
	private static final int COLUNASTATUS = 0;
	private static final int COLUNANUMERO = 1;
	private static final char COLUNATIPODEBOLSA = 2;
	private static final char COLUNADATAVENCIMENTO = 3;

	private  List<DadosDasBolsas> bolsa;
	public MostraTabalaCompleta(List<DadosDasBolsas> bolsa){
		this.bolsa = bolsa;
	}
	@Override
	public int getColumnCount() {
		return 3;
	}

	@Override
	public int getRowCount() {
		return bolsa.size();
	}
	@Override
	public String getColumnName(int column){
		if(column == COLUNASTATUS)return "STATUS";
		if(column == COLUNANUMERO) return "NUMERO DA BOLSA";
		if(column == COLUNATIPODEBOLSA) return "TIPO DE SANGUINEO";
		if(column == COLUNADATAVENCIMENTO) return "DATA DE VENCIMENTO";

		return "";
	}
	@Override
	public Object getValueAt(int row, int column) {
		DadosDasBolsas bolsas = bolsa.get(row);
		Color color = null;   
        
		long cont = bolsas.getAlarme();
		switch (column){
		case 0:
			if (cont <= 50) 
				return String.format("%02x%02x%02x", color.getRed(), color.getGreen(), color.getBlue());   
			
			return"";
		case 1:
			return bolsas.getNumeroBolsa();
		case 2:
			return bolsas.getTipoBolsa();
		case 3:
			return bolsas.getDataVencimento();

		}
		return "";
	}
	private Color fancyFromString(String string) {
		// TODO Auto-generated method stub
		return null;
	}
	private Color shabbyFromString(String string) {
		// TODO Auto-generated method stub
		return null;
	}
}
akiles

Vinicius tem como vc me da uma ajuda

ViniGodoy

Calma cara, não fico de 2 em 2 minutos atualizando seu tópico.

Primeiro de tudo, diga, como você quer que a cor seja exibida na sua tabela?

akiles

Eu preciso de uma ou mais linha fique vermelha.

ViniGodoy

Ah, outra coisa. A palavra faço não é com ss.

ViniGodoy

Ah sim, e quando essa linha vai ficar vermelha?

akiles

Quando cont for <= 50
o cont ele pega a tada atual e subtrai por uma data de vencimento, o cont estar retornando um numero Long.

ViniGodoy

Como vai ficar seu TableModel:

public class MostraTabelaCompleta extends AbstractTableModel {
	CustomTableCellRenderer cor = new CustomTableCellRenderer();
	private static final int COLUNASTATUS = 0;
	private static final int COLUNANUMERO = 1;
	private static final char COLUNATIPODEBOLSA = 2;
	private static final char COLUNADATAVENCIMENTO = 3;

	private  List&lt;DadosDasBolsas&gt; bolsa;
	public MostraTabalaCompleta(List&lt;DadosDasBolsas&gt; bolsa){
		this.bolsa = bolsa;
	}
	@Override
	public int getColumnCount() {
		return 3;
	}

	@Override
	public int getRowCount() {
		return bolsa.size();
	}
	@Override
	public String getColumnName(int column){
		if(column == COLUNASTATUS)return &quot;STATUS&quot;;
		if(column == COLUNANUMERO) return &quot;NUMERO DA BOLSA&quot;;
		if(column == COLUNATIPODEBOLSA) return &quot;TIPO DE SANGUINEO&quot;;
		if(column == COLUNADATAVENCIMENTO) return &quot;DATA DE VENCIMENTO&quot;;

		return &quot;&quot;;
	}
	@Override
	public Object getValueAt(int row, int column) {
		DadosDasBolsas bolsas = bolsa.get(row);
		Color color = null;   
        
		long cont = bolsas.getAlarme();
		switch (column){
                case 0:
                        return bolsa.getAlarme() &lt;= 50 ? &quot;!&quot; : &quot;&quot;;
		case 1:
			return bolsas.getNumeroBolsa();
		case 2:
			return bolsas.getTipoBolsa();
		case 3:
			return bolsas.getDataVencimento();
		}
		return &quot;&quot;;
	}

        public DadosDasBolsas get(int row) {
            return bolsas.get(row);
        }

	@Override
	public Class&lt;?&gt; getColumnClass(int col) {
		return col == 0 ? Color.class : Object.class;
	}
}

Aí vc tem que configurar seu JTable para usar seu Renderer com a classe Color:

seuTable.setDefaultRenderer(Color.class, new ColorRenderer());

Ajuste também seu color renderer:

public class ColorRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
	public Component getTableCellRendererComponent(
			JTable table, Object color,boolean isSelected, boolean hasFocus,int row, int column) {
                super.getTableCellRendererComponent(table, color, isSelected, hasFocus, row, column);
                DadosDasBolsas bolsa =((MostraTabelaCompleta)table.getModel()).get(row);
                setBackGround(bolsa.getAlarme() &lt;= 50 ? Color.RED : Color.WHITE);
                return this;
	}
}
akiles
seguindo a sua ajoda o meu renderer estar reclamando o que poe ser.
public class ColorRenderer extends JLabel implements TableCellRenderer {

	boolean isBordered = true;
	public ColorRenderer(boolean isBordered) {
		this.isBordered = isBordered;
		setOpaque(true); 
	}

	public Component getTableCellRendererComponent(
			JTable table, Object color,boolean isSelected, boolean hasFocus,int row, int column) {
		[u]super.getTableCellRendererComponent([/u]table, color, isSelected, hasFocus, row, column);
		DadosDasBolsas bolsa =((MostraTabalaCompleta)table.getModel()).[u]get(row);   [/u]
        setBackground(bolsa.getAlarme() <= 50 ? Color.RED : Color.WHITE);   

        //		setToolTipText("RGB value: " + newColor.getRed() + ", "
//				+ newColor.getGreen() + ", "
//				+ newColor.getBlue());
		return this;
	}
akiles

Eu fiz como que vc passou mas continua do mesmo jeito saindo, “java.awt.Color[r=255,g=200,b=0]”,

akiles

Criando a tabela no frame

private void montarTabela(){

		JTable tabela = new JTable();

		tabela.setBorder(new LineBorder(Color.black));
		tabela.setGridColor(Color.black);
		tabela.setShowGrid(true);
		tabela.setOpaque(true);
		tabela.setPreferredScrollableViewportSize(new Dimension(750,540));
		tabela.setFillsViewportHeight(true);
		
		tabela.setDefaultRenderer(Color.class, new ColorRenderer());

		JScrollPane scroll = new JScrollPane(tabela);
		scroll.getViewport().setBorder(null);
		scroll.getViewport().add(tabela);
		scroll.setViewportView(tabela);
		scroll.setSize(900, 900);
		tabela.setVisible(true);
		scroll.setBounds(240, 0, 780, 550);
		
			painel3.add(scroll);
		
		List<DadosDasBolsas> bolsa = new DadosHemocomponentesBancoDAO().getLista(null);
		DadosHemocomponentesBancoDAO dao = new DadosHemocomponentesBancoDAO();
		DadosDasBolsas bolsass = new DadosDasBolsas();
		MostraTabalaCompleta mtc = new MostraTabalaCompleta(bolsa);
		dao.calculardata(bolsass);
		tabela.setModel(mtc);
	}
ViniGodoy

Você fez exatamente como indiquei? Nas três classes??

Pq em momento nenhum mando imprimir um Color.

akiles

Montando a tabela.

package br.com.sistemahemocomponentes.frames;

import java.awt.Color;
import java.awt.Component;
import java.util.List;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

import org.apache.struts2.interceptor.BackgroundProcess;

import freemarker.core.ReturnInstruction.Return;

import br.com.sistema.hemocomponentes.dados.cliente.DadosDasBolsas;
/**
 *
 * @author Aquiles
 */
public class MostraTabalaCompleta extends AbstractTableModel {
	CustomTableCellRenderer cor = new CustomTableCellRenderer();
	private static final int COLUNASTATUS = 0;
	private static final int COLUNANUMERO = 1;
	private static final char COLUNATIPODEBOLSA = 2;
	private static final char COLUNADATAVENCIMENTO = 3;

	private  List<DadosDasBolsas> bolsa;
	public MostraTabalaCompleta(List<DadosDasBolsas> bolsa){
		this.bolsa = bolsa;
	}
	@Override
	public int getColumnCount() {
		return 4;
	}

	@Override
	public int getRowCount() {
		return bolsa.size();
	}
	@Override
	public String getColumnName(int column){
		if(column == COLUNASTATUS)return "STATUS";
		if(column == COLUNANUMERO) return "NUMERO DA BOLSA";
		if(column == COLUNATIPODEBOLSA) return "TIPO DE SANGUINEO";
		if(column == COLUNADATAVENCIMENTO) return "DATA DE VENCIMENTO";

		return "";
	}
	@Override
	public Object getValueAt(int row, int column) {
		DadosDasBolsas bolsas = bolsa.get(row);
		Color color = null;   
        
		long cont = bolsas.getAlarme();
		switch (column){
		case 0:
			return bolsas.getAlarme()<= 50 ? color = Color.BLACK : "";
				
		case 1:
			return bolsas.getNumeroBolsa();
		case 2:
			return bolsas.getTipoBolsa();
		case 3:
			return bolsas.getDataVencimento();

		}
		return "";
	}
	private Color fancyFromString(String string) {
		// TODO Auto-generated method stub
		return null;
	}
	private Color shabbyFromString(String string) {
		// TODO Auto-generated method stub
		return null;
	}
	public DadosDasBolsas get(int row) {
		// TODO Auto-generated method stub
		return null;
	}
}
akiles

Esse e o ColorRenderer

public class ColorRenderer extends DefaultTableCellRenderer implements TableCellRenderer {
	
	boolean isBordered = true;

	public ColorRenderer() {
		this.isBordered = isBordered;
		setOpaque(true); 
	}

	public Component getTableCellRendererComponent(
			JTable table, Object color,boolean isSelected, boolean hasFocus,int row, int column) {
		super.getTableCellRendererComponent(table, color, isSelected, hasFocus, row, column);
		
		DadosDasBolsas bolsa =((MostraTabalaCompleta)table.getModel()).get(row);   
	    setBackground(bolsa.getAlarme() <= 50 ? Color.RED : Color.WHITE);   
	
	    //		setToolTipText("RGB value: " + newColor.getRed() + ", "
//				+ newColor.getGreen() + ", "
//				+ newColor.getBlue());
		return this;
	}
akiles

Estar saindo assim


ViniGodoy

Seu método get() do Model está errado. Ele deve retornar

public DadosDasBolsas get(int row) { return bolsas.get(row); }

Senão vai dar NullPointerException no seu Renderer.

E que erro está dando no seu Renderer?

ViniGodoy

Não faz sentido. Se você está usando as classes que passei, não existe em local nenhum o comando para a impressão do Color.

Tente fazer um Clean no seu projeto.

ViniGodoy

Ah, vc alterou o model. O case 0 não está igual ao que eu passei.
Ali você deve retonar o texto que você quer no status. Esse texto está exibindo o toString() do Color.BLACK.

Quem vai fazer a colorização é o Renderer.

akiles
Seguindo sua orientação bem aqui que mando imprir a cor
public Object getValueAt(int row, int column) {   
        DadosDasBolsas bolsas = bolsa.get(row);   
        Color color = null;     
           
        long cont = bolsas.getAlarme();   
        switch (column){   
        case 0:   
            return bolsas.getAlarme()<= 50 ? color = Color.BLACK : "";   
                   
        case 1:   
            return bolsas.getNumeroBolsa();   
        case 2:   
            return bolsas.getTipoBolsa();   
        case 3:   
            return bolsas.getDataVencimento();   
  
        }   
        return "";
ViniGodoy

Veja o model que passei. No case 0, não mando imprimir nenhum Color.

Me diz uma coisa, que texto você quer escrito na célula Status quando a cor for branca? E quando for vermelha? É isso que o case 0 deve retornar.

case 0: return bolsas.getAlarme()&lt;= 50 ? &quot;Alerta&quot; : &quot;Normal&quot;;

Você não deve retornar um Color aqui. Quem vai lidar com o Color é o Renderer. Aqui vc retorna o texto que vai escrito na célula.

akiles

Ja mudei sem sucesso, tudo que vc orientou eu fiz e nada, onde eu to errando, tem tres dias tentando resulver isso sem sucesso!!

akiles

O bolsas.getAlarme() ele estar retornando valores numericos long ai fasso o if se ele for menor ou igual a 50 colocar cor vermenha, se for maio que 50 fica sem cor.

ViniGodoy

Cadê o método getColumnClass no seu model? Veja o meu ali, eu inseri um método com esse nome.

@Override  
     public Class<?> getColumnClass(int col) {  
         return col == 0 ? Color.class : Object.class;  
     }

Se você não colocou o método, ainda não seguiu “toda” orientação que eu dei. É ele que vai dizer ao seu JTable que a coluna 0 tem a classe “Color”. A table então vai procurar um renderer para essa coluna, e vai ver que o Default para Color é o seu renderer (como vc definiu).

akiles

Vinicius Cara!! vc salvou minha vida!! cara se vc tivesse aqui e juro que ti dava um beijo.

akiles
Depois de muito encher as paciencias do Sr° Vinicius, ele conseguio resolver o problema, "Eu e que faço tudo errado" segue o correto.
package br.com.sistemahemocomponentes.frames;

import java.awt.Color;
import java.awt.Component;
import java.util.List;

import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

import org.apache.struts2.interceptor.BackgroundProcess;

import freemarker.core.ReturnInstruction.Return;

import br.com.sistema.hemocomponentes.dados.cliente.DadosDasBolsas;
/**
 *
 * @author Aquiles
 */
public class MostraTabalaCompleta extends AbstractTableModel {
	CustomTableCellRenderer cor = new CustomTableCellRenderer();
	private static final int COLUNASTATUS = 0;
	private static final int COLUNANUMERO = 1;
	private static final char COLUNATIPODEBOLSA = 2;
	private static final char COLUNADATAVENCIMENTO = 3;

	private  List<DadosDasBolsas> bolsa;
	public MostraTabalaCompleta(List<DadosDasBolsas> bolsa){
		this.bolsa = bolsa;
	}
	@Override
	public int getColumnCount() {
		return 4;
	}

	@Override
	public int getRowCount() {
		return bolsa.size();
	}
	public DadosDasBolsas get(int row) {
		return bolsa.get(row);
	}
	@Override
	public String getColumnName(int column){
		if(column == COLUNASTATUS)return "STATUS";
		if(column == COLUNANUMERO) return "NUMERO DA BOLSA";
		if(column == COLUNATIPODEBOLSA) return "TIPO DE SANGUINEO";
		if(column == COLUNADATAVENCIMENTO) return "DATA DE VENCIMENTO";

		return "";
	}
	@Override     
	public Class<?> getColumnClass(int col) {     
	     return col == 0 ? Color.class : Object.class;     
	}   
	@Override
	public Object getValueAt(int row, int column) {
		DadosDasBolsas bolsas = bolsa.get(row);
		Color color;   
        
		long cont = bolsas.getAlarme();
		switch (column){
		case 0:
			if(cont <= 50)
			return bolsas.getAlarme()<= 50 ? "!" : "";
			return"";
		case 1:
			return bolsas.getNumeroBolsa();
		case 2:
			return bolsas.getTipoBolsa();
		case 3:
			return bolsas.getDataVencimento();

		}
		return "";
	}
	private Color fancyFromString(String string) {
		// TODO Auto-generated method stub
		return null;
	}
	private Color shabbyFromString(String string) {
		// TODO Auto-generated method stub
		return null;
	}
}
Vinicius vc e D+.
ViniGodoy

hehehehe, é muito detalhezinho mesmo.

Pelo menos você não usa o DefaultTableModel.
Se usasse, seria mil vezes mais difícil resolver o problema.

akiles

Eu li muito do que vc escreveu,
http://www.pontov.com.br/site/index.php/java/48-java2d/121-o-loop-de-animacao
Valeu mesmo.

AssemblyXP

Vinny ou alguém, se puderem me ajudar. Estou com o mesmo problema, porém, meu caso é que tenho uma tabela de funcionarios ativos e inativos, quem for inativo pinta de vermelho. Só que no meu caso, está pintando a coluna inteira de vermelho.

segue abaixo:

criação da tabela

tabela = new JTable();
		tabela.setModel(modelo);
		scrollPane = new JScrollPane();
		scrollPane.setBackground(Color.red);
		scrollPane.setViewportView(tabela);
		tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		tabela.getTableHeader().setBackground(Color.LIGHT_GRAY);
		tabela.getTableHeader().setFont(new Font("Dialog", Font.BOLD, 12));
		
		try {
			modelo.adicionaLista(d.listarUsuarios(con));
		} catch (SQLException e1) {
			e1.printStackTrace();
		}
		for(int i=0; i&lt;modelo.getRowCount(); i++){
			if(modelo.getValueAt(i, 6).equals("Inativo")){
				tabela.setDefaultRenderer(Color.class, new ColorRenderer(modelo.getValueAt(i, 6)));
			}
		}

aqui o meu modelo de tabela:

package br.com.tableUsuario;

import java.awt.Color;
import java.util.ArrayList;
import java.util.List;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

public class UsuarioTableModel extends AbstractTableModel {

	private static final long serialVersionUID = 1L;

	private List&gt;&lt;AdministradoresGET&gt; usuarios;

	public UsuarioTableModel() {
		usuarios = new ArrayList&lt;AdministradoresGET&gt;();
	}

	public UsuarioTableModel(List&lt;AdministradoresGET&gt; lista) {
		this();
		usuarios.addAll(lista);
	}

	public Class&lt;?&gt; getColumnClass(int coluna) {
		return coluna == 6 ? Color.class : Object.class;
	}

	public int getColumnCount() {
		return 7;
	}

	public String getColumnName(int coluna) {

		switch (coluna) {
		case 0:
			return "Nome"; 
		case 1:
			return "Cpf"; 
		case 2:
			return "Rg"; 
		case 3:
			return "Cargo"; 
		case 4:
			return "Login";
		case 5:
			return "Senha";
		case 6:
			return "Status";
		default:
			return ""; 
		}
	}

	public int getRowCount() {
		return usuarios.size();
	}

	public Object getValueAt(int linha, int coluna) {
		AdministradoresGET c = usuarios.get(linha);

		switch (coluna) {
		case 0:
			return c.getNome(); 
		case 1:
			return c.getCpf(); 
		case 2:
			return c.getRg();
		case 3:
			return c.getCargo();
		case 4:
			return c.getLogin();
		case 5:
			return c.getSenha();
		case 6:
			return c.getStatus();
		default:
			return null; 
		}
	}

	public boolean isCellEditable(int rowIndex, int columnIndex) {
		return false;
	}

	public void setValueAt(Object valor, int linha, int coluna) {
		AdministradoresGET c = usuarios.get(linha);

		switch (coluna) {
		case 0:
			c.setNome(valor.toString()); 
			break;
		case 1:
			c.setCpf(valor.toString()); 
			break;
		case 2:
			c.setRg(valor.toString()); 
			break;
		case 3:
			c.setCargo(valor.toString()); 
			break;
		case 4:
			c.setLogin(valor.toString()); 
			break;
		case 5:
			c.setSenha(valor.toString()); 
			break;
		}
		fireTableDataChanged();
	}

	public void adiciona(AdministradoresGET c) {
		usuarios.add(c);
		fireTableRowsInserted(usuarios.size() - 1, usuarios.size() - 1);
	}

	public void remove(int indice) {
		usuarios.remove(indice);
		fireTableRowsDeleted(indice, indice);
	}

	public int getIndice(AdministradoresGET c) {
		return usuarios.indexOf(c);
	}
	public void adicionaLista(List&lt;AdministradoresGET&gt; lista) {
		int i = usuarios.size();
		usuarios.addAll(lista);
		fireTableRowsInserted(i, i + lista.size());
	}
	public void limpaLista() {
		int i = usuarios.size();
		usuarios.clear();
		fireTableRowsDeleted(0, i - 1);
	}

}
Criado 2 de setembro de 2010
Ultima resposta 14 de dez. de 2011
Respostas 32
Participantes 4