Colocar cor na na linha da tabela

32 respostas
A

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

V

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.

A

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

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

Vinicius tem como vc me da uma ajuda

V

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?

A

Eu preciso de uma ou mais linha fique vermelha.

V

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

V

Ah sim, e quando essa linha vai ficar vermelha?

A

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.

V

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

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

A

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

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

Pq em momento nenhum mando imprimir um Color.

A

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

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

Estar saindo assim


V

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?

V

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.

V

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.

A
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 "";
V

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.

A

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

A

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.

V

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).

A

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

A
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+.
V

hehehehe, é muito detalhezinho mesmo.

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

A

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.

A

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