• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JListのセルをマウスカーソルでロールオーバー
#navi(../)
*JListのセルをカーソル移動でロールオーバー [#q7f9d22f]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-09-11~
更新日:&lastmod;
---
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]
`JList`でマウスカーソルの下にあるセルをハイライト表示します。

#contents
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTSE8rUioI/AAAAAAAAAiM/4EMPSFpuBVo/s800/RollOverListener.png)

**概要 [#mfd31fa5]
JListでマウスカーソルの下にあるセルをハイライト表示します。
* サンプルコード [#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;

#screenshot
  protected RollOverList(ListModel<E> model) {
    super(model);
  }

**サンプルコード [#g4cfa246]
 class RollOverList extends JList {
   private int rollOverRowIndex = -1;
   public RollOverList() {
     super();
     RollOverListener rol = new RollOverListener();
     addMouseMotionListener(rol);
     addMouseListener(rol);
     setCellRenderer(new RollOverCellRenderer());
   }
   private class RollOverCellRenderer extends DefaultListCellRenderer{
     public Component getListCellRendererComponent(JList list, Object value,
                            int index, boolean isSelected, boolean cellHasFocus) {
       Component c = super.getListCellRendererComponent(list, value, index,
                                                        isSelected, cellHasFocus);
       if(index == rollOverRowIndex) {
         c.setBackground(new Color(220,240,255));
         if(isSelected) c.setForeground(Color.black);
       }
       return c;
     }
   }
   private class RollOverListener extends MouseInputAdapter {
     public void mouseExited(MouseEvent e) {
       rollOverRowIndex = -1;
       repaint();
     }
     public void mouseMoved(MouseEvent e) {
       int row = locationToIndex(e.getPoint());
       if(row != rollOverRowIndex) {
         rollOverRowIndex = row;
         repaint();
       }
     }
   }
 }
  @Override public void updateUI() {
    removeMouseListener(rollOverListener);
    removeMouseMotionListener(rollOverListener);
    setSelectionBackground(null); // Nimbus
    super.updateUI();
    rollOverListener = new RollOverListener();
    addMouseMotionListener(rollOverListener);
    addMouseListener(rollOverListener);
    setCellRenderer(new RollOverCellRenderer());
  }

-&jnlp;
-&jar;
-&zip;
  private class RollOverCellRenderer implements ListCellRenderer<E> {
    private final ListCellRenderer<? super E> renderer = new DefaultListCellRenderer();

**解説 [#bbe45ca3]
MouseInputAdapterをオーバーライドして、マウスカーソルのあるセルを記憶し、JListをリペイントしてそのセルの背景色などを変更しています。
    @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;
    }
  }

**参考リンク [#z49e85b1]
-[[Java Technology Forums - Highlight JTable rows on rollover>http://forum.java.sun.com/thread.jspa?forumID=57&threadID=640414]]
  private class RollOverListener extends MouseAdapter {
    @Override public void mouseExited(MouseEvent e) {
      rollOverRowIndex = -1;
      repaint();
    }

**コメント [#c980eab8]
    @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);
      }
    }
  }
}
}}

* 解説 [#explanation]
- `MouseAdapter`をオーバーライドしてマウスカーソルのあるセルを記憶
- 記憶したセルの背景色の変更を`JList#repaint(Rectangle)`メソッドで再描画

* 参考リンク [#reference]
- [https://community.oracle.com/thread/1389010 Swing - Highlight JTable rows on rollover]
- [[JTableのセルのハイライト>Swing/CellHighlight]]

* コメント [#comment]
#comment
#comment