【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事件 ...
随机推荐
- Mysql 创建表时错误:Tablespace for table `tablexx` exists. Please DISCARD the tablespace before IMPORT.
在本地的一个数据库创建表时意外的出现了以下错误,说是表已经存在了 但通过desc 查看表信息时又说表不存在 在本地系统搜索表名却发现一个.ibd文件[InnoDB File] 在删除了该.ibd文件文 ...
- ASP入门(十六)-ASP开发的规范
毋容置疑,在开发中遵守一套规范,将会有利于提高代码的可读性,较低后期维护成本. 文件存放目录规范 js 目录下存放着页面所使用的 JavaScript 脚本文件,因为我们可能用到第三方提供的免费的 J ...
- MySQL8.0手动安装心得。
https://dev.mysql.com/downloads/mysql/ mysql从5.7一下子跳跃到了8.0,其中的改变还是很大,有点这里就不说了,小伙伴们自己去百度了解一下,这里重点说一下, ...
- [幽默漫画]对于程序猿来说deadline很容易搞定!
更多漫画在这里
- Eclipse导入git上的maven web项目 部署 - lpshou
http://www.tuicool.com/articles/fqm2Qf 推酷 文章 微博 主题 站点 活动 应用 周刊 登录 Eclipse导入git上的maven web项目 部署 - ...
- LintCode: Restore IP Address
C++ string::substr(start_pos, length) vector::push_back(element) class Solution { public: vector< ...
- HttpClient Restful Post 请求
public static void main(String[] args) { SbVo sb = new SbVo(); sb.setBusiness("SB"); sb.se ...
- python——从datetime模块探索python的数据架构
问题出现于我试图向自建网页中加入实时时间开始. 我之前已经知道python中有有关事件和日期的模块datetime.以下导入datetime并作实验. >>> import date ...
- Visual Studio修改可执行程序的文件名和路径
- String的一些方法试探
package countio; import java.io.BufferedReader; import java.io.File; import java.io.FileReader; impo ...