Мое требование - сделать перенос слов (точно так же, как это делает JTextArea
) с JLabel
.
. Рассмотрим следующий код:
public class WrapTest extends JFrame {
public WrapTest() {
super("test");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLayout(new BorderLayout());
JLabel label = new JLabel("Lorem <b>ipsum</b> dolor sit amet, consectetur adipiscing elit. "
+ "Aliquam non pellentesque enim. Donec nec nisl tortor."
+ " Curabitur rutrum molestie est eget varius. Nullam ut lacinia est."
+ " Phasellus hendrerit sollicitudin justo, vitae malesuada dolor vestibulum at."
+ " Integer pharetra purus sed ipsum pulvinar, et pretium odio volutpat. Donec vitae varius metus."
+ " Cras sagittis vulputate erat, at faucibus lectus faucibus id. Cras varius nunc eu felis tristique dapibus."
+ " Aenean enim eros, dapibus pellentesque nibh ut, efficitur malesuada sapien. Nullam imperdiet nunc velit,"
+ "sed laoreet massa mattis eget. Morbi id justo quis sapien aliquet bibendum sed at leo. In mi felis, consectetur"
+ " sed orci eget, tempus maximus turpis. Curabitur sed felis id nisl vehicula sollicitudin sed eget erat.Ut sagittis at nisi sed facilisis."
+ " Morbi vel felis ac diam molestie consequat. Sed nisl lectus, sollicitudin at neque in, "
+ "placerat aliquet nunc. Maecenas quis enim vitae nunc fermentum congue. Sed posuere quam a ultricies fringilla."
+ " Vivamus aliquam nunc lacus, vitae consectetur tortor consequat ut. Cras viverra mi sit amet magna auctor eleifend."
+ " Morbi in risus nisl. Praesent nunc dolor, lobortis nec ultricies aliquet, sollicitudin eu sapien. Fusce interdum ac leo non suscipit."
+ "Vivamus at viverra elit, ut vestibulum elit. Sed bibendum, lorem et ornare sagittis, erat nulla ultricies odio, quis iaculis lacus nisl "
+ "vel ligula. Sed iaculis elit eu felis consectetur dignissim. ");
add(label, BorderLayout.CENTER);
setLocationByPlatform(true);
setSize(500, 200);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new WrapTest().setVisible(true);
});
}
}
Текст уродлив и не удобочитаемый. Чтобы сделать его лучше и добавить перенос слов, давайте добавим тег <html>
.
String wrap = "<html>";
label.setText(wrap + label.getText());
Перенос слов в порядке, но когда размер рамки становится небольшим, требуется вертикальная полоса прокрутки. чтобы иметь возможность читать текст.
Теперь давайте попробуем добавить JScrollPane
и метку внутри него:
String wrap = "<html>";
label.setText(wrap + label.getText());
JScrollPane sp = new JScrollPane(label);
add(sp, BorderLayout.CENTER);
У нас есть следующий результат:
Что снова делает текст нечитаемым. Использование sp.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
заставит полосу прокрутки исчезнуть, а текст останется горизонтально ориентированным.
Есть ли способ в этой ситуации удалить всю функциональность горизонтальной панели? Я хочу, чтобы ярлык можно было прокручивать вертикально с помощью функции переноса слов. Так же, как JTextArea
, который ведет себя как:
Причина, по которой я настаиваю на использовании JLabel
, заключается в простоте рендеринга тегов HTML .
Я пытался решить эту проблему путем изменения preferredSize
и / или maximumSize
компонентов, но у меня не было желаемого результата. Я также пытался использовать <body style='width:100%'>
или Xpx, но у них есть и другие проблемы. Поскольку это имеет смысл, они не корректируются, когда размер кадра увеличивается.