服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jtextarea中显示linenumber

//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();
        }

}

扫描关注微信公众号