---
category: swing
folder: RollOverListener
title: JListのセルをカーソル移動でロールオーバー
tags: [JList, MouseListener, MouseMotionListener]
author: aterai
pubdate: 2006-09-11T09:10:47+09:00
description: JListでマウスカーソルの下にあるセルをハイライト表示します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTSE8rUioI/AAAAAAAAAiM/4EMPSFpuBVo/s800/RollOverListener.png
---
* Summary [#summary]
`JList`でマウスカーソルの下にあるセルをハイライト表示します。
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTSE8rUioI/AAAAAAAAAiM/4EMPSFpuBVo/s800/RollOverListener.png)
* Source Code Examples [#sourcecode]
#code(link){{
class RollOverList<E> extends JList<E> {
protected static final Color ROLLOVER_BACKGROUND = new Color(0xDC_F0_FF);
protected transient RollOverListener rollOverListener;
protected int rollOverRowIndex = -1;
protected RollOverList(ListModel<E> model) {
super(model);
}
@Override public void updateUI() {
removeMouseListener(rollOverListener);
removeMouseMotionListener(rollOverListener);
setSelectionBackground(null); // Nimbus
super.updateUI();
rollOverListener = new RollOverListener();
addMouseMotionListener(rollOverListener);
addMouseListener(rollOverListener);
setCellRenderer(new RollOverCellRenderer());
}
private class RollOverCellRenderer implements ListCellRenderer<E> {
private final ListCellRenderer<? super E> renderer = new DefaultListCellRenderer();
@Override public Component getListCellRendererComponent(
JList<? extends E> list, E value, int index,
boolean isSelected, boolean cellHasFocus) {
Component c = renderer.getListCellRendererComponent(
list, value, index, isSelected, cellHasFocus);
if (index == rollOverRowIndex) {
c.setBackground(ROLLOVER_BACKGROUND);
if (isSelected) {
c.setForeground(Color.BLACK);
}
// c.setForeground(getSelectionForeground());
// c.setBackground(getSelectionBackground());
}
return c;
}
}
private class RollOverListener extends MouseAdapter {
@Override public void mouseExited(MouseEvent e) {
rollOverRowIndex = -1;
repaint();
}
@Override public void mouseMoved(MouseEvent e) {
int row = locationToIndex(e.getPoint());
if (row != rollOverRowIndex) {
Rectangle rect = getCellBounds(row, row);
if (rollOverRowIndex >= 0) {
rect.add(getCellBounds(rollOverRowIndex, rollOverRowIndex));
}
rollOverRowIndex = row;
repaint(rect);
}
}
}
}
}}
* Description [#explanation]
* Description [#description]
- `MouseAdapter`をオーバーライドしてマウスカーソルのあるセルを記憶
- 記憶したセルの背景色の変更を`JList#repaint(Rectangle)`メソッドで再描画
* Reference [#reference]
- [https://community.oracle.com/thread/1389010 Swing - Highlight JTable rows on rollover]
- [[JTableのセルのハイライト>Swing/CellHighlight]]
* Comment [#comment]
#comment
#comment