Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #57 da revista programar. Faz já o download aqui!

amiloM1425

JTable - Cor de linha seleccionada

Mensagens Recomendadas

amiloM1425    0
amiloM1425

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Knitter    101
Knitter

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
amiloM1425    0
amiloM1425

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Knitter    101
Knitter

+/-, 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.

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
amiloM1425    0
amiloM1425

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

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites
Knitter    101
Knitter

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.

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


×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade