根据特定的宽度计算JLabel文本的高度

Bur*_*imi 5 java swing jlabel

我正在处理Marquee JPanel,并使用JLabel通过减小JPanel内部JLabel的Y来滚动JPanel中的文本。

问题是我需要JLabel的特定宽度,其中Height并不重要,因为它会滚动Text直到JLabel的Y> -JLabel.Height为止,这意味着JLabel的最后一行文本位于JPanel的顶部。

因此,如何根据Width的特定值计算可以容纳某种文本的Height。

例如。如果JLabel的Width为50,则Height为应该适合文本的值,如果text为“ Bla bla bla some text over ...”并且字体为“ Serif”,则Font.ITALIC,20

And*_*son 3

尽管已经回答了这个问题,但我想我会提供另一种方法。这种替代方案归结为“将文本放入 HTML 格式的标签中”。这种方法的优点是换行符通常是自动处理的,而不必担心在哪里换行。例如

import javax.swing.*;

class HeightOfFixedWidthText {

    public static void show(String s) {
        JLabel l = new JLabel(s);
        l.setSize(l.getPreferredSize());
        JOptionPane.showMessageDialog(null, l);
        System.out.println(l.getSize());
    }

    public static void main(String[] srgs) {
        String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eu nulla urna. Donec sit amet risus nisl, a porta enim. Quisque luctus, ligula eu scelerisque gravida, tellus quam vestibulum urna, ut aliquet sapien purus sed erat. Pellentesque consequat vehicula magna, eu aliquam magna interdum porttitor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sollicitudin sapien non leo tempus lobortis. Morbi semper auctor ipsum, a semper quam elementum a. Aliquam eget sem metus.";
        String html1 = "<html><body " +
            "style='font-family: Serif; font-style: italic; font-size: 20px; padding: 0px; margin: 0px;" +
            " width: ";
        String html2 = "px'>";
        String html3 = "</body></html>";

        show(html1+"200"+html2+s+html3);
        show(html1+"300"+html2+s+html3);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出

java.awt.Dimension[width=260,height=884]
java.awt.Dimension[width=390,height=544]
Run Code Online (Sandbox Code Playgroud)

警告

  1. HTML 正文中可能有一些(更多)填充需要删除,以获得显示文本所需的最小尺寸。留给用户作为练习。
  2. Swing 的 HTML 格式因文本“基线”错误而臭名昭著。如果文本内容包含诸如低于文本通常基线的子脚本之类的内容,则这可能会被计算在内。似乎在这个用例中这不会成为问题。
  3. 我只是注意到虽然宽度指定为 200 然后 300,但结果返回为 260 和 390。我可以理解两者之间的差异是否恒定(需要删除额外的填充),但我很困惑为什么会这样每个标签都不同。