• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTextAreaの行をマウスでロールオーバー表示
#navi(../)
*JTextAreaの行をマウスでロールオーバー表示 [#me3cb8ee]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-09-25~
更新日:&lastmod;
---
category: swing
folder: MouseOverPainter
title: JTextAreaの行をマウスでロールオーバー表示
tags: [JTextArea, MouseListener, MouseMotionListener]
author: aterai
pubdate: 2006-09-25T03:59:45+09:00
description: JTextAreaのマウスカーソルがある行をロールオーバー表示します。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTQFUVNyQI/AAAAAAAAAfA/cTsyoFPSNEg/s800/MouseOverPainter.png
---
* 概要 [#summary]
`JTextArea`のマウスカーソルがある行をロールオーバー表示します。

#contents
#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTQFUVNyQI/AAAAAAAAAfA/cTsyoFPSNEg/s800/MouseOverPainter.png)

**概要 [#def596ab]
JTextAreaのマウスカーソルがある行をロールオーバー表示します。
* サンプルコード [#sourcecode]
#code(link){{
class HighlightCursorTextArea extends JTextArea {
  private static final Color LINE_COLOR = new Color(250, 250, 220);
  private int rollOverRowIndex = -1;
  private MouseAdapter rolloverHandler;

#screenshot
  @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);
  }

**サンプルコード [#z00c25ed]
#code{{
 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);
  }

  private class RollOverListener extends MouseAdapter {
    @Override public void mouseExited(MouseEvent e) {
      rollOverRowIndex = -1;
      repaint();
    }

    @Override 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));
    }
  }
}
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#a4d2db6d]
MouseInputAdapterを継承したRollOverListenerで、マウスカーソルのある行を記憶し、JTextArea#paintComponentメソッドをオーバーライドして、その行の背景に色を付けています。
* 解説 [#explanation]
- `MouseAdapter`を継承した`RollOverListener`でマウスカーソルのある行を記憶
- `JTextArea#paintComponent`メソッドをオーバーライドしてその行の背景色を変更

//**参考リンク
**コメント [#rebb2644]
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/text/Element.html#getElementIndex-int- Element#getElementIndex(...) (Java Platform SE 8)]

* コメント [#comment]
#comment
#comment