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

Sign in to follow this  
amiloM1425

JTable - Cor de linha seleccionada

Recommended Posts

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

Share this post


Link to post
Share on other sites
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".

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.