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

 

}

这有个问题,这段代码在Eclipse中老是说有毛病,不能保存,单独编译运行时一定问题也没有,这是怎么回事?

(半小时后……)

 一点事也没有的,刚我的Eclipse出问题了。

成功,成功实现了显示LineNumber的功能,昨天实现了打印,今天又实现了这个LineNumber,嘻嘻……

 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值