Есть ли свойство «word wrap» для JLabel?

Я показываю некоторый текст в JLabel. В основном я генерирую этот текст динамически, а затем применяю некоторые HTML-tags (например, BR и B ) для форматирования текста. Наконец, я присваиваю этот форматированный текст моей JLabel.

Теперь я хочу, чтобы моя Jlabel автоматически обертывала текст на следующую строку, когда она доходила до конца экрана, например, функция «Word Wrap» в Note Pad.

Как я могу это сделать?

Должен работать, если вы завернете текст в ...

UPDATE: возможно, вы также должны установить максимальный размер.

Ширина может быть установлена ​​для body с использованием стилей HTML (CSS). Это, в свою очередь, будет определять количество линий для рендеринга и, следовательно, предпочтительную высоту метки.

Установка ширины в CSS позволяет избежать необходимости вычислять, где разрывы строк должны встречаться в ярлыке (или в лучшем размере).

 import javax.swing.*; public class FixedWidthLabel { public static void main(String[] srgs) { final 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."; final String html1 = ""; Runnable r = new Runnable() { @Override public void run() { JOptionPane.showMessageDialog( null, new JLabel(html1 + "200" + html2 + s)); JOptionPane.showMessageDialog( null, new JLabel(html1 + "300" + html2 + s)); } }; SwingUtilities.invokeLater(r); } } 

введите описание изображения здесьвведите описание изображения здесь

Одним из способов было бы использовать JTextArea вместо JLabel с setWrapStyleWord и setLineWrap установленным в true, и с настройками, чтобы заставить его выглядеть и вести себя как JLabel (удалить границу, сделать ее непрозрачной, сделать ее JLabel для редактирования, фокусируемый).

В противном случае, если вам абсолютно необходимо использовать JLabel , вы должны будете использовать FontMetrics для измерения вашего текста, проверки на пустое пространство и последующего добавления HTML-перерывов в соответствующих позициях самостоятельно.

Я обнаружил, что это решение является самым простым и корректно работает с изменением размера. Помимо обертывания текста в тегах , вы также должны поместить ярлык в контейнер, который соответствует предпочтительной высоте и устанавливает максимальную ширину. Например, вы можете поместить ярлык в NORTH из BorderLayout .

Вот простую, но полную рабочую программу, чтобы проиллюстрировать это. Вы можете resize кадра любым способом; метка будет занимать всю ширину, а высота будет корректироваться, чтобы обернуть текст. Обратите внимание, что все, что я делаю, это использовать tags и помещать ярлык в NORTH из BorderLayout .

 import javax.swing.JFrame; import javax.swing.SwingUtilities; import javax.swing.JPanel; import javax.swing.JLabel; import java.awt.BorderLayout; import java.awt.Dimension; public class LabelWrap { public static JPanel createPanel() { JLabel label = new JLabel(); label.setText("" + "

Lorem ipsum dolor sit amet, consectetur adipiscing elit.

" + "

Duis a tincidunt urna. Phasellus tristique interdum mauris, " + "ut vestibulum purus suscipit eget. Aenean massa elit, accumsan " + "non faucibus vel, dictum placerat urna. In bibendum est sagittis " + "urna iaculis quis sagittis velit commodo. Cum sociis natoque " + "penatibus et magnis dis parturient montes, nascetur ridiculus " + "mus. Nam quis lacus mauris. Phasellus sem libero, convallis " + "mattis sagittis vel, auctor eget ipsum. Vivamus molestie semper " + "adipiscing. In ac neque quis elit suscipit pharetra. Nulla at " + "orci a tortor consequat consequat vitae sit amet elit. Praesent " + "commodo lacus a magna mattis vehicula. Curabitur a hendrerit " + "risus. Aliquam accumsan lorem quis orci lobortis malesuada.

" + "

Proin quis viverra ligula. Donec pulvinar, dui id facilisis " + "vulputate, purus justo laoreet augue, a feugiat sapien dolor ut " + "nisi. Sed semper augue ac felis ultrices a rutrum dui suscipit. " + "Praesent et mauris non tellus gravida mollis. In hac habitasse " + "platea dictumst. Vestibulum ante ipsum primis in faucibus orci " + "luctus et ultrices posuere cubilia Curae; Vestibulum mattis, " + "tortor sed scelerisque laoreet, tellus neque consectetur lacus, " + "eget ultrices arcu mi sit amet arcu. Nam gravida, nulla interdum " + "interdum gravida, elit velit malesuada arcu, nec aliquam lectus " + "velit ut turpis. Praesent pretium magna in nibh hendrerit et " + "elementum tellus viverra. Praesent eu ante diam. Proin risus " + "eros, dapibus at eleifend sit amet, blandit eget purus. " + "Pellentesque eu mollis orci. Sed venenatis diam a nisl tempor " + "congue.

" + ""); JPanel panel = new JPanel(new BorderLayout()); panel.add(label, BorderLayout.NORTH); panel.setPreferredSize(new Dimension(640, 480)); return panel; } /** * @param args */ public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JFrame frame = new JFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setContentPane(createPanel()); frame.pack(); frame.setVisible(true); } }); } }

Просто подумал, что я должен опубликовать это для всех, кто ищет в Интернете, поскольку это была крошечная ошибка, которая стоила мне 30 минут, но убедитесь, что вы на самом деле завернули текст в HTML. Возможно, вы думали, что сделали, но не сделали этого. Проверьте это, я забыл, и когда я завернул их в HTML, он исправил это для меня.

JLabel label = new JLabel("Lorem ipsum long paragraph"); неправильно.

JLabel label = new JLabel("Lorem ipsum long paragraph"); верный!

Мне нравится подход JTextArea, упомянутый выше, потому что он красиво изменяется на SOUTH на панели BorderLayout (пока компонент CENTER может занять слабину, если изменяется количество строк в JTextArea).

Тем не менее, в Nimbus L & F есть уловка при настройке цвета фона JTextArea. Кажется, что Nimbus использует волшебные цвета (расширенный class java.awt.Color), которые становятся прозрачными в JTextArea. Поэтому, если вы копируете цвет фона из JPanel в область JText, вам нужно преобразовать Color в ARGB и обратно в Color. Следующий код работает для меня во всех L & Fs в моей JRE (Nimbus, CDE Motif, Metal, Mac OS X):

  JTextArea ta = new JTextArea(text); ta.setEditable(false); ta.setLineWrap(true); ta.setWrapStyleWord(true); JLabel lb = new JLabel(); Font f = lb.getFont(); ta.setFont(f.deriveFont(f.getSize2D() * 0.9f)); ta.setBorder(lb.getBorder()); ta.setBackground(new Color(lb.getBackground().getRGB(), true)); ta.setForeground(new Color(lb.getForeground().getRGB(), true)); ta.setOpaque(lb.isOpaque()); 

Я сделал шрифт немного меньше. Конечно, вы можете сохранить размер шрифта JLabel, если хотите.

  • Получить выделенные строки в JTable с помощью AbstractTableModel
  • Как рисовать одно и то же движущееся изображение несколько раз?
  • Как использовать CardLayout с NetBeans GUI Builder
  • Как настроить столбцы JTable для размещения самого длинного содержимого в ячейках столбца
  • Создание пользовательской кнопки в Java с помощью JButton
  • Как resize JLabel ImageIcon?
  • Java GIF анимация не перерисовывается правильно
  • освежающий цвет фона для строки в jtable
  • Поворот изображения с помощью AffineTransform
  • Java Swing - как показать панель поверх другой панели?
  • Добавление прокручиваемой JTextArea (Java)
  • Давайте будем гением компьютера.