如何更改 JTextPane 中特定单词的颜色?

2023-12-11

如何更改特定单词的颜色JTextPane就在用户打字时? 我应该覆盖吗JTextPane paintComponent method?


不。您不应该重写 PaintComponent() 方法。相反,你应该使用StyledDocument。您还应该自行界定单词。

这是演示,在输入时将“公共”、“受保护”和“私有”变成红色,就像一个简单的代码编辑器一样:

enter image description here

import javax.swing.*;
import java.awt.*;
import javax.swing.text.*;

public class Test extends JFrame {
    private int findLastNonWordChar (String text, int index) {
        while (--index >= 0) {
            if (String.valueOf(text.charAt(index)).matches("\\W")) {
                break;
            }
        }
        return index;
    }

    private int findFirstNonWordChar (String text, int index) {
        while (index < text.length()) {
            if (String.valueOf(text.charAt(index)).matches("\\W")) {
                break;
            }
            index++;
        }
        return index;
    }

    public Test () {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(400, 400);
        setLocationRelativeTo(null);

        final StyleContext cont = StyleContext.getDefaultStyleContext();
        final AttributeSet attr = cont.addAttribute(cont.getEmptySet(), StyleConstants.Foreground, Color.RED);
        final AttributeSet attrBlack = cont.addAttribute(cont.getEmptySet(), StyleConstants.Foreground, Color.BLACK);
        DefaultStyledDocument doc = new DefaultStyledDocument() {
            public void insertString (int offset, String str, AttributeSet a) throws BadLocationException {
                super.insertString(offset, str, a);

                String text = getText(0, getLength());
                int before = findLastNonWordChar(text, offset);
                if (before < 0) before = 0;
                int after = findFirstNonWordChar(text, offset + str.length());
                int wordL = before;
                int wordR = before;

                while (wordR <= after) {
                    if (wordR == after || String.valueOf(text.charAt(wordR)).matches("\\W")) {
                        if (text.substring(wordL, wordR).matches("(\\W)*(private|public|protected)"))
                            setCharacterAttributes(wordL, wordR - wordL, attr, false);
                        else
                            setCharacterAttributes(wordL, wordR - wordL, attrBlack, false);
                        wordL = wordR;
                    }
                    wordR++;
                }
            }

            public void remove (int offs, int len) throws BadLocationException {
                super.remove(offs, len);

                String text = getText(0, getLength());
                int before = findLastNonWordChar(text, offs);
                if (before < 0) before = 0;
                int after = findFirstNonWordChar(text, offs);

                if (text.substring(before, after).matches("(\\W)*(private|public|protected)")) {
                    setCharacterAttributes(before, after - before, attr, false);
                } else {
                    setCharacterAttributes(before, after - before, attrBlack, false);
                }
            }
        };
        JTextPane txt = new JTextPane(doc);
        txt.setText("public class Hi {}");
        add(new JScrollPane(txt));
        setVisible(true);
    }

    public static void main (String args[]) {
        new Test();
    }
}

代码不是那么漂亮,因为我输入得很快,但它可以工作。我希望它能给你一些提示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改 JTextPane 中特定单词的颜色? 的相关文章

  • 不同帐户上的 Spring Boot、JmsListener 和 SQS 队列

    我正在尝试开发一个 Spring Boot 1 5 应用程序 该应用程序需要侦听来自两个不同 AWS 帐户的 SQS 队列 是否可以使用 JmsListener 注解创建监听器 我已检查权限是否正确 我可以使用 getQueueUrl 获取
  • Spring应用中Eureka健康检查的问题

    我正在开发一个基于 Spring 的应用程序 其中包含多个微服务 我的一个微服务充当尤里卡服务器 到目前为止一切正常 在我所有其他微服务中 用 EnableEurekaClient 我想启用这样的健康检查 应用程序 yml eureka c
  • Junit:如何测试从属性文件读取属性的方法

    嗨 我有课ReadProperty其中有一个方法ReadPropertyFile返回类型的Myclass从属性文件读取参数值并返回Myclass目的 我需要帮助来测试ReadPropertyFile方法与JUnit 如果可能的话使用模拟文件
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • .properties 中的通配符

    是否存在任何方法 我可以将通配符添加到属性文件中 并且具有所有含义 例如a b c d lalalala 或为所有以结尾的内容设置一个正则表达式a b c anything 普通的 Java 属性文件无法处理这个问题 不 请记住 它实际上是
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • 过滤两次 Lambda Java

    我有一个清单如下 1 2 3 4 5 6 7 和 预期结果必须是 1 2 3 4 5 6 7 我知道怎么做才能到7点 我的结果 1 2 3 4 5 6 我也想知道如何输入 7 我添加了i gt i objList size 1到我的过滤器
  • HSQL - 识别打开连接的数量

    我正在使用嵌入式 HSQL 数据库服务器 有什么方法可以识别活动打开连接的数量吗 Yes SELECT COUNT FROM INFORMATION SCHEMA SYSTEM SESSIONS
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 为什么 Java 8 不允许非公共默认方法?

    让我们举个例子 public interface Testerface default public String example return Hello public class Tester implements Testerface
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 使用反射覆盖最终静态字段是否有限制?

    在我的一些单元测试中 我在最终静态字段上的反射中遇到了奇怪的行为 下面是说明我的问题的示例 我有一个基本的 Singleton 类 其中包含一个 Integer public class BasicHolder private static
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类

随机推荐

  • Python中根据多个条件返回列的方法

    我有一个数据框如下 基于一些条件 我需要检索该列 Wifi User1 Wifi User2 Wifi User3 Thermostat Act User1 Act User2 Act User3 58 48 60 18 0 1 0 60
  • Webkit 和 Excel 文件(PHPexcel)

    我有一个可以下载的 excel 文件 例如 NAME xlsx 很好 它在 firefox 中工作 但在 webkit safari chrome 中它也附加到名称扩展名 xhtml那么它的名称将是 NAME xlsx html 它应该是仅
  • 如何创建数字选择器对话框?

    我希望能够创建一个对话框 允许用户从指定范围中选择一个数字 我知道现有的小部件 例如来自 Quietlycoding 的小部件和 SimonVT 的小部件 已经做到了这一点 但我很难将它们正确地集成到我的应用程序中 此外 这些主要是小部件
  • MySQL - 当嵌套选择使用该表时如何从表中删除?

    我正在尝试做这样的事情 DELETE FROM table 1 WHERE table 1 id IN SELECT table 1 id FROM table 1 table 2 table 3 WHERE table 1 id tabl
  • 像 xcode 一样批量优化 iphone/ipad 显示的 PNG

    我正在为 ipad 开发杂志查看器 但我在性能方面遇到了困难 我发现显示 png 最昂贵的部分是加载过程 我知道 xcode 能够在构建过程中优化 png 并且此类图像的加载速度要快得多 但我无法将所有图像都包含到构建中 因为它会很大 您知
  • Angular2 路由器中的生命周期挂钩

    在 angular2 路由器中添加生命周期挂钩时遇到问题 如果任何人都可以分享在 Angular2 路由器中添加生命周期挂钩的代码 那将会很有帮助 我了解了如何添加 可以激活 挂钩 感谢埃里克的帮助 与其他生命周期挂钩不同 CanActiv
  • WCF REST 错误 HTTP 307

    我有一个 REST WCF 服务 当尝试对此服务执行如下操作的 POST 时 我收到以下错误 OperationContract WebInvoke Method POST UriTemplate RequestFormat WebMess
  • 有没有一种干净的方法可以在 Spring Web API 中将字符串返回为 json?

    例如 我必须执行如下 RequestMapping value get string method RequestMethod GET public ResponseBody String getString return Hello Wo
  • Python <> 运算符是什么

    到底是什么 lt gt Python 中的运算符 为什么它没有文档记录 据我所知 是不是一样 or is not In Python 2 x lt gt 是相同的 i e 不等于 而不是is not这是 不等同于 但后者是首选 比较运算符
  • MySQL:要求 SSL 未显示在拨款中

    MySQL 8 不显示REQUIRE SSL in the SHOW GRANTS output 在 MariaDB 上 当我使用创建用户时REQUIRE SSL 它显示在补助金中 Server version 10 2 22 MariaD
  • 如何将 C# 数据表传递给 JavaScript 函数

    我在代码隐藏中有这些数据 并尝试以各种格式将其传递给 javascript 函数 列表数组 json 字符串 但无法通过 javascript var 对象获取数据 这是后面代码中最后一个数据格式 List
  • 如何阻止 Visual Studio“发布网站”发布我的 ReSharper 文件夹?

    这真的很烦人 因为它们不是该项目的一部分 我知道这确实很旧 但也许我的回复会对其他人有所帮助 我在这里找到了解决方案 http www meadow se wordpress p 137 基本上 将这些行添加到选项卡上方 Web 部署项目文
  • Windows 7 上的 XAMPP 上的 Kohana 3.2 错误:目录 APPPATH\cache 必须可写

    当我查看使用 Kohana 3 2 创建的网站时 会出现狂野的错误 Kohana Exception 0 目录 APPPATH cache 必须可写 我使用 Windows 7 和 XAMPP 但不知道该怎么做 因为目录 logs 是可写的
  • 数据框中列表列的极坐标交集

    import polars as pl df pl DataFrame a 1 2 3 8 9 4 b 2 3 4 4 5 6 所以给定数据帧 df a b 1 2 3 2 3 4 8 9 4 4 5 6 我想要一个c列 它是a和b的交集
  • 解决方案克隆发生在连续产生“新的最佳分数”的步骤中

    最近引起我注意的是 当产生 新的最佳成绩 时 步子比其他人慢 这绝对是在产生 新的最佳分数 的每一步中发生的解决方案克隆 因此 如果 新的最佳得分 步骤不是连续的 这也没关系 例如 如果我们连续执行 50 个步骤 则解决方案克隆过程将执行
  • 使用 boost 通过 TCP 序列化和发送对象

    我正在尝试通过 tcp 连接发送 C 对象 我的对象都是可序列化的 使用增强序列化 TCP服务器 客户端是用boost asio制作的 基本上我想发送这样的消息 其中包含消息类型 正在发送的对象的类型 和数据本身 序列化对象 以及数据的大小
  • 如何使用 CLI 2.x 添加 preAuthorizedApplications

    在 Azure AD 中 在公开 API 部分下 我希望使用 CLI 2 x 自动注册 API 和 Web 应用程序 我查看了文件here但找不到任何涉及 preAuthorizedApplications 的内容 搜索仅产生了遗留支持的信
  • 为什么释放堆内存比分配它慢得多?

    这是一个经验假设 分配比解除分配更快 这也是one我猜想 为什么基于堆的存储 比如STL容器或其他 选择不将当前未使用的内存返回给系统 这就是为什么缩小以适合成语诞生 当然 我们不应该混淆 heap 记忆与 heap 类似的数据结构 So
  • 有人可以向我解释 git diff 在这里看到什么区别吗?

    我在 Windows 7 上通过 msysgit 使用 git 最近让我非常痛苦的一个问题是 一旦我切换到某些分支 git 就会认为某些文件已被更改 然后我无能为力让它停止认为这些文件已更改 在我的案例中重现的步骤 可能与每个人都不相关 如
  • 如何更改 JTextPane 中特定单词的颜色?

    如何更改特定单词的颜色JTextPane就在用户打字时 我应该覆盖吗JTextPane paintComponent method 不 您不应该重写 PaintComponent 方法 相反 你应该使用StyledDocument 您还应该