1

我有一个JLabel需要显示一些 html 格式的文本。但是,我想将其限制为 4 行(如果是,请提供一个按钮来查看所有内容)。

到目前为止,我已经尝试手动或通过布局管理器设置最大尺寸。但是,这两种解决方案都可能导致显示部分行。

编辑:要添加更多细节,即使在正确考虑换行、调整组件大小和更改字体大小的情况下,我也需要强制使用 4 行。我已经考虑通过用一个合适的新标签替换标签来处理调整大小/字体大小的变化。

JLabel似乎可以很好地处理不完整的标签,所以我可能会对输入字符串进行二进制搜索,找出哪个字符会导致它超过 4 行限制(使用FontMetric来确定 4 行将有多少像素),然后替换现有标签与新标签。这种方法的一大缺点是,每次用户调整面板大小或更改字体时,我都需要运行计算(感觉就像一个肮脏的黑客攻击)。

4

3 回答 3

2

将 JLabel 添加到 JScrollPane 中,为滚动窗格设置合理的首选大小。滚动条将出现必要的。

我不知道这些问题的任何绝对解决方案,因为我怀疑您是否可以定义“线”是什么。一行文本可能是 12 号字体,另一行是 24 号字体。我不知道有什么方法可以计算每个给定行的高度。

即使您确实使用了 ComponentListener 来处理 componentResized() 事件,我也不确定您能否提出一个合理的算法来计算 4 行显示的确切宽度/高度。

于 2010-04-26T03:23:45.023 回答
1

我会尝试遍历文本字符串并在第三个“\ n”之后删除所有文本

    String shortenText(String oldtext){
        String newText = "";
        for(int i=0;i<3;i++){
            newText += oldtext.substring(0,oldtext.indexOf("\n"));//adds one line to String
            oldtext = oldtext.substring(indexOf("\n")+1);//shorten old string to prepare for next iteration
        }


    return newText;
}

您可能还想尝试相同的算法,除了<p><br>标签的条带......

如果您知道可能标签的值,只需将文本从“\n”切换到“ <br>”或您需要的任何标签

于 2010-04-26T02:45:56.033 回答
0

嘿,我找到了一种可行的方法。我正在使用的框架允许我为字体大小更改创建侦听器。在这个监听器中,我确定标签的新最大尺寸是 ( getFontMetrics(font).getHeight() * 4),然后将标签上的最大高度重新设置为此,然后重新布局所有内容。这甚至可以很好地处理自动换行的情况。我猜有人可以用愚蠢的 HTML 输入做一些讨厌的事情,但这很好地涵盖了 99% 的情况。

于 2010-04-26T03:30:11.707 回答