Mudar cor da linha de uma tabela

Olá, gostaria de saber se há alguém que pode me orientar no seguinte: preciso mudar a cor da linha de uma tabela quando passo o mouse em cime da mesma.

1 curtida

que tipo de tabela?

Bom, estou utlizando um JTable…

Boa tarde a todos.

Para mudar a linha de um JTable, você precisa criar uma Classe Renderer que implemente a interface JTableCellRenderer, podendo estender (herdar) a classe JLabel, assim:

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

public class CellTableZebra extends JLabel implements TableCellRenderer {

    public CellTableZebra(){
        setOpaque(true);
    }

    @Override
    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
        // Quando a célula recebe o foco
        if (hasFocus){
            setBackground(Color.BLUE);
            setForeground(Color.WHITE);
        // Quando a linha é clicada
        } else if (isSelected){
            setBackground(Color.RED);
            setForeground(Color.YELLOW);
         // Para linhas pares colocar o fundo cinza e a cor da letra branca
        } else if ((row % 2)==0){
            setBackground(Color.GRAY);
            setForeground(Color.WHITE);
        } else {
            setBackground(Color.WHITE);
            setForeground(Color.BLACK);
        }
        /* Com o atributo value, que é o valor que retorna
            da célula, você pode modificar a cor da linha 
            de acordo com o seu valor também. */
        if (value==null){
            setText("");
        } else {
            setText(value.toString());
        }
        return this;
    }
}

Agora é só atribuir ao JTable assim:

JTable meujtable = new JTable();
meujtable.setDefaultRenderer(Object.class, new CellTableZebra());

Pronto.

Olá, sou eu de novo.

Me desculpe, porém só agora observei que você quer mudar a linha com o passar do mouse e neste caso, você terá que implementar mais classes, além do TableCellRender, então, vejamos.

package principal;

import java.awt.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.TableCellRenderer;

public class FramePrincipal extends JFrame {
    
    int linha, coluna;
    
    public static void main(String args[]){
        FramePrincipal frame = new FramePrincipal();
        frame.setVisible(true);
    }
    
    public FramePrincipal(){
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        // colunas da tabela
        String[] colunas = {"Cidade", "Estado", "Habitantes"};
		
        // conteúdo da tabela	
        Object[][] conteudo = {
            {"Goiânia", "GO", "43.023.432"},
            {"São Paulo", "SP", "5.343.234"},
            {"Rio de Janeiro", "RJ", "6.434.212"},
            {"Jussara", "GO", "87.454"},
            {"Barra do Garças", "MT", "64.344"}
        };    
        // constrói a tabela
        final JTable tabela = new JTable(conteudo, colunas);
        tabela.setPreferredScrollableViewportSize(new Dimension(350, 50));
        
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
	
        tabela.addMouseMotionListener(new CellListener());
    
        tabela.setDefaultRenderer(Object.class, new ColorirCelula());

			
        JScrollPane scrollPane = new JScrollPane(tabela);
        c.add(scrollPane);
    	
        setSize(400, 300);
    }
    
    class CellListener extends MouseMotionAdapter{
        @Override
        public void mouseMoved(MouseEvent e){
  	       JTable tb = (JTable)e.getSource();
               linha = tb.rowAtPoint(e.getPoint());
               coluna = tb.columnAtPoint(e.getPoint());
               tb.repaint();
        }
    }
    
    class ColorirCelula extends JLabel implements TableCellRenderer{
         public ColorirCelula(){
             setOpaque(true);
         }

        @Override
         public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column){
             // Caso você queira destacar a linha inteira.
             if(row == linha){
                this.setBackground(Color.yellow);
             } else {
                this.setBackground(table.getBackground());
             }
             /* Caso você só queira destacar a célula então desmarque
                 o comentário deste bloco, e comente o bloco de cima.
             if(row == linha && column = coluna){
                this.setBackground(Color.yellow);
             } else {
                this.setBackground(table.getBackground());
             }
              */
             this.setText(value.toString());
             return this;
        }
    }
    
}

Um abraço.