Swing/LineNumber のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/LineNumber へ行く。
- 1 (2006-02-27 (月) 16:08:07)
- 2 (2006-04-21 (金) 18:02:53)
- 3 (2007-03-07 (水) 02:37:22)
- 4 (2007-04-21 (土) 19:29:31)
- 5 (2007-04-23 (月) 09:47:47)
- 6 (2007-09-28 (金) 12:16:06)
- 7 (2007-11-09 (金) 10:22:30)
- 8 (2007-11-09 (金) 14:52:40)
- 9 (2007-11-09 (金) 19:16:05)
- 10 (2007-11-09 (金) 20:34:59)
- 11 (2007-11-14 (水) 17:20:54)
- 12 (2007-11-14 (水) 18:43:29)
- 13 (2007-11-15 (木) 12:57:04)
- 14 (2011-04-03 (日) 04:36:59)
- 15 (2013-03-14 (木) 20:54:40)
- 16 (2013-08-08 (木) 16:38:51)
- 17 (2013-08-08 (木) 17:57:05)
- 18 (2013-08-08 (木) 22:24:41)
- 19 (2013-08-09 (金) 12:52:30)
- 20 (2013-09-13 (金) 00:24:04)
- 21 (2014-11-14 (金) 02:26:03)
- 22 (2014-11-25 (火) 03:03:31)
- 23 (2015-01-27 (火) 17:04:34)
- 24 (2016-01-27 (水) 18:23:10)
- 25 (2016-05-08 (日) 16:02:11)
- 26 (2016-05-28 (土) 18:18:19)
- 27 (2016-09-02 (金) 12:13:36)
- 28 (2017-03-29 (水) 15:46:27)
- 29 (2018-02-28 (水) 19:07:19)
- 30 (2019-08-15 (木) 14:38:44)
- 31 (2021-04-09 (金) 19:42:12)
JTextAreaに行番号を表示
編集者:Terai Atsuhiro
作成日:2006-02-20
更新日:2021-04-09 (金) 19:42:12
概要
JTextAreaに行番号を表示します。
サンプルコード
class LineNumberView extends JComponent { private static final int MARGIN = 5; private final JTextArea text; private final FontMetrics fontMetrics; private final int topInset; private final int fontAscent; private final int fontHeight; public LineNumberView(JTextArea textArea) { text = textArea; fontMetrics = getFontMetrics(text.getFont()); fontHeight = fontMetrics.getHeight(); fontAscent = fontMetrics.getAscent(); topInset = text.getInsets().top; text.getDocument().addDocumentListener(new DocumentListener() { public void insertUpdate(DocumentEvent e) { repaint(); } public void removeUpdate(DocumentEvent e) { repaint(); } public void changedUpdate(DocumentEvent e) {} }); text.addComponentListener(new ComponentAdapter() { public void componentResized(ComponentEvent e) { revalidate(); repaint(); } }); setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.GRAY)); } private int getComponentWidth() { Document doc = text.getDocument(); Element root = doc.getDefaultRootElement(); int lineCount = root.getElementIndex(doc.getLength()); int maxDigits = Math.max(3, String.valueOf(lineCount).length()); return maxDigits*fontMetrics.stringWidth("0")+MARGIN*2; } private int getLineAtPoint(int y) { Element root = text.getDocument().getDefaultRootElement(); int pos = text.viewToModel(new Point(0, y)); return root.getElementIndex(pos); } public Dimension getPreferredSize() { return new Dimension(getComponentWidth(), text.getHeight()); } public void paintComponent(Graphics g) { Rectangle clip = g.getClipBounds(); g.setColor(getBackground()); g.fillRect(clip.x, clip.y, clip.width, clip.height); g.setColor(getForeground()); int base = clip.y - topInset; int start = getLineAtPoint(base); int end = getLineAtPoint(base+clip.height); int y = topInset-fontHeight+fontAscent+start*fontHeight; for(int i=start;i<=end;i++) { String text = String.valueOf(i+1); int x = getComponentWidth()-MARGIN-fontMetrics.stringWidth(text); y = y + fontHeight; g.drawString(text, x, y); } } }
解説
Java Forums - Line Number in JTextPaneを参考にして、JTextAreaに行番号を表示しています。
上記のサンプルで使用するJTextAreaは、行の高さはすべて一定で、フォントや余白などは変更されないものと想定しています。