Swing/MouseOverPainter のバックアップの現在との差分(No.1)
TITLE:JTextAreaの行をマウスでロールオーバー表示
JTextAreaの行をマウスでロールオーバー表示
編集者:Terai Atsuhiro~
作成日:2006-09-25
更新日:2024-03-22 (金) 16:22:14
概要
JTextArea
のマウスカーソルがある行をロールオーバー表示します。
Screenshot
Advertisement
概要
JTextAreaのマウスカーソルがある行をロールオーバー表示します。サンプルコード
#spanend
#spanadd
class HighlightCursorTextArea extends JTextArea {
#spanend
private static final Color LINE_COLOR = new Color(250, 250, 220);
private int rollOverRowIndex = -1;
private MouseAdapter rolloverHandler;
#spandel
#screenshot
#spanend
@Override public void updateUI() {
removeMouseMotionListener(rolloverHandler);
removeMouseListener(rolloverHandler);
super.updateUI();
setOpaque(false);
setBackground(new Color(0x0, true)); // Nimbus
rolloverHandler = new RollOverListener();
addMouseMotionListener(rolloverHandler);
addMouseListener(rolloverHandler);
}
#spandel
**サンプルコード [#z00c25ed]
#spanend
#spandel
#code{{
#spanend
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));
}
}
}
@Override protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
Insets i = getInsets();
int h = g2.getFontMetrics().getHeight();
int y = rollOverRowIndex * h + i.top;
g2.setPaint(LINE_COLOR);
g2.fillRect(i.left, y, getSize().width - i.left - i.right, h);
g2.dispose();
super.paintComponent(g);
}
#spanadd
#spanend
private class RollOverListener extends MouseAdapter {
@Override public void mouseExited(MouseEvent e) {
rollOverRowIndex = -1;
repaint();
}
#spanadd
#spanend
@Override public void mouseMoved(MouseEvent e) {
int row = getLineAtPoint(e.getPoint());
if (row != rollOverRowIndex) {
rollOverRowIndex = row;
repaint();
}
}
#spanadd
#spanend
public int getLineAtPoint(Point pt) {
Element root = getDocument().getDefaultRootElement();
return root.getElementIndex(viewToModel(pt));
}
}
#spanadd
}
#spanend
View in GitHub: Java, Kotlin- &jnlp;
- &jar;
- &zip;
解説
MouseInputAdapterを継承したRollOverListenerで、マウスカーソルのある行を記憶し、JTextArea#paintComponentメソッドをオーバーライドして、その行の背景に色を付けています。解説
-
MouseAdapter
を継承したRollOverListener
でマウスカーソルのある行を記憶 -
JTextArea#paintComponent
メソッドをオーバーライドしてその行の背景色を変更