【Java】Swing中JTextPane中如何绘制行号
Oracle在JTextPane类中并没有直接提供显示行号的方法,所以这个功能应该由程序员自己来完成,笔者发现网上很多的显示行号的代码都存在一个问题,就是不准确,特别是在行数变多了以后。
笔者先贴出代码:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Insets; import javax.swing.ImageIcon;
import javax.swing.JTextPane;
import javax.swing.text.AttributeSet;
import javax.swing.text.Element;
import javax.swing.text.Position;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument; public class EditPanel extends JTextPane {
/**
* 是否实现行号,默认不显示
*/
private boolean showLineNumber = false;
private int fontSize = 16;//默认为16号字体 public EditPanel() {
super();
}
public void setShowLineNumber(boolean isShow) {
this.showLineNumber = isShow;
}
public boolean getShowLineNumber() {
return this.showLineNumber;
}
@Override
public void paint(Graphics g) {
super.paint(g);
StyleConstants.setFontSize(getInputAttributes(), getFontSize());
if (getShowLineNumber()) {
drawLineNumber(g);
}
}
protected void drawLineNumber(Graphics g) {
setMargin(new Insets(0, 35, 0, 0));
// 绘制行号的背景色
g.setColor(new Color(180, 180, 180));
g.fillRect(0, 0, 30, getHeight());
// 获得有多少行
StyledDocument docu = getStyledDocument();
Element element = docu.getDefaultRootElement();
int rows = element.getElementCount();
// 绘制行号的颜色
//System.out.println("y:" + getY());
g.setColor(new Color(90, 90, 90));
g.setFont(new Font(getFont().getName(), getFont().getStyle(), 16));
for (int row = 0; row < rows; row++) {
g.drawString((row + 1)+"",2, getPositionY(row + 1));
}
}
public void setFontSize(int fontSize) {
if(fontSize!=12 &&
fontSize!=14 &&
fontSize!=16 &&
fontSize!=18 &&
fontSize!=20 &&
fontSize!=22 &&
fontSize!=24 ){
throw new RuntimeException("该行号不能识别");
}
this.fontSize = fontSize;
}
public int getFontSize() {
return fontSize;
}
/**
* 获得行号中y坐标的位置<br/>
* 在计算的过程中,有一个比率值,该比率值是根据getY()的返回值之差决定的。
* @param row 第几行
* @return 该行的y坐标位置
*/
private int getPositionY(int row) {
int y = 0;
switch (getFontSize()) {
case 12:
y = (row * 18) - 4;
break;
case 14:
y = (row * 20) - 5;
break;
case 16:
y = (row * 23) - 6;
break;
case 18:
y = (row * 26) - 8;
break;
case 20:
y = (row * 29) - 10;
break;
case 22:
y = (row * 31) - 11;
break;
case 24:
y = (row * 34) - 12;
break;
}
return y;
}
}
EditPanel.java
测试为:
public static void main(String[] args) {
JFrame jf=new JFrame("行号测试");
EditPanel panel=new EditPanel();
panel.setShowLineNumber(true);//显示行号
jf.add(new JScrollPane(panel));
jf.setPreferredSize(new Dimension(600,400));
jf.pack();
jf.setVisible(true);
}
效果图:

一般在绘制行号的时候,都会牵扯到一个问题,就是如何定位Y的位置。笔者对这个问题的解决思路已经体现在上面的代码中了,下面再详细说一下。
首先贴出的EditPanel类中getPostionY()方法的部分代码:
switch (getFontSize()) {
case 12:
y = (row * 18) - 4;
break;
这里需要注意,这个18是由getY()获取得来的,在paint(Griphics g)中,打印getY()的值,然后得出变化的差值。经过笔者的测试发现,若字体设置为12号,那么getY()的变化差值就是18,那么每次行号Y的位置就是就是(第几行*18)的值,就可以让行号在每一行的前面了。然后再减4,是为了把行号往上提一点,显得好看。
其他的值以此类推。
【Java】Swing中JTextPane中如何绘制行号的更多相关文章
- Sqlite中使用rowid来表示行号,用于分页。
在SQLite的查询结果中显示行号,可以使用select rowid as RowNumber ,* from WSCLanguage: select rowid as RowNumber ,* fr ...
- Java Swing:JPanel中添加JPanel
1. JPanel默认布局是FlowLayout,如果不设置父JPanel的布局,则子JPanel自动填满父JPanel. JPanel jpanel = new JPanel(); jpanel.s ...
- EXTJS中的grid显示实际行号
添加一个新的功能 Ext.grid.PageRowNumberer = Ext.extend(Ext.grid.RowNumberer, { width : 40, renderer:function ...
- Xtrareport绘制行号
需要是用事件beforePrint (在打印数据之前的事件) private void xrTableCell12_BeforePrint(object sender, System.Drawing. ...
- JTextpane 加入的行号
最近项目需求,在需求JTextPane加入行号等信息,网上找了半天才发现JTextArea加入行号信息.copy正在研究在线程序.他发现自己能够做出改变来改变JTextPane显示行号. 代码: pa ...
- VIM 中鼠标选择不选中行号
VIM 中鼠标选择不选中行号 在Vim中,我们一般会使用 :set nu 打开行号开关. 但是打开行号后,有个弊端,那就是在用鼠标进行选择的时候,会将前面的行号也一起进行拷贝了.但是在gVim中进行选 ...
- C# DataGridView显示行号的三种方法
方法一: 网上最常见的做法是用DataGridView的RowPostPaint事件在RowHeaderCell中绘制行号: private void dgGrid_RowPostPaint( obj ...
- DataGridView显示行号的几种方法来自http://www.soaspx.com/dotnet/csharp/csharp_20100204_2740.html
方法一: 网上最常见的做法是用DataGridView的RowPostPaint事件在RowHeaderCell中绘制行号: private void dataGridView1_RowPostPai ...
- 【转】DataGridView显示行号
ref:http://blog.csdn.net/xieyufei/article/details/9769631 方法一: 网上最常见的做法是用DataGridView的RowPostPaint事件 ...
随机推荐
- 星文快投v2全新升级
2017-07-31 关于“星文快投”,我的初衷是:简单.稳定.可定制的投标软件.前期版本其实也基本达到这个目标了,系统跑起来后,几天下来也累积过手三十多万个标的了,自动投标也工作正常,作为一个纯粹的 ...
- docker swarm join如何获取token
在运行docker swarm join的时候需要一个token参数,如何知道这个参数那? [答案] Join as a worker node To retrieve the join comman ...
- ASP入门(十九)- SELECT 语句
SELECT 语法 Access 中 SELECT 完整语法如下: SELECT [predicate] { * | table.* | [table.]field1 [AS alias1] [, [ ...
- C#.NET常见问题(FAQ)-如何设置控件水平对齐,垂直对齐
如果要设置一些控件垂直对齐,点击这个按钮 如果要设置水平对齐,则点击这个按钮,选中控件之后点击左对齐(多个按钮都试下吧,总归能对齐到你要的效果的) 更多教学视频和资料下载,欢迎关注以下信息: ...
- android中动态修改ImageView控件的宽高度
本例实现了动态修改ImageView控件的宽高度,有两个按钮,一个按钮实现放大image,一个按钮实现缩小image activity_main.xml <?xml version=" ...
- JNotify的监测文件变化的简单测试例子
一.理由 使用JNotify监测的更全面,更快速. 二.参考代码 import net.contentobjects.jnotify.JNotify; import net.contentobject ...
- NGINX高并发配置
1. worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8). 2. worker_cpu_affinity 000 ...
- SpringBoot 分页处理
开始主要是要使用已经设计好的数据库 -- ---------------------------------------------------- -- 用户 -- ----------------- ...
- Configutation读取properties文件信息
commons configuration可以很方便的访问配置文件和xml文件中的的内容.Commons Configuration 是为了提供对属性文件.XML文件.JNDI资源.来自JDBC Da ...
- Ajax实现文件上传的临时垃圾文件回收策略
转载请注明原文出处:http://www.cnblogs.com/ygj0930/p/6126240.html 在我们web开发过程中,一个很重要的技术就是Ajax(异步传输).Ajax通过把数据从网 ...