Swing/LineCursor のバックアップの現在との差分(No.11)
TITLE:JTextAreaに行カーソルを表示
JTextAreaに行カーソルを表示
Posted by terai at 2006-01-30- category: swing folder: LineCursor title: JTextAreaに行カーソルを表示 tags: [JTextArea, Caret, Highlighter] author: aterai pubdate: 2006-01-30T12:22:18+09:00 description: JTextAreaのカーソルがある行全体にアンダーラインを引きます。 image:
概要
JTextArea
のカーソルがある行全体にアンダーラインを引きます。
Screenshot
Advertisement
概要
JTextAreaのカーソルがある行全体にアンダーラインを引きます。- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
class LineCursorTextArea extends JTextArea {
private static final Color cfc = Color.BLUE;
private final DefaultCaret caret;
public LineCursorTextArea() {
super();
private static final Color LINE_COLOR = Color.BLUE;
private DefaultCaret caret;
#spanadd
#spanend
@Override public void updateUI() {
super.updateUI();
caret = new DefaultCaret() {
@Override
protected synchronized void damage(Rectangle r) {
if(r!=null) {
@Override protected synchronized void damage(Rectangle r) {
if (r != null) {
JTextComponent c = getComponent();
x = 0;
y = r.y;
width = c.getSize().width;
height = r.height;
c.repaint();
}
}
};
caret.setBlinkRate(getCaret().getBlinkRate());
setCaret(caret);
}
@Override
protected void paintComponent(Graphics g) {
#spanadd
#spanend
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D)g;
Graphics2D g2 = (Graphics2D) g.create();
Insets i = getInsets();
//int y = g2.getFontMetrics().getHeight()*getLineAtCaret(this)+i.top;
int y = caret.y+caret.height-1;
g2.setPaint(cfc);
g2.drawLine(i.left, y, getSize().width-i.left-i.right, y);
int y = caret.y + caret.height - 1;
g2.setPaint(LINE_COLOR);
g2.drawLine(i.left, y, getSize().width - i.left - i.right, y);
g2.dispose();
}
#spandel
// public static int getLineAtCaret(JTextComponent component) {
#spanend
#spandel
// int caretPosition = component.getCaretPosition();
#spanend
#spandel
// Element root = component.getDocument().getDefaultRootElement();
#spanend
#spandel
// return root.getElementIndex(caretPosition)+1;
#spanend
#spandel
// }
#spanend
#spanadd
#spanend
// public static int getLineAtCaret(JTextComponent component) {
// int caretPosition = component.getCaretPosition();
// Element root = component.getDocument().getDefaultRootElement();
// return root.getElementIndex(caretPosition) + 1;
// }
}
解説
JTextArea#paintComponentメソッドをオーバーライドして、カーソルがある行にアンダーラインを引いています。解説
JTextArea#paintComponent
メソッドをオーバーライドして、カーソルがある行にアンダーラインを引いています。
キャレットの移動に対応するため、DefaultCaret#damageメソッドを変更して、描画に使われる領域を描画し直しています。
-
Caret
の移動に対応するためDefaultCaret#damage(Rectangle)
メソッドをオーバーライドして変更された領域を再描画 - MyBlog/CurrentLineHighlighter at master · santhosh-tekuri/MyBlog · GitHubのように
Highlighter
を使用する方法もある
参考リンク
- Swing - Line Number in JTextPane
- Swing - Line highlighting problem in presence of text highlighting!
- MyBlog/CurrentLineHighlighter at master · santhosh-tekuri/MyBlog · GitHub
- JTextAreaに行ハイライトカーソルを表示
参考リンク
- Swing - Line Number in JTextPane
- Swing - Line highlighting problem in presence of text highlighting!
- Java低速GUI Swing 3
- Highlighting Current Line
- JTextAreaに行ハイライトカーソルを表示
コメント
-
Caret
の高さを使用するよう変更 -- aterai
コメント
-
JEditorPaneではgetRowHeight()が使えないようなので、Java低速GUI Swing 3を参考にしてg2.getFontMetrics().getHeight()にしました。-- terai- Caret の高さを使用するように変更しました。 -- terai