• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

amiloM1425

JTable - Cor de linha seleccionada

6 mensagens neste tópico

Olá a todos,

o problema é o seguinte, numa JTable tenho de mudar a cor da linha para vermelho caso uma das colunas tenha o valor "Não". Após o utilizador fazer o que tem a fazer para que o valor fique "Sim" a cor da linha passa a branco, até aqui tudo bem, no entanto quando a linha é seleccionada a cor da desta mantém-se a branco em vez do típico azul e as letras também ficam brancas (que é cor com que ficam quando se selecciona uma linha com fundo vermelho) .

Já descobri que o problema vem do código seguinte (que é o código que faz a mudança de cor) mas não percebo porquê nem como posso resolver o problema.

		if (tableLoadedFiles == null) {
		tableLoadedFiles = new JTable(tableModelFiles)
		{
			/*
			 * Muda a cor da linha para vermelho caso a 3ª coluna contenha o valor Não
			 */
			static final long serialVersionUID = 3L;
	                public Component prepareRenderer(TableCellRenderer renderer,int rowIndex, int vColIndex) {
	        	Component c = super.prepareRenderer(renderer, rowIndex, vColIndex);
	        	if (tableLoadedFiles.getValueAt(rowIndex,2).toString().compareTo("Não") == 0) {
	        		c.setBackground(Color.RED);
	        	} else {
	        		c.setBackground(Color.WHITE);
	        	}
	        	return c;
	        }
		};

Agradeço desde já a vossa ajuda

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não faria bem isso dessa forma, creio que teria sido menos problemático teres criado os teus renderes.

Mas, pelo que vejo nesse código, estás a sobrepor o código normal de desenho da célula, obrigando a que o fundo seja vermelho, caso o conteúdo seja "Não", e que seja branco, em qualquer situação em que não tenha a palavra "Não", ora quando seleccionas a célula, o Swing tenta pintar de azul o que está seleccionado, mas tu não sobrepões com o branco devido à condição que tens no if ser limitada.

Como apenas alteras a cor de fundo e não a cor do texto seleccionado, tens o efeito das letras brancas.

Podes tentar resolver isso acrescentando ao else uma condição em que verifiques se a linha está seleccionada, tens um método para isso na JTable, e assim podes evitar pintar de branco quando tens a linha seleccionada e nessa linha a coluna não tem o texto "Não".

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Com o else resolvi parte do problema, isto é, quando selecciono apenas uma linha esta fica com a cor azul, no entanto se seleccionar mais do que uma as outras mantém-se à mesma brancas.

Talvez não esteja a utilizar o método correcto para verificar se a linha está seleccionada, estou a fazer assim:

                     if (tableLoadedFiles.getValueAt(rowIndex,2).toString().compareTo("Não") == 0) {
	        		c.setBackground(Color.RED);
	        	} 
	        	else 
	        	{
	        		if(tableLoadedFiles.getSelectedRow() == rowIndex)
	        			c.setBackground(new Color(50,100,250));
	        		else
	        			c.setBackground(Color.WHITE);
	        	}

Era +/- assim que estavas a sugerir fazer?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

+/-, em vez do getSelectedRow, tens o getSelectedRows :P, aí já sabes quais as linhas que estão seleccionadas.

Julgo que será a forma mais simples de resolver o problema, sem mudar mais do código, verificas as linhas seleccionadas e mudas a cor para a mesma cor de selecção.

Não me estou a lembrar agora e não tenho possibilidade de confirmar, mas creio que existe uma propriedade no look-and-feel que te diz qual a cor da selecção definida pelo L&F e pelo OS, em vez de colocares o azul usando RGB podias tentar usar a propriedade para obter o valor. Mas isso pode não ser importante para o que estás a fazer e não me lembro como raio se chama a propriedade.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Desculpa estar a chatear tanto com este problema.

Já alterei o código e ficou assim:

[code
]if (tableLoadedFiles.getValueAt(rowIndex,2).toString().compareTo("Não") == 0) {
	c.setBackground(Color.RED);
} 
else 
{
int[] selectedRows = tableLoadedFiles.getSelectedRows();
for (int i = 0; i < selectedRows.length; i++) {
     		if(selectedRows[i] == rowIndex)
      			c.setBackground(new Color(50,100,250));
      		else
      			c.setBackground(Color.WHITE);							
        }
}

No entanto continua a deixar as restantes linhas em branco quando selecciono mais do que uma  :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, precisava testar isso mas neste momento não vou conseguir, o patrão não vai achar piada a eu estar a trabalhar noutras coisas  que não façam parte das minhas tarefas :P

Mas a minha ideia passa pelo código que estás a fazer.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora