最近项目需求,在需求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. 【Java】Swing中JTextPane中如何绘制行号

    Oracle在JTextPane类中并没有直接提供显示行号的方法,所以这个功能应该由程序员自己来完成,笔者发现网上很多的显示行号的代码都存在一个问题,就是不准确,特别是在行数变多了以后. 笔者先贴出代 ...

  2. linux vim 插入行号

    1 在文本中插入行号 最近有朋友提到某编辑器有一个可以插入行号的插件,问Vim有没有办法可以在文章中插入行号.%$^&*#8~#$@#!--让我们看一下有多少种方式可以在vim中插入行号或数字 ...

  3. vim 加行号 和取消行号

    :set nu #是加行号 :set nonu #是去掉行号

  4. databtables 设置(显示)行号

    var table = $('#priceStrategtyTable').DataTable({         "rowCallback": function( row, da ...

  5. EasyUI datagrid : 启用行号、固定列及多级表头后,头部行号位置单元格错位的问题

    症状如图: 上图中,行号列与checkbox 列融合了.解决方法是在datagrid 的 onLoadSuccess 事件中加入如下代码: var opts = $(this).datagrid('o ...

  6. Android studio 显示代码行号 设置

    首先我们打开我们的Android Studio.   这时会弹出setting页面,我们选择show line numbers然后点击确定按钮.   此时我们就可以看到代码左侧显示出行号了   我们可 ...

  7. gedit 没有preference项,使preference回归,并用命令行设置行号,text wrapping等

    1.最简单的,使preference选项回来: gsettings set org.gnome.settings-daemon.plugins.xsettings overrides '@a{sv} ...

  8. vc6.0如何显示行号以及出现版本不兼容问题

    有时编译时,提示某某行有错,但是要定位到某一行的话,如果在编辑页面能够将行号显示出来,查找也就更方便了,下面我来介绍一下让VC6.0显示行号的方法.   工具/原料   VC6.0.显示行号的插件 方 ...

  9. .NET批量删除代码前的行号

    1 EmEditor Pro.EditPlus .visual studio   ,把有行号的代码粘贴进去,按住键盘的Alt键,然后用鼠标拖出选择框列选行号,最后按Delete删除行号; 2 使用正则 ...

随机推荐

  1. (转)使用qemu-img管理虚拟机磁盘镜像(创建虚拟机,虚拟机快照)

    转自:http://blog.csdn.net/bravezhe/article/details/8461386 一台虚拟机的核心就是一个磁盘镜像,这个镜像可以理解成虚拟机的磁盘,里面有虚拟机的操作系 ...

  2. STL algorithm算法mov,move_backward(38)

    move原型: std::move template <class InputIterator, class OutputIterator> OutputIterator move (In ...

  3. 关于LWIP断开网线后重连问题(热插拔问题)

    近期在弄STM32+LWIP协议.在网络拔掉网线情况下.无法又一次连接. 网上找了好多方法都没有实现,着实郁闷! 后来无意间看到了临时解决这一问题的方法.尽管不是那么完美,但最算能解决这个问题.分享给 ...

  4. C++ Tricks(一)—— 判断字符串 string 对象的所有字符都相等

    S == string(S.size(), S[0]);

  5. UVA 11136 - Hoax or what (可以提交了,不会Submission error了)

    看题传送门:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  6. 记一次内存泄漏调试(memory leak)-Driver Monkey

    Author:DriverMonkey Mail:bookworepeng@Hotmail.com Phone:13410905075 QQ:196568501 硬件环境:AM335X 软件环境:li ...

  7. js进阶 12-6 如何获取正在发生事件的名字和是哪个元素在发生事件

    js进阶 12-6 如何获取正在发生事件的名字和是哪个元素在发生事件 一.总结 一句话总结:event.type 描述事件的类型.        event.target 触发该事件的 DOM 元素. ...

  8. STATUS CODE: 91, occurs when trying to move media from one volume pool to another.

    Overview:Symantec NetBackup (tm) will not allow a tape with active images to be moved from one volum ...

  9. POJ 题目2506Tiling(大数)

    Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8128   Accepted: 3941 Descriptio ...

  10. Xavier Initialization 的理解与推导(及实现)

    在 caffe mnist tutorial 的实现中,有如下的语句: weight_filter = {type: "xavier"}; 随后的解释中指出,本实现将使用 xavi ...