文档章节

Swing编辑器显示行号

LiShixi
 LiShixi
发布于 2016/11/16 10:14
字数 319
阅读 51
收藏 0

输入图片说明

下面类的实现是在网上找的,目前实现的原理看不太懂,先用起来。

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Rectangle;

/**
 *
 * XX
 */
public class JLineNumTextPane extends javax.swing.JComponent {

    /**
     * JAVA TextArea行数显示插件
     */
    private static final long serialVersionUID = 1L;
    public final Font DEFAULT_FONT = new Font(Font.MONOSPACED, Font.PLAIN, 11);
    public final Color DEFAULT_BACKGROUD = new Color(228, 228, 228);
    public final Color DEFAULT_FOREGROUD = Color.BLACK;
    public final int nHEIGHT = Integer.MAX_VALUE - 1000000;
    public final int MARGIN = 5;
    private int lineHeight;
    private int fontLineHeight;
    private int currentRowWidth;
    private FontMetrics fontMetrics;

    public JLineNumTextPane() {
        setFont(DEFAULT_FONT);
        setForeground(DEFAULT_FOREGROUD);
        setBackground(DEFAULT_BACKGROUD);
        setPreferredSize(9999);
    }

    public void setPreferredSize(int row) {
        int width = fontMetrics.stringWidth(String.valueOf(row));
        if (currentRowWidth < width) {
            currentRowWidth = width;
            setPreferredSize(new Dimension(2 * MARGIN + width + 1, nHEIGHT));
        }
    }

    @Override
    public void setFont(Font font) {
        super.setFont(font);
        fontMetrics = getFontMetrics(getFont());
        fontLineHeight = fontMetrics.getHeight();
    }

    public int getLineHeight() {
        if (lineHeight == 0) {
            return fontLineHeight;
        }
        return lineHeight;
    }

    public void setLineHeight(int lineHeight) {
        if (lineHeight > 0) {
            this.lineHeight = lineHeight;
        }
    }

    public int getStartOffset() {
        return 4;
    }

    @Override
    protected void paintComponent(Graphics g) {
        int nlineHeight = getLineHeight();
        int startOffset = getStartOffset();
        Rectangle drawHere = g.getClipBounds();
        g.setColor(getBackground());
        g.fillRect(drawHere.x, drawHere.y, drawHere.width, drawHere.height);
        g.setColor(getForeground());
        int startLineNum = (drawHere.y / nlineHeight) + 1;
        int endLineNum = startLineNum + (drawHere.height / nlineHeight);
        int start = (drawHere.y / nlineHeight) * nlineHeight + nlineHeight - startOffset;
        for (int i = startLineNum; i <= endLineNum; ++i) {
            String lineNum = String.valueOf(i);
            int width = fontMetrics.stringWidth(lineNum);
            g.drawString(lineNum + " ", MARGIN + currentRowWidth - width - 1, start);
            start += nlineHeight;
        }
        setPreferredSize(endLineNum);
    }
    
    
}

使用: 编辑器空间(JTextArea、JTextPane等)放在JScrollPane内,给JScrollPane设置JViewport,JViewpo放入JLineNumTextPane。

jViewport2 = new JViewport();
jLineNumTextPane1 = new JLineNumTextPane();
jViewport2.add(jLineNumTextPane1);
jScrollPane1.setRowHeader(jViewport2);

最后,为了内容和行号对齐,设置内间距和字体:

  jTextPane1.setFont(jLineNumTextPane1.DEFAULT_FONT); 
  jTextPane1.setMargin(new Insets( 0,jLineNumTextPane1.MARGIN,0,jLineNumTextPane1.MARGIN));

© 著作权归作者所有

LiShixi
粉丝 12
博文 121
码字总数 22979
作品 0
南京
程序员
私信 提问
java写的半成品编辑器开源了

前段时间,突然的心血来潮,想用java写一个编辑器,于是兴奋的写了三个月,硬着头皮又写了两个月,实在受不了了,不想再在字符串里转来转去了,并且感觉以现在的实现方式,有些高级功能基本不...

hunterli
2011/03/08
620
0
VI前传之--EX行编辑器学习

本来准备写一篇VI的学习笔记,看了一半发现得先写一篇关于EX行编辑器的学习笔记,vi是更底层的ex行编辑器的可视模式,很多ex的命令在vi中也很好用 ex的命令行以:开始,然后接各种命令,ex的...

China_OS
2011/12/17
558
0
PyCharm入门教程——基本编辑程序

PyCharm最新版本下载 JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外,该IDE提供了一些高级功能,以用于Django框架下的专业Web...

电池盒
01/23
14
0
Vi编辑器的使用

Vi编辑器的使用 (vim是vi编辑器的升级版,用法一样) i 进入文本编辑,Esc表示退出编辑状态 :wq 保存退出 :wq! 强制保存呢退出 :q! 表示强制不保存退出 :q 表示不保存退出 查找指令: ...

片刻
2015/12/14
88
0
JavaSwing_4.8: JTable(表格)

本文链接: http://blog.csdn.net/xietansheng/article/details/78079806 Java Swing 图形界面开发(目录) 1. 概述 官方JavaDocsApi: javax.swing.JTable ,表格。JTable 是用来显示和编辑常...

xietansheng
2017/09/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

02.日志系统:一条SQL更新语句是如何执行的?

我们还是从一个表的一条更新语句说起,我们创建下面一张表: create table T(ID int primary key, c int); 如果要将ID=2这一行c的值加1,SQL可以这么写: update T set c=c+1 where ID=2; 前...

scgaopan
今天
7
0
【五分钟系列】掌握vscode调试技巧

调试前端js 准备一个前端项目 index.html <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1......

aoping
今天
6
0
PhotoShop 高级应用:USM锐化/S锐化/防抖

、 高反差锐化+混合模式:叠加模式 【将更多的边缘细节添加到图像中】

东方墨天
今天
7
0
Python数据可视化之matplotlib

常用模块导入 import numpy as npimport matplotlibimport matplotlib.mlab as mlabimport matplotlib.pyplot as pltimport matplotlib.font_manager as fmfrom mpl_toolkits.mplot3d i......

松鼠大帝
昨天
5
0
我用Bash编写了一个扫雷游戏

我在编程教学方面不是专家,但当我想更好掌握某一样东西时,会试着找出让自己乐在其中的方法。比方说,当我想在 shell 编程方面更进一步时,我决定用 Bash 编写一个扫雷游戏来加以练习。 我在...

老孟的Linux私房菜
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部