Swing/RollOverListener のバックアップ(No.12)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/RollOverListener へ行く。
- 1 (2006-09-11 (月) 09:10:47)
- 2 (2006-09-11 (月) 11:34:48)
- 3 (2007-03-04 (日) 18:39:15)
- 4 (2007-04-13 (金) 03:39:46)
- 5 (2011-05-14 (土) 15:08:03)
- 6 (2013-02-23 (土) 23:17:51)
- 7 (2013-08-25 (日) 04:58:34)
- 8 (2014-11-25 (火) 03:03:31)
- 9 (2015-02-03 (火) 16:24:43)
- 10 (2016-09-08 (木) 20:31:29)
- 11 (2017-10-19 (木) 15:30:36)
- 12 (2019-05-15 (水) 21:04:45)
- 13 (2021-02-09 (火) 19:10:32)
- 14 (2024-04-12 (金) 14:46:07)
- category: swing folder: RollOverListener title: JListのセルをカーソル移動でロールオーバー tags: [JList, MouseListener, MouseMotionListener] author: aterai pubdate: 2006-09-11T09:10:47+09:00 description: JListでマウスカーソルの下にあるセルをハイライト表示します。 image:
概要
JList
でマウスカーソルの下にあるセルをハイライト表示します。
Screenshot
Advertisement
サンプルコード
class RollOverList<E> extends JList<E> {
private static final Color ROLLOVERBACKGROUND = new Color(220, 240, 255);
private transient RollOverListener rollOverListener;
public RollOverList(ListModel<E> model) {
super(model);
}
@Override public void updateUI() {
if (rollOverListener != null) {
removeMouseListener(rollOverListener);
removeMouseMotionListener(rollOverListener);
}
setSelectionBackground(null); //Nimbus
super.updateUI();
EventQueue.invokeLater(new Runnable() {
@Override public void run() {
rollOverListener = new RollOverListener();
addMouseMotionListener(rollOverListener);
addMouseListener(rollOverListener);
setCellRenderer(new RollOverCellRenderer());
}
});
}
private class RollOverCellRenderer extends DefaultListCellRenderer {
@Override public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus) {
Component c = super.getListCellRendererComponent(
list, value, index, isSelected, cellHasFocus);
if (rollOverListener != null
&& index == rollOverListener.rollOverRowIndex) {
c.setBackground(ROLLOVERBACKGROUND);
if (isSelected) {
c.setForeground(Color.BLACK);
}
}
return c;
}
}
private class RollOverListener extends MouseAdapter {
private int rollOverRowIndex = -1;
@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);
}
}
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、MouseAdapter
をオーバーライドしてマウスカーソルのあるセルを記憶し、そのセルの背景色などの変更をJList#repaint(Rectangle)
メソッドで再描画しています。