//package trylinenumber;
import java.awt.borderlayout;
import java.awt.dimension;
import java.awt.graphics;
import java.awt.point;
import javax.swing.jframe;
import javax.swing.jtextarea;
import javax.swing.jpanel;
import javax.swing.jscrollpane;
//import javax.swing.jtextpane;
import javax.swing.text.badlocationexception;
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;
jtextarea 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
pane = new jtextarea()
{
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) + 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);
}
}
// 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();
}
}
闽公网安备 35060202000074号