#navi(../)
*JTextAreaに行カーソルを表示 [#x5c3f9a7]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-01-30~
更新日:&lastmod;

#contents

**概要 [#sb8c4958]
JTextAreaのカーソルがある行全体にアンダーラインを引きます。

http://terai.xrea.jp/swing/linecursor/screenshot.png

**サンプルコード [#aed50ce8]
 class LineCursorTextArea extends JTextArea {
  public LineCursorTextArea() {
    super();
    Caret caret = new DefaultCaret() {
      protected synchronized void damage(Rectangle r) {
        if(r!=null) {
          JTextComponent c = getComponent();
          x = 0;
          y = r.y;
          width  = c.getSize().width;
          height = r.height;
          repaint();
        }
      }
    };
    caret.setBlinkRate(getCaret().getBlinkRate());
    setCaret(caret);
  }
  protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D)g;
    Insets i = getInsets();
    int y = g2.getFontMetrics().getHeight()*getLineAtCaret(this)+i.top;
    g2.setPaint(SystemColor.activeCaption);
    g2.drawLine(i.left, y-1, getSize().width-i.left-i.right, y-1);
  }
  public static int getLineAtCaret(JTextComponent component) {
    int caretPosition = component.getCaretPosition();
    Element root = component.getDocument().getDefaultRootElement();
    return root.getElementIndex(caretPosition)+1;
  }
 }

-[[サンプルを起動>http://terai.xrea.jp/swing/linecursor/sample.jnlp]]
-[[jarファイル>http://terai.xrea.jp/swing/linecursor/sample.jar]]
-[[ソース>http://terai.xrea.jp/swing/linecursor/src.zip]]

**解説 [#b5ead0fc]
JTextArea#paintComponentメソッドをオーバーライドして、カーソルがある行にアンダーラインを引いています。

キャレットの移動に対応するため、DefaultCaret#damageメソッドを変更して、描画に使われる領域を描画し直しています。

**参考リンク [#j7373295]
-[[Java Forums - Line Number in JTextPane>http://forum.java.sun.com/thread.jspa?forumID=57&threadID=613385]]
-[[Java低速GUI Swing 3>http://pc8.2ch.net/test/read.cgi/tech/1121700954/813-818?&nofirst=true]]

**コメント [#v0898907]
- JEditPaneではgetRowHeight()が使えないようなので、[[Java低速GUI Swing 3>http://pc8.2ch.net/test/read.cgi/tech/1121700954/813-818?&nofirst=true]]を参考にしてg2.getFontMetrics().getHeight()にしました。 -- [[terai]] &new{2006-01-30 (月) 12:24:40};

#comment