Вычисление высоты текста JLabel на основе определенной ширины

#java #swing #jlabel

#java #качать #jlabel

Вопрос:

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

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

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

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

Комментарии:

1. Это объяснение слишком запутанное. Возможно, потребуется еще немного времени и сформулировать его лучше?

2. Я в замешательстве; высота и ширина независимы. Возможно, это связано с размером используемого шрифта?

Ответ №1:

Несмотря на то, что на этот вопрос дан ответ, я подумал, что предложу альтернативный подход. Этот альтернативный вариант сводится к «помещению текста в метку в формате 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]
 

Предостережение

  1. Вероятно, в теле этого HTML-кода есть некоторое (большее) дополнение, которое необходимо удалить, чтобы получить наименьший размер, необходимый для отображения текста. Оставлено в качестве упражнения для пользователя.
  2. Форматирование HTML в Swing печально известно тем, что неправильно определяет «базовую линию» текста. Это, вероятно, будет учитываться, если текстовое содержимое включает в себя такие вещи, как вложенные сценарии, которые опускаются ниже обычной базовой линии текста. Похоже, что в данном случае это не будет проблемой.
  3. Я только что заметил, что, хотя ширина указана как 200, затем 300, результат возвращается как 260 и 390. Я мог бы понять, была ли эта разница постоянной между ними (дополнительное заполнение для удаления), но я совершенно озадачен тем, почему она отличается для каждой метки.

Ответ №2:

Комментарии:

1. Используя FontMetrics, вы можете получить размер на основе содержимого строки и шрифта, и он вернет размер, но мне нужно рассчитать, сколько высоты мне нужно, если ширина равна 50, шрифт «Serif», шрифт. КУРСИВ, 20 и текст: «Бла-бла-бла, что угодно …»

2. @Cody Итак, выясните, какой длины строка, и разделите это на 50, умножьте на количество строк, которые у вас есть, и получите свой рост.

Ответ №3:

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