[Resolvido]JTable zebrada errado

7 respostas
Resplandes

Olá amigos sei que é um assunto já falado a muito tempo sobre JTable zebrada mas a questão é que eu estou usando o Projeto Towel como TableModel
e ao invocar a classe para deixar a JTable Zebrada ela fica da seguinte forma

Codigo do TableCellRenderer
import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

    public class MeuRenderer implements TableCellRenderer {  
      
      public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();  
      
      public Component getTableCellRendererComponent(JTable table, Object value,  
          boolean isSelected, boolean hasFocus, int row, int column) {  
      
        Component renderer = DEFAULT_RENDERER.getTableCellRendererComponent(  
            table, value, isSelected, hasFocus, row, column);  
      
        ((JLabel) renderer).setOpaque(true);  
      
        Color foreground, background;  
      
          if (row % 2 == 0) {  
            foreground = Color.BLACK;  
            background = Color.white;  
      
          } else {  
            foreground = Color.BLACK;  
            background = Color.lightGray;  
      
          }  
      
        renderer.setForeground(foreground);  
        renderer.setBackground(background);  
        return renderer;  
      
      }  
    }
Código da JTable
final JTable table = new JTable();
		table.setShowGrid(false);  
		table.setAutoResizeMode(table.AUTO_RESIZE_OFF);
//
//		Resizer expandir = new Resizer();
//		expandir.fitAllColumns(table);
//		final TableFilter filtro = new TableFilter(
//				table.getTableHeader(), tableModel);
		table.setModel(tableModel);
		table.getColumnModel().getColumn(0).setPreferredWidth(50);
		table.getColumnModel().getColumn(1).setPreferredWidth(100);
		table.getColumnModel().getColumn(2).setPreferredWidth(50);
		table.getColumnModel().getColumn(3).setPreferredWidth(250);

		TableCellRenderer renderer = new MeuRenderer();
        table.setDefaultRenderer(Object.class, renderer);

gostaria que ela ficasse toda zebrabrada e quando eu clicar na linha ela deixe a mesma diferente para saber que essa e a linha selecionada..
agradeço desde de já os amigos...
imagem da JTable
[img]http://www.kernelautomacao.com/JTable.png[/img]

7 Respostas

ViniGodoy

Você não está tratando a cor do foreground quando o hasFocus (que indica que a linha tem o foco) for true.

import java.awt.Color;
import java.awt.Component;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellRenderer;

    public class MeuRenderer implements TableCellRenderer {  
      
      public static final DefaultTableCellRenderer DEFAULT_RENDERER = new DefaultTableCellRenderer();  
      
      public Component getTableCellRendererComponent(JTable table, Object value,  
          boolean isSelected, boolean hasFocus, int row, int column) {  
      
        Component renderer = DEFAULT_RENDERER.getTableCellRendererComponent(  
            table, value, isSelected, hasFocus, row, column);  
      
        ((JLabel) renderer).setOpaque(true);  
      
        Color foreground, background;  
      
          if (hasFocus) {
            foreground = Color.white;  
            background = Color.BLUE.darker();  
          } else if (row % 2 == 0) {  
            foreground = Color.BLACK;  
            background = Color.white;  
      
          } else {  
            foreground = Color.BLACK;  
            background = Color.lightGray;  
      
          }  
      
        renderer.setForeground(foreground);  
        renderer.setBackground(background);  
        return renderer;  
      
      }  
    }
Resplandes

Amigo ViniGodoy eu testei aqui e o resultado é
mas ai quando seleciono na coluna código esse é o resultado

depois ao seleciona outra coluna o resultado é

como faço para ficar uma seleção completa na JTable e a coluna código ficar zebrada também, esse problema é que esta me quebrando a cabeça…

ViniGodoy

Provavelmente a coluna não está definida como Object.class e sim como Integer.class.

Resplandes

Sim mas ai se eu colocar ela como Interger.class so ela fica zebrada…

ViniGodoy

Chame o método 2 vezes, um com Object.class e outra com Integer.class.

Resplandes

Perfeito ViniGodoy, não abusando da sua boa fé, a seleção da linha completa resume-se em

/*Aqui defino selecionar uma unica linha por vez*/
table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);

como faço para ele selecionar toda a linha e não so uma coluna como mostra abaixo ?

Resplandes
Resolvido amigo, segue o código com sua implementação
import java.awt.Color;
import java.awt.Component;
import javax.swing.JTable;
import javax.swing.table.DefaultTableCellRenderer;

public class MeuRenderer extends DefaultTableCellRenderer {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	/*Variaveis com as cores..*/
	private Color whiteColor = new Color(254, 254, 254);
	private Color alternateColor = new Color(204, 204, 204);
	private Color selectedColor = new Color(61, 128, 223);

	@Override
	public Component getTableCellRendererComponent(JTable table, Object value,boolean selecionado, boolean hasFocus, int row, int column) {

		super.getTableCellRendererComponent(table, value, selecionado, hasFocus,row, column);

		/*Cor de fundo*/
		Color bg;
		/*Quando selecionado a linha seta as cores */
		if (hasFocus) {
			bg = selectedColor;
			setBackground(bg);
			setForeground(selecionado ? Color.white : Color.black);
		}
		/*Quando não selecionado e o resultado do valor = 0, a linha seta as cores */
		else if (!selecionado){		
			bg = (row % 2 == 0 ? alternateColor : whiteColor);
		/*Quando não selecionado e o resultado do valor = 0, a linha seta as cores */
		}else{
		bg = selectedColor;
		setBackground(bg);
		setForeground(selecionado ? Color.white : Color.black);
		}
		

		/*
		 * if (value instanceof ImageIcon) { setIcon((ImageIcon) value);
		 * setText(""); } else setIcon(null);
		 */
		
		
		/*Retorna o objeto*/
		return this;
		
		/*Setando os valores na JTable
		 * 
		 * Cria a instancia da classe
		TableCellRenderer renderer = new MeuRenderer();
		
		Seta o valor nas colunas Interger.class
        table.setDefaultRenderer(Integer.class, renderer);
        
        Seta o valor nas colunas Object.class
        table.setDefaultRenderer(Object.class, renderer);
		 * 
		 * */
	}
}

post que ajudou tbm
[url]http://www.guj.com.br/java/124963-jtable-dinamica/3[/url]

resultado
[img]http://www.kernelautomacao.com/selecionado.png[/img]

Criado 4 de junho de 2013
Ultima resposta 5 de jun. de 2013
Respostas 7
Participantes 2