最近项目需求,需要在JTextPane上添加行号等信息,网上找了好久只找到JTextArea添加行号信息,copy网上的程序研究了下,发现自己改改就可以让JTextPane显示行号!

代码:

package com.cml.line;





import java.awt.Color;

import java.awt.FontMetrics;

import java.awt.Component;

import java.awt.Graphics;

import java.awt.Insets;





import javax.swing.JTextArea;

import javax.swing.JTextPane;

import javax.swing.border.AbstractBorder;





public class LineNumberBorder extends AbstractBorder

{

public LineNumberBorder()

{





}





/*

* Insets 对象是容器边界的表示形式。 它指定容器必须在其各个边缘留出的空间。

*/

// 此方法在实例化时自动调用

// 此方法关系到边框是否占用组件的空间

public Insets getBorderInsets(Component c)

{

return getBorderInsets(c, new Insets(0, 0, 0, 0));

}





public Insets getBorderInsets(Component c, Insets insets)

{

if (c instanceof JTextPane)

{

//这里设置行号左边边距

insets.left = 20;

}

return insets;





}





public boolean isBorderOpaque()

{

return false;

}





// 边框的绘制方法

// 此方法必须实现

public void paintBorder(Component c, Graphics g, int x, int y, int width,

int height)

{

// 获得当前剪贴区域的边界矩形。

java.awt.Rectangle clip = g.getClipBounds();

FontMetrics fm = g.getFontMetrics();

int fontHeight = fm.getHeight();





// starting location at the "top" of the page...

// y is the starting baseline for the font...

int ybaseline = y + fm.getAscent();





// now determine if it is the "top" of the page...or somewhere

// else

int startingLineNumber = (clip.y / fontHeight) + 1;





if (startingLineNumber != 1)

{

ybaseline = y + startingLineNumber * fontHeight

- (fontHeight - fm.getAscent());

}





int yend = ybaseline + height;

if (yend > (y + height))

{

yend = y + height;

}

g.setColor(Color.blue);

// 绘制行号

while (ybaseline < yend)

{

String label = padLabel(startingLineNumber, 0, true);





g.drawString(label, 0, ybaseline);

ybaseline += fontHeight;

startingLineNumber++;

}

}





// 寻找适合的数字宽度

private int lineNumberWidth(JTextArea jta)

{

int lineCount = Math.max(jta.getRows(), jta.getLineCount());

return jta.getFontMetrics(jta.getFont()).stringWidth(lineCount + " ");

}





private String padLabel(int lineNumber, int length, boolean addSpace)

{

StringBuffer buffer = new StringBuffer();

buffer.append(lineNumber);

for (int count = (length - buffer.length()); count > 0; count--)

{

buffer.insert(0, ' ');

}

if (addSpace)

{

buffer.append(' ');

}

return buffer.toString();

}





}

源代码是网上下的,下了好久了,忘了是谁的了。

使用时只需哟调用jtextpane的setBorder();方法就可以了!

最新文章

  1. js数组的sort排序详解
  2. oracle 错误代码大全
  3. JSP实现 乘法口诀输出
  4. 02_Swift2基础之常量和变量+注释+分号
  5. gvim配置
  6. Dynamics AX 2012 R2 设置E-Mail
  7. The bundle does not contain an app icon for iPhone / iPod Touch of exactly &#39;57x57&#39; pixels
  8. window.open 使用方法总结
  9. Linux下巧用cat与EOF实现文件的替换和追加
  10. c中有序表的简单定义
  11. P3258 [JLOI2014]松鼠的新家
  12. int和Integer有什么区别?
  13. 目标提取深度神经网络分析权衡 trade offs
  14. Quartz是一个任务调度
  15. vscode中PyLint报错Unable to import解决方案
  16. Endorsement 业务逻辑介绍
  17. picasso 在魅族手机无法加载缩略图的bug
  18. spring boot实战(第二篇)事件监听
  19. 访问控制列表-细说ACL那些事儿(ACL应用篇)
  20. iconnect

热门文章

  1. 简谈” Top K“
  2. api接口安全
  3. Calendar日历类
  4. Java IO 流 -- 设计模式:装饰设计模式
  5. thinkphp5.1+layui2.x 时间戳转换为日期格式
  6. Linux安装jdk(详细教程)
  7. Spring5参考指南:Bean作用域
  8. 墨仓式进入2.0时代?爱普生商用墨仓式L4158试用
  9. 关于 cmd 命令运行时发现错误(已加 classpath): 找不到或无法加载主类 xxx.class 原因: Java .lang.ClassNotFoundException: xxx.class
  10. windows下遍历文件夹