Swing/LineCursor のバックアップの現在との差分(No.18)
- 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
サンプルコード
class LineCursorTextArea extends JTextArea {
private static final Color LINE_COLOR = Color.BLUE;
private DefaultCaret caret;
@Override public void updateUI() {
super.updateUI();
caret = new DefaultCaret() {
@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);
}
#spanadd
#spanend
@Override protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
Insets i = getInsets();
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;
// }
}
View in GitHub: Java, Kotlin解説
JTextArea#paintComponent
メソッドをオーバーライドして、カーソルがある行にアンダーラインを引いています。
-
Caret
の移動に対応するため、DefaultCaret#damage
メソッドを変更して、変更のあった領域を再描画 - Highlighting Current Line のように、
Highlighter
を使用する方法もある -
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!
- Highlighting Current Line
- MyBlog/CurrentLineHighlighter at master · santhosh-tekuri/MyBlog · GitHub
- JTextAreaに行ハイライトカーソルを表示