Swing/LineNumber のバックアップ差分(No.20)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - 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)
- 追加された行はこの色です。
- 削除された行はこの色です。
TITLE:JTextAreaに行番号を表示 #navi(../) #tags(JTextArea, FontMetrics) #tags(JTextArea, FontMetrics, JScrollPane) RIGHT:Posted by &author(aterai); at 2006-02-20 *JTextAreaに行番号を表示 [#l3a54503] * JTextAreaに行番号を表示 [#l3a54503] ``JTextArea``に行番号を表示します。 -&jnlp; -&jar; -&zip; - &jnlp; - &jar; - &zip; //#screenshot #ref(http://lh4.ggpht.com/_9Z4BYR88imo/TQTPV_bkDWI/AAAAAAAAAd0/Jktuzx5j5gU/s800/LineNumber.png) #ref(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTPV_bkDWI/AAAAAAAAAd0/Jktuzx5j5gU/s800/LineNumber.png) **サンプルコード [#caf6edeb] ** サンプルコード [#caf6edeb] #code(link){{ class LineNumberView extends JComponent { private static final int MARGIN = 5; private final JTextArea text; private final JTextArea textArea; private final FontMetrics fontMetrics; private final int topInset; //private final int topInset; private final int fontAscent; private final int fontHeight; private final int fontDescent; private final int fontLeading; public LineNumberView(JTextArea textArea) { text = textArea; fontMetrics = getFontMetrics(text.getFont()); this.textArea = textArea; Font font = textArea.getFont(); fontMetrics = getFontMetrics(font); fontHeight = fontMetrics.getHeight(); fontAscent = fontMetrics.getAscent(); topInset = text.getInsets().top; text.getDocument().addDocumentListener(new DocumentListener() { fontDescent = fontMetrics.getDescent(); fontLeading = fontMetrics.getLeading(); //topInset = textArea.getInsets().top; textArea.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { repaint(); } @Override public void removeUpdate(DocumentEvent e) { repaint(); } @Override public void changedUpdate(DocumentEvent e) {} }); text.addComponentListener(new ComponentAdapter() { textArea.addComponentListener(new ComponentAdapter() { @Override public void componentResized(ComponentEvent e) { revalidate(); repaint(); } }); setBorder(BorderFactory.createMatteBorder(0, 0, 0, 1, Color.GRAY)); Insets i = textArea.getInsets(); setBorder(BorderFactory.createCompoundBorder( BorderFactory.createMatteBorder(0, 0, 0, 1, Color.GRAY), BorderFactory.createEmptyBorder(i.top, MARGIN, i.bottom, MARGIN - 1))); setOpaque(true); setBackground(Color.WHITE); setFont(font); } private int getComponentWidth() { Document doc = text.getDocument(); Document doc = textArea.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; Insets i = getBorder().getBorderInsets(this); return maxDigits * fontMetrics.stringWidth("0") + i.left + i.right; //return 48; } private int getLineAtPoint(int y) { Element root = text.getDocument().getDefaultRootElement(); int pos = text.viewToModel(new Point(0, y)); Element root = textArea.getDocument().getDefaultRootElement(); int pos = textArea.viewToModel(new Point(0, y)); return root.getElementIndex(pos); } @Override public Dimension getPreferredSize() { return new Dimension(getComponentWidth(), text.getHeight()); return new Dimension(getComponentWidth(), textArea.getHeight()); } @Override public void paintComponent(Graphics g) { g.setColor(getBackground()); 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 base = clip.y; int start = getLineAtPoint(base); int end = getLineAtPoint(base+clip.height); int y = topInset-fontHeight+fontAscent+start*fontHeight; int end = getLineAtPoint(base + clip.height); int y = start * fontHeight; int rmg = getBorder().getBorderInsets(this).right; for(int i=start;i<=end;i++) { String text = String.valueOf(i+1); int x = getComponentWidth()-MARGIN-fontMetrics.stringWidth(text); y = y + fontHeight; String text = String.valueOf(i + 1); int x = getComponentWidth() - rmg - fontMetrics.stringWidth(text); y += fontAscent; g.drawString(text, x, y); y += fontDescent + fontLeading; } } } }} **解説 [#mcee74d1] [https://forums.oracle.com/message/5782932 Line Number in JTextPane | Oracle Forums]を参考にして、``JTextArea``に行番号を表示しています。 ** 解説 [#mcee74d1] [https://forums.oracle.com/message/6217372 Advice for editor gutter implementation... | Oracle Forums]を参考にして、``JTextArea``に行番号を表示しています。 上記のサンプルで使用する``JTextArea``は、使用するフォントや余白などは変更不可で、各行の高さは最後まで一定であると想定しています。 **参考リンク [#qeacb6f7] ** 参考リンク [#qeacb6f7] - [https://forums.oracle.com/message/6217372 Advice for editor gutter implementation... | Oracle Forums] - [https://forums.oracle.com/message/5782932 Line Number in JTextPane | Oracle Forums] - [https://forums.oracle.com/message/6267595 line number in jtextpane | Oracle Forums] **コメント [#eb1fb225] ** コメント [#eb1fb225] - すごいね!私はこのような資料を探しています、どうも ありがとうございます。 -- [[CK]] &new{2007-04-21 (Sat) 18:29:31}; -- どういたしまして。 -- [[aterai]] &new{2007-04-23 (月) 09:47:47}; - こちらのソースは非常に参考になります。現在趣味でエディタを作成しているのですが、``JTextPane``の``Document``を``JTextArea``に与えてカーソル位置を取得しています。``JTextPane``で行番号、列番号を正確に取得できないものでしょうか? -- [[shusen]] &new{2007-11-09 (金) 10:22:30}; - どうもです。``JTextPane``だと、行の折り返しをどう扱うかで、行番号の表示が異なります。 -- [[aterai]] &new{2007-11-09 (金) 14:52:40}; --折り返しても表示は前の行のままの場合 ---[http://forums.sun.com/thread.jspa?threadID=585673 Swing - Line Number in JTextPane] ---このページのサンプルは、上記のリンク先にある``LineNumberView``(@author Alan Moore)を参考にしていますが、``JTextArea``に必要なさそうな折り返しや各行の高さが異なる場合などの処理を削っているので、``JTextPane``で使う場合は、リンク先などのオリジナルのソースを参考にしてください。 --折り返された行にも行番号を表示したい場合 ---[http://forums.sun.com/thread.jspa?threadID=422802 Swing (Archive) - line number in jtextpane] ---上記のリンク先にあるサンプルでは、``EditorKit``を使って行番号を表示しており、``JTextPane``で折り返された行でも、表示に従って行番号が割り振られています。 - どうもです。``JTextPane``だと、デフォルトの行の折り返しをどう扱うかで、行番号の表示が異なります。 -- [[aterai]] &new{2007-11-09 (金) 14:52:40}; -- 折り返しても表示は前の行のままの場合 --- [https://forums.oracle.com/message/5782932 Line Number in JTextPane | Oracle Forums] --- このページのサンプルは、上記のリンク先にある``LineNumberView``(@author Alan Moore)を参考にしていますが、``JTextArea``に必要なさそうな折り返しや各行の高さが異なる場合などの処理を削っているので、``JTextPane``で使う場合は、リンク先などのオリジナルのソースを参考にしてください。 -- 折り返された行にも行番号を表示したい場合 --- [https://forums.oracle.com/message/6267595 line number in jtextpane | Oracle Forums] --- 上記のリンク先にあるサンプルでは、``EditorKit``を使って行番号を表示しており、``JTextPane``で折り返された行でも、表示に従って行番号が割り振られています。 - ご返答ありがとうございます。現在はこちらにある折り返し抑制のソースを利用させていただいているので、``EditorKit``を利用する分を試してみたいと思います。 -- [[shusen]] &new{2007-11-09 (金) 19:16:05}; - ``EditorKit``を利用した分をコピペして、とりあえずそのままコンパイル・実行してみました。ここでおかしいことがありまして、コマンドプロンプトから起動すると文字が挿入された行のみ行番号が表示されるのですが、自作エディタから``ProcessBuilder``と``Process``で``"java Test"``となるように呼び出すと、未入力の行も含めて全ての行番号が表示されます。コレはプロンプトの実効環境がおかしいのでしょうか? -- [[shusen]] &new{2007-11-14 (水) 17:20:54}; - すみません、自己解決しました(たぶん)。ランタイムの問題で、``jre1.6.0_01``以下だと上記の状態になりました。``jre1.6.0_02``と``jre1.6.0_03``ではちゃんと表示されました。 -- [[shusen]] &new{2007-11-14 (水) 17:31:45}; -- 情報ありがとうございます。直接は関係のない話ですが、バージョンかぁと何気にダウンロードサイトに行ったら、%%サーバー落ちてるっぽいですねorz%% あとで見たらダウンロードのページがすこし変更されているみたいなので、単に更新中だっただけ?みたいです。 -- [[aterai]] &new{2007-11-14 (水) 18:43:29}; -- 情報ありがとうございます。直接は関係のない話ですが、バージョンかぁと何気にダウンロードサイトに行ったら、 %%サーバー落ちてるっぽいですねorz%% あとで見たらダウンロードのページがすこし変更されているみたいなので、単に更新中だっただけ?みたいです。 -- [[aterai]] &new{2007-11-14 (水) 18:43:29}; - ありがとう。参考になりました。 -- [[ミルコ・マグカップ]] &new{2013-08-08 (木) 16:38:51}; - ところで、これってJTextAreaとフォントを同じにしないとgetComponentWidth()で適切な幅が得られないと思います。 -- [[ミルコ・マグカップ]] &new{2013-08-08 (木) 16:40:32}; - getComponentWidth()はJTextAreaのフォントを基に幅を算出しているけど、実際に描画されるフォントはデフォルトのフォントだから -- [[ミルコ・マグカップ]] &new{2013-08-08 (木) 16:44:11}; -- こんばんは。「JTextAreaのフォントの幅...」は、確かにそうですね。この幅は行番号の表示幅とその右寄せにしか使ってないので、いっそ固定にしてもいいかもしれません。 -- [[aterai]] &new{2013-08-08 (木) 22:24:41}; -- ``LineNumberView``に``setFont``で同じフォントを使用するように修正しました(ミルコさん、ありがとうございました)。ついでに``JTextArea``のフォントより``RowHeaderView``(行番号表示用)のフォントサイズがすこし小さい場合などでも問題ないように、ベースラインを真面目に揃えて描画するよう修正しました。 -- [[aterai]] &new{2013-08-09 (金) 12:59:25}; #comment