gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:14:38 28 4
gpt4 key购买 nike

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

我目前的方法是使用自定义 TableCellRenderer 将 html 放入 JLabel 组件中,该组件被渲染并且有一段时间效果很好。然后我注意到,当单元格中的文本变得太长而无法适应列宽时,它只是截断了文本而没有在这种情况下通常发生的正常“...”。因此,用户不知道还有更多他们没有看到的文本。另一个问题是,如果原始文本本身包含 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 而不是简单的字段。取消突出显示的方法可能也很有用。

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

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

首先,您需要确定突出显示的物理尺寸,您可以使用漂亮的 FontMetrics 类来完成。为您正在使用的 Font 创建 FontMetrics 类。

  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 编写我自己的文本区域类型组件,这基本上就是我处理突出显示的方式。在实际项目中重新发明轮子可能很愚蠢,但它确实教会了你一些可能有用的随机东西......

关于java - 如何突出显示 JLabel 的一部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3533967/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com