display line number in JTextPane

F

Fabrice

Hi !

I would like to know if it is possible to display the line number in a
JTextPane ? I design an editor and I'd like to offer the same feature
than a programer's notepad that show the number of EACH line at the
left side of the text.

regards,
Fabrice
 
A

ak

I would like to know if it is possible to display the line number in a
JTextPane ? I design an editor and I'd like to offer the same feature
than a programer's notepad that show the number of EACH line at the
left side of the text.

usually line numbers displayed in pane left from text panel.

____________

http://reader.imagero.com the best java image reader.
 
?

=?ISO-8859-1?Q?Daniel_Sj=F6blom?=

Fabrice said:
Hi !

I would like to know if it is possible to display the line number in a
JTextPane ? I design an editor and I'd like to offer the same feature
than a programer's notepad that show the number of EACH line at the
left side of the text.

It is fairly easy, but requires knowledge of swing idiosynchrasies. Here
is some code to get you started (probably munged by posting, try loading
it up in a beautifying editor):

package com.dsjoblom.junk;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Point;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
import javax.swing.text.Document;

/**
* A class illustrating running line number count on JTextPane. Nothing
is painted on the pane itself,
* but a separate JPanel handles painting the line numbers.<br>
*
* @author Daniel Sjöblom<br>
* Created on Mar 3, 2004<br>
* Copyright (c) 2004<br>
* @version 1.0<br>
*/
public class LineNr extends JPanel
{
// for this simple experiment, we keep the pane + scrollpane as members.
JTextPane pane;
JScrollPane scrollPane;

public LineNr()
{
super();
setMinimumSize(new Dimension(30, 30));
setPreferredSize(new Dimension(30, 30));
setMinimumSize(new Dimension(30, 30));
pane = new JTextPane() // we need to override paint so that the
linenumbers stay in sync
{
public void paint(Graphics g)
{
super.paint(g);
LineNr.this.repaint();
}
};
scrollPane = new JScrollPane(pane);

}
public void paint(Graphics g)
{
super.paint(g);

// We need to properly convert the points to match the viewport
// Read docs for viewport
int start =
pane.viewToModel(scrollPane.getViewport().getViewPosition()); //
starting pos in document
int end =
pane.viewToModel(
new Point(
scrollPane.getViewport().getViewPosition().x + pane.getWidth(),
scrollPane.getViewport().getViewPosition().y + pane.getHeight()));
// end pos in doc

// translate offsets to lines
Document doc = pane.getDocument();
int startline = doc.getDefaultRootElement().getElementIndex(start);
int endline = doc.getDefaultRootElement().getElementIndex(end);

int fontHeight = g.getFontMetrics(pane.getFont()).getHeight(); // font
height

for (int line = startline, y = 0; line <= endline; line++, y +=
fontHeight)
{
g.drawString(Integer.toString(line), 0, y);
}

}

// test main
public static void main(String[] args)
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
final LineNr nr = new LineNr();
frame.getContentPane().add(nr, BorderLayout.WEST);
frame.getContentPane().add(nr.scrollPane, BorderLayout.CENTER);
frame.pack();
frame.setSize(new Dimension(400, 400));
frame.show();
}
}
 
?

=?ISO-8859-1?Q?Daniel_Sj=F6blom?=

Daniel said:
It is fairly easy, but requires knowledge of swing idiosynchrasies. Here
is some code to get you started (probably munged by posting, try loading
it up in a beautifying editor):
<snip code>

I noticed there were some bugs in the code, swap this for the original
paint method:

public void paint(Graphics g)
{
super.paint(g);

// We need to properly convert the points to match the viewport
// Read docs for viewport
int start =
pane.viewToModel(scrollPane.getViewport().getViewPosition()); //
starting pos in document
int end =
pane.viewToModel(
new Point(
scrollPane.getViewport().getViewPosition().x + pane.getWidth(),
scrollPane.getViewport().getViewPosition().y + pane.getHeight()));
// end pos in doc

// translate offsets to lines
Document doc = pane.getDocument();
int startline = doc.getDefaultRootElement().getElementIndex(start) + 1;
int endline = doc.getDefaultRootElement().getElementIndex(end) + 1;

int fontHeight = g.getFontMetrics(pane.getFont()).getHeight();
int fontDesc = g.getFontMetrics(pane.getFont()).getDescent();
int starting_y = -1;

try
{
starting_y = pane.modelToView(start).y -
scrollPane.getViewport().getViewPosition().y + fontHeight - fontDesc;
}
catch (BadLocationException e1)
{
e1.printStackTrace();
}

for (int line = startline, y = starting_y; line <= endline; y +=
fontHeight, line++)
{
g.drawString(Integer.toString(line), 0, y);
}

}
 
Joined
Dec 31, 2008
Messages
3
Reaction score
0
get Line number

is any way to get the selected line number form jTextArea ?as well as when we give the line number it want to select the entire line!!!
Can any one help to find this.

=?ISO-8859-1?Q?Daniel_Sj=F6blom?= said:
Daniel Sjöblom wrote:

> Fabrice wrote:
>
>> Hi !
>>
>> I would like to know if it is possible to display the line number in a
>> JTextPane ? I design an editor and I'd like to offer the same feature
>> than a programer's notepad that show the number of EACH line at the
>> left side of the text.
>>

>
> It is fairly easy, but requires knowledge of swing idiosynchrasies. Here
> is some code to get you started (probably munged by posting, try loading
> it up in a beautifying editor):

<snip code>

I noticed there were some bugs in the code, swap this for the original
paint method:

public void paint(Graphics g)
{
super.paint(g);

// We need to properly convert the points to match the viewport
// Read docs for viewport
int start =
pane.viewToModel(scrollPane.getViewport().getViewPosition()); //
starting pos in document
int end =
pane.viewToModel(
new Point(
scrollPane.getViewport().getViewPosition().x + pane.getWidth(),
scrollPane.getViewport().getViewPosition().y + pane.getHeight()));
// end pos in doc

// translate offsets to lines
Document doc = pane.getDocument();
int startline = doc.getDefaultRootElement().getElementIndex(start) + 1;
int endline = doc.getDefaultRootElement().getElementIndex(end) + 1;

int fontHeight = g.getFontMetrics(pane.getFont()).getHeight();
int fontDesc = g.getFontMetrics(pane.getFont()).getDescent();
int starting_y = -1;

try
{
starting_y = pane.modelToView(start).y -
scrollPane.getViewport().getViewPosition().y + fontHeight - fontDesc;
}
catch (BadLocationException e1)
{
e1.printStackTrace();
}

for (int line = startline, y = starting_y; line <= endline; y +=
fontHeight, line++)
{
g.drawString(Integer.toString(line), 0, y);
}

}

--
Daniel Sjöblom
Remove _NOSPAM to reply by mail
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,995
Messages
2,570,236
Members
46,825
Latest member
VernonQuy6

Latest Threads

Top