最近项目需求,需要在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();方法就可以了!

JTextpane 添加行号的更多相关文章

  1. Winform DataGridView控件添加行号

      有很多种方法,这里介绍三种: A: 控件的RowStateChanged事件中添加,RowStateChanged事件是在行的状态更改(例如,失去或获得输入焦点)时发生的事件: e.Row.Hea ...

  2. 给ListView视图添加行号

    最后的效果如下: 更新,集成一个独立的模块而不改变源文件的方式更为稳妥. 购买地址:https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-26531 ...

  3. 为 DataGridView 控件添加行号

    虽然好像不经常用到,不过还是记下来防止以后用到 /// <summary> /// 为 DataGridView 控件添加行号 /// </summary> /// <p ...

  4. Python_添加行号

    filename='demo.py' with open(filename,'r')as fp: lines=fp.readlines() #读取所有行 maxLength=max(map(len,l ...

  5. vim 永久添加行号

    sudo vi /etc/vim/vimrc 打开vimrc文件,最下面添加set nu,保存就可以添加行号了,set autoindent是自动换行

  6. 微软BI 之SSIS 系列 - 通过 ROW_NUMBER 或 Script Component 为数据流输出添加行号的方法

    开篇介绍 上午在天善回答看到这个问题 - SSIS 导出数据文件,能否在第一列增加一个行号,很快就帮助解决了,方法就是在 SQL 查询的时候加一个 ROW_NUMBER() 就可以了. 后来想起在两年 ...

  7. mysql 添加行号

    首先准备演示数 DROP TABLE IF EXISTS `computer_stu`; CREATE TABLE `computer_stu` ( `id` ) NOT NULL, `name` ) ...

  8. 在VIM中添加行号的方法

    VIM编辑器是可以显示行号的.但是,有时候我们需要在整个代码的行首添加行号.怎么实现呢?实现的方法有很多,这里就介绍我知道的一种吧. 在每行行首添加某个字符串 :%s/^/your_string/ 在 ...

  9. java 对readLine扩展添加行号样式

    java 的流的使用中,在字符缓冲输入流中,有一个每次读取一行数据的方法:readLine(): 在这里使用简单的继承方法对其继续扩展,使得返回每行前面添加序号 //需要导入的一些包 import j ...

随机推荐

  1. 嵌入式-01-LinuxC语言

    一.必备Linux命令和C语言基础 1.Linux环境搭建(在第一阶段有提及). 2.文件和目录相关命令(一) (1)Linux的文件系统结构 /bin./boot./dev./etc./home./ ...

  2. python执行提示“ImportError: No module named OpenSSL.crypto”

    错误信息如下: Traceback (most recent call last): File "/usr/local/yunanbao/yxz-script/autoops/TaskSer ...

  3. react: nextJs koa project basic structure

    1.init nextJs project npm init npm install react react-dom next config script in package.json " ...

  4. Java中的字符串操作(比较String,StringBuiler和StringBuffer)

    一.前言 刚开始学习Java时,作为只会C语言的小白,就为其中的字符串操作而感到震撼.相比之下,C语言在字节数组中保存一个结尾的\0去表示字符串,想实现字符串拼接,还需要调用strcpy库函数或者自己 ...

  5. 0day学习笔记(2)--函数调用

    函数调用过程 调用函数操作 函数参数入栈(在当前函数栈帧),从左至右或从右至左视情况而定 一般为从右至左 mov 地址,参数 的一个操作并不直接pop而是定位到地址将参数传递进去 call offse ...

  6. 数组的forEach和map和for方法的区别

    一.定义 foreach():  从头到尾遍历数组,为每个元素调用指定的函数. map():  将调用的数组的每个元素传递给指定的函数,并返回一个数组,他包含该函数的返回值. 传递的函数是 forea ...

  7. php header() 常用content-type

    //定义编码 header( 'Content-Type:text/html;charset=utf-8 '); //Atom header('Content-type: application/at ...

  8. [Python] bytes 转换成 str

    b = b"example" # bytes object s = "example" # str object sb = bytes(s, encoding ...

  9. beetl 模板语法

    如何定义临时变量 @var tmp = false; 如何给临时变量赋值 @tmp = true; 如何在判断中使用临时变量 @if(tmp){ ... @} 如何使用条件语句 if else @if ...

  10. ES6特性之:参数默认值

    作为一个开发者,跟进行业步伐是非常需要的,不能躺在现有的知识和经验温床上做美梦.JavaScript的ES2015标准(即我们说的ES6)在2016年已经被广泛应用了,还没开始使用的朋友,赶紧来磨一下 ...