JTextArea 中显示行号
答案:2 悬赏:40 手机版
解决时间 2021-03-18 18:20
- 提问者网友:城市野鹿
- 2021-03-18 07:30
JTextArea 中显示行号
最佳答案
- 五星知识达人网友:山君与见山
- 2021-03-18 08:14
//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;
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.setVisible(true);
}
}
JTextArea本身应该不支持的,可以自己显示在JPanel上面
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;
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.setVisible(true);
}
}
JTextArea本身应该不支持的,可以自己显示在JPanel上面
全部回答
- 1楼网友:逃夭
- 2021-03-18 08:48
我看过一个c++显示行好的代码。
它是用记录做的,就是输入时记录输入了多少字,然后每行有多少字,从而得到当前位置是第几行。
你试试看。
它是用记录做的,就是输入时记录输入了多少字,然后每行有多少字,从而得到当前位置是第几行。
你试试看。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯