Swing/RollOverListener の変更点
- 追加された行はこの色です。
- 削除された行はこの色です。
- Swing/RollOverListener へ行く。
- Swing/RollOverListener の差分を削除
--- 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`でマウスカーソルの下にあるセルをハイライト表示します。 #download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTSE8rUioI/AAAAAAAAAiM/4EMPSFpuBVo/s800/RollOverListener.png) * サンプルコード [#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); } } } } }} * 解説 [#explanation] 上記のサンプルでは、`MouseAdapter`をオーバーライドしてマウスカーソルのあるセルを記憶しそのセルの背景色などの変更を`JList#repaint(Rectangle)`メソッドで再描画しています。 - `MouseAdapter`をオーバーライドしてマウスカーソルのあるセルを記憶 - 記憶したセルの背景色の変更を`JList#repaint(Rectangle)`メソッドで再描画 * 参考リンク [#reference] - [https://community.oracle.com/thread/1389010 Swing - Highlight JTable rows on rollover] - [[JTableのセルのハイライト>Swing/CellHighlight]] * コメント [#comment] #comment #comment