Swing/RollOverListener のバックアップの現在との差分(No.2)
TITLE:JListのセルをマウスカーソルでロールオーバー
JListのセルをカーソル移動でロールオーバー
編集者:Terai Atsuhiro~
作成日:2006-09-11
更新日:2024-04-12 (金) 14:46:07
概要
JList
でマウスカーソルの下にあるセルをハイライト表示します。
Screenshot
Advertisement
概要
JListでマウスカーソルの下にあるセルをハイライト表示します。サンプルコード
#spanend
#spanadd
class RollOverList<E> extends JList<E> {
#spanend
protected static final Color ROLLOVER_BACKGROUND = new Color(0xDC_F0_FF);
protected transient RollOverListener rollOverListener;
protected int rollOverRowIndex = -1;
#spandel
#screenshot
#spanend
protected RollOverList(ListModel<E> model) {
super(model);
}
#spandel
**サンプルコード [#g4cfa246]
#spanend
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();
#spandel
**解説 [#bbe45ca3]
#spanend
#spandel
MouseInputAdapterをオーバーライドして、マウスカーソルのあるセルを記憶し、JListをリペイントしてそのセルの背景色などを変更しています。
#spanend
@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;
}
}
#spandel
**参考リンク [#z49e85b1]
#spanend
-[[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();
}
#spandel
**コメント [#c980eab8]
#spanend
@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);
}
}
}
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin解説
-
MouseAdapter
をオーバーライドしてマウスカーソルのあるセルを記憶 - 記憶したセルの背景色の変更を
JList#repaint(Rectangle)
メソッドで再描画