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.
Colocar cor na na linha da tabela
32 Respostas
não sei nem fazer a tabela… imagina a cor
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.
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
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;
}
}
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;
}
}
Vinicius tem como vc me da uma ajuda
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?
Eu preciso de uma ou mais linha fique vermelha.
Ah, outra coisa. A palavra faço não é com ss.
Ah sim, e quando essa linha vai ficar vermelha?
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.
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<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:
return bolsa.getAlarme() <= 50 ? "!" : "";
case 1:
return bolsas.getNumeroBolsa();
case 2:
return bolsas.getTipoBolsa();
case 3:
return bolsas.getDataVencimento();
}
return "";
}
public DadosDasBolsas get(int row) {
return bolsas.get(row);
}
@Override
public Class<?> 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() <= 50 ? Color.RED : Color.WHITE);
return this;
}
}
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;
}
Eu fiz como que vc passou mas continua do mesmo jeito saindo, “java.awt.Color[r=255,g=200,b=0]”,
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);
}
Você fez exatamente como indiquei? Nas três classes??
Pq em momento nenhum mando imprimir um Color.
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;
}
}
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;
}
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?
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.
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.
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 "";
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()<= 50 ? "Alerta" : "Normal";
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.
Ja mudei sem sucesso, tudo que vc orientou eu fiz e nada, onde eu to errando, tem tres dias tentando resulver isso sem sucesso!!
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.
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).
Vinicius Cara!! vc salvou minha vida!! cara se vc tivesse aqui e juro que ti dava um beijo.
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;
}
}
hehehehe, é muito detalhezinho mesmo.
Pelo menos você não usa o DefaultTableModel.
Se usasse, seria mil vezes mais difícil resolver o problema.
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.
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<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><AdministradoresGET> usuarios;
public UsuarioTableModel() {
usuarios = new ArrayList<AdministradoresGET>();
}
public UsuarioTableModel(List<AdministradoresGET> lista) {
this();
usuarios.addAll(lista);
}
public Class<?> 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<AdministradoresGET> 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);
}
}
