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.