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

时间:2011-10-24 11:38:29

标签: java swing jlabel

我正在使用Marquee JPanel,我正在使用JLabel通过在JPanel中减少JLabel的Y来滚动JPanel中的Text。

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

那么如何根据特定的宽度值来计算可以容纳某种文本的高度。

例如。 如果JLabel的宽度是50,那么高度应该是可以适合文本的值,如果文本是“Bla bla bla some text over ...”并且字体是“Serif”,Font.ITALIC,20

3 个答案:

答案 0 :(得分:3)

尽管有人回答,但我认为我会提供另一种方法。这个替代归结为“将文本放在HTML格式的标签中”。这种方法的优点是通常可以自动处理换行符,而不必担心每行中断的位置。 E.G。

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]

买者

  1. 为了获得显示文本所需的最小大小,可能需要删除该HTML正文中的一些(更多)填充。留给用户练习。
  2. Swing的HTML格式以使文本的“基线”错误而臭名昭着。如果文本内容包括低于文本通常基线的子脚本之类的内容,则可能会计算。在这个用例中似乎不会出现问题。
  3. 我只是注意到虽然宽度被指定为200然后是300,但结果又回到260&amp; 390.我可以理解两者之间的差异是否恒定(要删除的额外填充),但是对于每个标签的不同之处我感到非常困惑。

答案 1 :(得分:2)

您可能需要查看FontMetrics类,它具有根据字体大小获取字体属性的方法,如高度,宽度,上升等。根据这些信息,您应该能够计算出相对于宽度的特定字体/大小的高度,反之亦然。

答案 2 :(得分:1)

您从Dimension返回的getPreferredSize()在您致电pack()validate()后随时有效。