Рассчитать высоту текста JLabel на основе определенной ширины - PullRequest
5 голосов
/ 24 октября 2011

Я работаю над Marquee JPanel и использую JLabel для прокрутки текста внутри JPanel, уменьшив Y JLabel внутри JPanel.

Проблема в том, что мне нужна конкретная ширина JLabel, где высота равнане важно, потому что он будет прокручивать текст до тех пор, пока Y JLabel не будет> чем -JLabel.Height, что означает, что последняя строка текста JLabel находится в верхней части JPanel.

Так, как я могу вычислить высоту, которая может содержатьсортировка текста на основе определенного значения ширины.

например.Если ширина JLabel равна 50, то высота должна соответствовать значению, которое может поместиться в тексте, если текст «Бла бла бла какой-то текст поверх ...» и шрифт «С засечками», Font.ITALIC, 20

Ответы [ 3 ]

3 голосов
/ 24 октября 2011

Несмотря на это, я решил предложить альтернативный подход.Эта альтернатива сводится к тому, чтобы «поместить текст в метку в формате HTML».Преимущество этого подхода заключается в том, что разрывы строк обычно обрабатываются автоматически, не беспокоясь о том, где разбивать каждую строку.EG

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. Форматирование HTML в Swing печально известно тем, что неверно определяет «базовый уровень» текста.Вероятно, это будет учитываться, если текстовое содержимое включает в себя такие вещи, как подпрограммы, которые опускаются ниже обычной базовой линии текста.Кажется, что в этом случае использования это не будет проблемой.
  3. Я только что заметил, что, хотя ширина указана как 200, а не 300, результат возвращается как 260 и 390. Я мог понятьесли это различие между ними было постоянным (дополнительное заполнение для удаления), но я совершенно не понимаю, почему оно отличается для каждого ярлыка.
2 голосов
/ 24 октября 2011

Возможно, вы захотите взглянуть на класс FontMetrics , который имеет методы для получения атрибутов шрифта, таких как высота, ширина, подъем и т. Д., В зависимости от размера шрифта. Учитывая эту информацию, вы сможете определить высоту конкретного шрифта / размера относительно ширины и наоборот.

1 голос
/ 24 октября 2011

Dimension, с которого вы возвращаетесь с getPreferredSize(), должно быть действительным в любое время после того, как вы позвоните pack() или validate().

...