JTextAreaに行カーソルを表示
Total: 6270
, Today: 3
, Yesterday: 4
Posted by aterai at
Last-modified:
概要
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);
}
@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();
}
// 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(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に行ハイライトカーソルを表示