#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]
- JEditorPaneでは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