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

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

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

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

最佳答案

尽管回答了这个问题,但我认为我会提供另一种方法。这种替代方式归结为“将文本放入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);
    }
}

输出
java.awt.Dimension[width=260,height=884]
java.awt.Dimension[width=390,height=544]

警告
  • 为了获得显示文本所需的最小尺寸,该HTML正文中可能需要删除一些(更多)填充。留给用户作为练习。
  • Swing的HTML格式因使文本的“基线”错误而臭名昭著。如果文本内容包含诸如子脚本之类的东西降到了文本的通常基准之下,这可能很重要。在该用例中,这似乎不是问题。
  • 我只是注意到,尽管将宽度指定为200,然后将其指定为300,结果又返回为260和390。每个标签都不同。
  • 09-25 17:08