Swing/MouseOverPainter のバックアップ(No.2)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/MouseOverPainter へ行く。
- 1 (2007-08-22 (水) 11:02:35)
- 2 (2011-05-05 (木) 08:26:33)
- 3 (2013-02-23 (土) 23:15:12)
- 4 (2014-11-22 (土) 03:59:58)
- 5 (2015-02-02 (月) 17:44:25)
- 6 (2015-04-04 (土) 22:09:44)
- 7 (2016-03-25 (金) 21:27:54)
- 8 (2016-09-18 (日) 21:06:07)
- 9 (2017-10-31 (火) 14:13:28)
- 10 (2019-04-25 (木) 17:37:01)
- 11 (2021-02-04 (木) 01:44:10)
- 12 (2024-03-22 (金) 16:22:14)
TITLE:JTextAreaの行をマウスでロールオーバー表示
Posted by aterai at 2006-09-25
JTextAreaの行をマウスでロールオーバー表示
JTextAreaのマウスカーソルがある行をロールオーバー表示します。
- &jnlp;
- &jar;
- &zip;
サンプルコード
class HighlightCursorTextArea extends JTextArea {
public HighlightCursorTextArea() {
super();
setOpaque(false);
RollOverListener rol = new RollOverListener();
addMouseMotionListener(rol);
addMouseListener(rol);
}
private final Color linecolor = new Color(250,250,220);
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
Insets i = getInsets();
int h = g2.getFontMetrics().getHeight();
int y = rollOverRowIndex*h+i.top;
g2.setPaint(linecolor);
g2.fillRect(i.left, y, getSize().width-i.left-i.right, h);
super.paintComponent(g);
}
private int rollOverRowIndex = -1;
private class RollOverListener extends MouseInputAdapter {
public void mouseExited(MouseEvent e) {
rollOverRowIndex = -1;
repaint();
}
public void mouseMoved(MouseEvent e) {
int row = getLineAtPoint(e.getPoint());
if(row != rollOverRowIndex) {
rollOverRowIndex = row;
repaint();
}
}
public int getLineAtPoint(Point pt) {
Element root = getDocument().getDefaultRootElement();
return root.getElementIndex(viewToModel(pt));
}
}
}
解説
MouseInputAdapterを継承したRollOverListenerで、マウスカーソルのある行を記憶し、JTextArea#paintComponentメソッドをオーバーライドして、その行の背景に色を付けています。