Colorir linha específica de uma JTable [Resolvido]

5 respostas
jorgefrancisco

Olá pessoal…

Sei que há vários tópicos aqui no GUJ e no google a respeito dessa dúvida, porém ainda não encontrei a solução para o meu problema… Tentei de tudo o que já foi dito no fórum e ainda nao consegui colorir uma linha específica da minha jtable…

O caso é o seguinte:

A cada inserção de linha na minha jtable eu gostaria de atribuir uma cor específica pra ela, por exemplo:

Depois do comando: modeloTabela.addRow(…) gostaria de setar uma cor para essa linha q foi inserida…

alguém tem alguma dica de como posso fazer isso? algum exemplo?

obrigado! =)

5 Respostas

pyro

Já tentou o setBackground(bg);?

jorgefrancisco

Pyro

Esse método pinta toda a minha jtable de uma mesma cor… eu preciso de algo que atribua uma cor para uma linha específica… algo mais ou menos assim:

tabela.setCorLinha(linha, cor)

Obrigado :wink:

abraços!

fabiofalci

Cara
Tu vai ter que trabalhar com o teu TableModel e o teu Renderer.
Ou coloca uma lista das cores por linha no tableModel e o Renderer pega dele.
Ou o proprio objeto que esta na linha sabe a cor dele, dai o teu tableModel pega de la.

Esse exemplo abaixo tem um Renderer com as cores fixas… é por ai

public class ColorTable {

	public static void main(String[] args) {
		JTable table = new JTable();
		table.setModel(new AbstractTableModel() {
			public int getColumnCount() {
				return 3;
			}

			public int getRowCount() {
				return 3;
			}

			public Object getValueAt(int rowIndex, int columnIndex) {
				return rowIndex + columnIndex;
			}
		});

		table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
			// lista de cores por linha, 3 linhas fixas
			Color[] colors = new Color[] { Color.CYAN, Color.ORANGE,
					Color.MAGENTA };

			public Component getTableCellRendererComponent(JTable table,
					Object value, boolean isSelected, boolean hasFocus,
					int row, int column) {
				super.getTableCellRendererComponent(table, value, isSelected,
						hasFocus, row, column);
				if (!isSelected) {
					setBackground(this.colors[row]);
				}
				return this;
			}
		});

		table.setSelectionBackground(Color.YELLOW);

		JPanel panel = new JPanel(new BorderLayout());
		panel.add(new JScrollPane(table), BorderLayout.CENTER);
		JFrame frame = new JFrame();
		frame.setContentPane(panel);
		frame.setSize(800, 600);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
jorgefrancisco

Olá pessoal…

Problema resolvido… =D… vou tentar explicar mais ou menos o que eu fiz:

Criei a classe abaixo que herda de DefaultTableCellRenderer. Essa classe pinta a célula de acordo com a linha e coluna que eu passar

public class ColorCellRenderer extends DefaultTableCellRenderer {
	
	private Color color;
	private int row = -1;
	
	public ColorCellRenderer(Color color, int row){  
		super();  
		this.color = color;  
		this.row = row;  
	}  

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

		if (! isSelected){  
			if (this.row == row) {
				cell.setBackground(color);
			} else {
				cell.setBackground(Color.WHITE);
			}
		}
		
		return cell;
	} 
}

A chamada dessa classe se dá da seguinte forma, onde k é contador do número de colunas da tabela.

for (int k = 0; k < minhaTabela.getColumnCount(); k++) {
	minhaTabela.getColumnModel().getColumn(k).setCellRenderer(new ColorCellRenderer(Color.GRAY, linhaQueDesejaPintar));
}

Bom, isso resolve meu problema… qualquer dúvida postem aqui que eu tento responder… obrigado a todos… :wink:

Abraços!

fabiofalci

É, funciona, mas assim tu está criando um objeto renderer para cada linha da tua table.
Numa table com 1000 linhas, tu vai ter 1000 renderes.

Tu pode criar um renderer somente e fazer ele gerenciar as linhas por cores. Parecido
com o meu exemplo anterior!

Criado 6 de fevereiro de 2008
Ultima resposta 7 de fev. de 2008
Respostas 5
Participantes 3