JTextpane 添加行号
最近项目需求,需要在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();方法就可以了!
最新文章
- js数组的sort排序详解
- oracle 错误代码大全
- JSP实现 乘法口诀输出
- 02_Swift2基础之常量和变量+注释+分号
- gvim配置
- Dynamics AX 2012 R2 设置E-Mail
- The bundle does not contain an app icon for iPhone / iPod Touch of exactly &#39;57x57&#39; pixels
- window.open 使用方法总结
- Linux下巧用cat与EOF实现文件的替换和追加
- c中有序表的简单定义
- P3258 [JLOI2014]松鼠的新家
- int和Integer有什么区别?
- 目标提取深度神经网络分析权衡 trade offs
- Quartz是一个任务调度
- vscode中PyLint报错Unable to import解决方案
- Endorsement 业务逻辑介绍
- picasso 在魅族手机无法加载缩略图的bug
- spring boot实战(第二篇)事件监听
- 访问控制列表-细说ACL那些事儿(ACL应用篇)
- iconnect
热门文章
- 简谈” Top K“
- api接口安全
- Calendar日历类
- Java IO 流 -- 设计模式:装饰设计模式
- thinkphp5.1+layui2.x 时间戳转换为日期格式
- Linux安装jdk(详细教程)
- Spring5参考指南:Bean作用域
- 墨仓式进入2.0时代?爱普生商用墨仓式L4158试用
- 关于 cmd 命令运行时发现错误(已加 classpath): 找不到或无法加载主类 xxx.class 原因: Java .lang.ClassNotFoundException: xxx.class
- windows下遍历文件夹