如何突出显示 JLabel 的一部分?

2023-11-26

在任何人建议 HTML 之前,我稍后会解释为什么这里不选择 HTML。我有一个表,其中包含一列,其中包含文本单元格。我需要能够突出显示每个单元格中的一些文本。例如,如果单元格包含“cat foo dog”...我可能想突出显示 foo。

我当前的方法是使用自定义 TableCellRenderer,将 html 放入 JLabel 组件中进行渲染,并且一度效果很好。然后我注意到,当单元格中的文本变得太长而无法适应列宽时,它只是截断文本,而没有在这种情况下通常发生的正常“...”。因此,用户不知道还有更多他们没有看到的文本。另一个问题是,如果原始文本本身包含 HTML(在我的情况下有时会包含 HTML),则单元格将无法正确呈现。我知道我可以逃避 html 但我仍然会遇到以前的问题。

如果我使用 jlabel 以外的组件,那么它会使我的表格单元格看起来很奇怪。有没有人有什么建议?谢谢


好吧,这是一个解决方案。

简而言之,您可以子类化JLabel手动绘制高光。覆盖paintComponent实际绘图和使用的方法FontMetrics计算应在何处绘制突出显示的区域。

这是令人痛苦的详细答案:

基本上,你可以创建一个子类JLabel可以突出显示内容。我会这样做;你可能想要做一些不同的事情:

添加一个方法来告诉标签要突出显示哪个部分。假设您只需要一个突出显示的区域,这可能是这样的:

public void highlightRegion(int start, int end) {
     // Set some field to tell you where the highlight starts and ends...
}

如果您需要多个区域,只需使用 ArrayList 而不是简单的字段。取消突出显示的方法可能也很有用。

现在,您需要覆盖paintComponent的方法JLabel。在这里,您需要执行几个离散的步骤,您可能希望以不同的方法或其他方式来组织这些步骤。为了简单起见,我将把它们全部放在paint方法中。

@Override
protected void paintComponent(Graphics g) {
  ...

首先,您需要计算出高光的物理尺寸,您可以使用nice来完成此操作FontMetrics班级。创建FontMetrics类为Font你正在使用。

  FontMetrics metrics = new FontMetrics(getFont());

现在您可以获得创建将成为突出显示的矩形所需的所有信息。您需要起始位置、高度和宽度。为了得到这个,你需要两个子字符串JLabel的正文如下:

  String start = getText().substring(0, startOfHighlight);
  String text = getText().substring(startOfHighlight, endOfHighlight);
  //You may also need to account for some offsets here:
  int startX = metrics.stringWidth(start);
  int startY = 0; //You probably have some vertical offset to add here.
  int length = metrics.stringWidth(text);
  int height = metrics.getHeight();

现在,您可以在绘制标签的其余部分之前绘制突出显示的区域:

  g.fillRect(startX, startY, length, height);
  super.paintComponent(g);
}

当然,如果您希望突出显示跨越多行,则需要更多工作。

如果你想知道,我之前实际上写过类似的东西。一时兴起,我决定编写自己的文本区域类型组件JPanel,这基本上就是我处理突出显示的方式。在实际项目中重新发明轮子可能很愚蠢,但它确实会教你一些可能有用的随机东西......

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

如何突出显示 JLabel 的一部分? 的相关文章

  • 序列的排列?

    我有具体数量的数字 现在我想以某种方式显示这个序列的所有可能的排列 例如 如果数字数量为3 我想显示 0 0 0 0 0 1 0 0 2 0 1 0 0 1 1 0 1 2 0 2 0 0 2 1 0 2 2 1 0 0 1 0 1 1 0
  • Java 枚举与创建位掩码和检查权限的混淆

    我想将此 c 权限模块移植到 java 但是当我无法将数值保存在数据库中然后将其转换为枚举表示形式时 我很困惑如何执行此操作 在 C 中 我创建一个如下所示的枚举 public enum ArticlePermission CanRead
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何对不同的参数类型使用相同的java方法?

    我的问题 我有 2 个已定义的记录 创建对象请求 更新对象请求 必须通过实用方法进行验证 由于这两个对象具有相同的字段 因此可以对这两种类型应用相同的验证方法 现在我只是使用两种方法进行重载 但它很冗长 public record Crea
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • Eclipse 选项卡宽度不变

    我浏览了一些与此相关的帖子 但它们似乎并不能帮助我解决我的问题 我有一个项目 其中 java 文件以 2 个空格的宽度缩进 我想将所有内容更改为 4 空格宽度 我尝试了 正确的缩进 选项 但当我将几行修改为 4 空格缩进时 它只是将所有内容
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 关键字“table”附近的语法不正确,无法提取结果集

    我使用 SQL Server 创建了一个项目 其中包含以下文件 UserDAO java public class UserDAO private static SessionFactory sessionFactory static se
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 如何使用mockito模拟构建器

    我有一个建造者 class Builder private String name private String address public Builder setName String name this name name retur
  • 使用 CXF-RS 组件时,为什么我们使用 而不是普通的

    作为后续这个问题 https stackoverflow com questions 20598199 对于如何正确使用CXF RS组件我还是有点困惑 我很困惑为什么我们需要
  • CamcorderProfile.videoCodec 返回错误值

    根据docs https developer android com reference android media CamcorderProfile html 您可以使用CamcorderProfile获取设备默认视频编解码格式 然后将其
  • Spring Rest 和 Jsonp

    我正在尝试让我的 Spring Rest 控制器返回jsonp但我没有快乐 如果我想返回 json 但我有返回的要求 完全相同的代码可以正常工作jsonp我添加了一个转换器 我在网上找到了用于执行 jsonp 转换的源代码 我正在使用 Sp
  • Java中super关键字的范围和使用

    为什么无法使用 super 关键字访问父类变量 使用以下代码 输出为 feline cougar c c class Feline public String type f public Feline System out print fe

随机推荐

  • 两个 .net 程序集之间的循环引用

    我有两个程序集 A 和 B A 已存在对 B 的引用 并且必须保持这种状态 现在我对B做了一些修改 需要引用A 所以就出现了循环引用 一些细节 A 有一些属性网格 B 中的对话框需要托管这些属性网格 因此 为了避免这种循环引用问题 我尝试在
  • 交换字符串中的字母

    我需要按照以下规则交换字符串中的字母 A 被 T 取代 T 被替换为 A C 被 G 取代 G 被 C 取代 例如 ACGTA应该成为TGCAT 解决这个问题的最佳方法是什么 正在寻找java A to T T to A 找到了这个建议 S
  • 如何调试/记录 wsgi python 应用程序?

    我试过这个 usr bin python from wsgiref simple server import make server from cgi import parse qs escape import logging import
  • 为什么 object.__new__ 在这两种情况下工作方式不同?

    Python 版本 2 7 3 默认 2013 年 4 月 10 日 06 20 15 n GCC 4 6 3 我有这个 gt gt gt class testclass1 object pass gt gt gt class testcl
  • WPF:ContentPresenter 上的 TextTrimming

    有没有一种简单的方法可以让 TextTrimming 与 ContentPresenter 一起使用 我有 TextBlock 和 AccessText 的隐式样式 其中 TextTrimming 设置为 CharacterEllipsis
  • 具有特征的 Scala 和 Mockito

    我有一个简单的类 它自然地分为两部分 所以我重构为 class Refactored extends PartOne with PartTwo 然后单元测试开始失败 下面是重现该问题的尝试 所有三个示例的功能都是相同的 但第三个测试失败并出
  • 指向结构的指针的大小[重复]

    这个问题在这里已经有答案了 我试图记住 C 编程的基础知识 并且关于结构体指针 我正在执行以下操作 include
  • Google Apps 脚本国际化 (i18n)

    这些文档似乎没有提及任何内容 是否有关于如何在 Google Apps 脚本中执行 i18n 的推荐方法 尤其是作为 WebApp 发布的 有没有办法找出用户的区域设置 Session getActiveUserLocale 应返回区域设置
  • CodeIgniter POST/GET 默认值

    如果 POST GET 数据为空 假 我可以设置默认值吗 this gt input gt post varname value if falsy 所以我不必像这样编码 a this gt input gt post varname thi
  • 非 void 函数中的空返回是未定义的行为吗?

    阅读有关该主题的答案后控制到达非 void 函数的末尾我没有看到任何专门针对以空退出非 void 函数的情况的答案return陈述 int return integer return empty return in non void fun
  • 我想通过蓝牙设备强制打开键盘

    我有一个蓝牙条形码设备 如果将蓝牙设备连接到 iPhone 我无法使用 iPhone 键盘写任何内容 您已经知道iPhone键盘不会显示 因为蓝牙设备已识别键盘 但 当 iPhone 连接蓝牙设备时 我必须通过键盘在文本框中写入一些内容 请
  • 如何在 Windows 上正确地将拉丁字符打印到 C++ 控制台?

    我在用 C 将法语字符写入控制台时遇到问题 该字符串是从文件中加载的std ifstream and std getline然后使用打印到控制台std cout 以下是该字符串在文件中的内容 该链对应于代码 TEST CODE 并且与语言环
  • 为什么 Ruby 只允许某些运算符重载

    在 Ruby 中 与许多其他面向对象编程语言一样 运算符是可重载的 但是 只有某些字符运算符可以重载 此列表可能不完整 但以下是一些不能重载的运算符 not and or 吉姆 韦里奇
  • 如何将 PHP 的内存限制增加到 2GB 以上?

    我在增加 PHP 作为 Apache 模块的内存限制时遇到问题 如果我将以下指令放入 Apache 配置中 则可以正常工作 php value memory limit 1 99G 但是超过2GB就不行了 它把这个值恢复到128MB 这里有
  • Google Plus API 和照片?

    据我了解 没有官方的 G API 用于从相册中获取照片 但我已经弄清楚了hereGoogle Plus 在内部使用 Picasa 我的问题是 是否可以仅通过 G API Picasa userId 找出 如果是 如果我只有 Google P
  • XCTest 中的 IOS -NSRunLoop:如何让运行循环在单元测试中工作?

    好的 我环顾四周 没有找到我的问题的确切答案 我正在尝试在单元测试 而不是主要运行 中测试超时处理程序 问题似乎在于 NSRunLoop mainRunLoop 单元测试中的运行方式与标准运行中的运行方式不同 我以这种方式进行超时 NSTi
  • macOS/swift 使用 AVCaptureSession 捕获音频

    我目前正在尝试在我的 Mac 上实现一个简单的录音工具 由于我需要内存中的原始音频缓冲区 因此我无法使用 AVAudioRecorder 它只会将录音写入文件 我的方法是创建 AVCaptureSession 输入 麦克风 和输出 AVCa
  • 如何使用 Team Build 2010 部署 Windows 服务项目

    我有一个VS2010解决方案 其中包括几个Windows服务项目 我需要将这些服务部署为 Team Build 2010 中构建的一部分 并且 Windows 服务必须部署在多台 Windows Server 计算机上 我怎样才能做到这一点
  • 如何从名称的 string[] 创建动态 LINQ 选择投影函数?

    使用 C 有没有办法指定投影函数的属性名称LINQselect 方法 从数组中 public class Album public int Id get set public string Name get set public short
  • 如何突出显示 JLabel 的一部分?

    在任何人建议 HTML 之前 我稍后会解释为什么这里不选择 HTML 我有一个表 其中包含一列 其中包含文本单元格 我需要能够突出显示每个单元格中的一些文本 例如 如果单元格包含 cat foo dog 我可能想突出显示 foo 我当前的方