• 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

概要

JListでマウスカーソルの下にあるセルをハイライト表示します。

サンプルコード

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)メソッドで再描画しています。

参考リンク

コメント