1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| public class OnMouseOverRenderers implements TableCellRenderer, MouseMotionListener {
private TableCellRenderer standard;
private TableCellRenderer over;
private int currentRow = -1;
private int currentCol = -1;
/**
* Permet d'associer à la fois le renderer et le listener.
* (l'un sans l'autre cela ne fonctionnera pas)
*/
public static void setDefaultRenderers(JTable table, Class<?> columnClass, TableCellRenderer standard, TableCellRenderer over) {
OnMouseOverRenderers instance = new OnMouseOverRenderers(standard, over);
table.setDefaultRenderer(columnClass, instance);
table.addMouseMotionListener(instance);
}
private OnMouseOverRenderers(TableCellRenderer standard, TableCellRenderer over) {
this.standard = standard;
this.over = over;
}
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
// On renvoi vers le renderer selon les index :
if (row==currentRow && column==currentCol) {
return over.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
return standard.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
}
public void mouseDragged(MouseEvent e) {
// empty
}
public void mouseMoved(MouseEvent e) {
JTable table = (JTable) e.getComponent();
// On récupère les coordonnées de la cellule courante :
Point point = e.getPoint();
int row = table.rowAtPoint(point);
int col = table.columnAtPoint(point);
// Si la cellule a changé :
if (currentRow!=row || currentCol!=col) {
// On récupère les coordonnées graphiques de la précédente cellule :
Rectangle previous = table.getCellRect(currentRow, currentCol, true);
// On met à jour les index de la cellule survolée :
currentRow = row;
currentCol = col;
// On récupère les coordonnées graphiques de la précédente cellule :
Rectangle current = table.getCellRect(currentRow, currentCol, true);
// Et on demande de repeindre les deux cellules :
table.repaint(previous);
table.repaint(current);
}
}
} |