зробіть обертання тексту JLabel, встановивши максимальну ширину


Відповіді:


57

Ні.

Ви можете використовувати HTML в мітці, але тоді вам потрібно жорстко закодувати тег break.

Кращий підхід - використовувати JTextArea і включити обтікання. Ви можете змінити фон, передній план, шрифт тощо, щоб текст виглядав як мітка.

Зверніть увагу, що ця відповідь застаріла принаймні на Java 7.

Відповідно до відповіді @ darren, вам просто потрібно обернути рядок <html>і </html>тегами:

myLabel.setText("<html>"+ myString +"</html>");

Вам не потрібно жорстко кодувати будь-які теги розриву. Текст обгортається, коли компонент змінює розмір.


14
Це не зовсім так. Якщо ви використовуєте HTML, ви можете жорстко кодувати теги розриву, але якщо ви використовуєте HTML і призначаєте максимальний розмір, текст автоматично загортається.
Даніель Ріковський,

2
Якщо ви вирішите жорстко розбити теги коду, переконайтеся, що ви використовуєте <br>, а не <br />, оскільки останній Java 5 не подобається.
Craigo

мені подобається друга ідея, тому що перша може розбити слово наполовину, і те, що я хочу,
перенесення

"Ви можете використовувати HTML у мітці, але тоді вам потрібно жорстко закодувати тег break." Це неправильно. CSS може вказати бажану ширину, тоді рядок автоматично перенесеться на слово в стільки рядків, скільки потрібно.
Ендрю Томпсон,

45

Так, є два подібних способи (перший із css style = "width: ... px", другий із html WIDTH = .......:

1.

labelText = String.format("<html><div style=\"width:%dpx;\">%s</div></html>", width, text);

2.

labelText = String.format("<html><div WIDTH=%d>%s</div></html>", width, text);

5
Усе, що стосується використання html для перенесення тексту, здається хакі, але це найпростіший спосіб змусити це працювати. Встановлення розміру в div - це саме те, що мені потрібно для обгортання JLabel з максимальною шириною без будь-яких сторонніх бібліотек або надто складних хаків.
Пітер Долберг,

6
Що робити, якщо розмір вікна зміниться? Текст потрібно перемальовувати відповідно до нової ширини мітки, але з цим рішенням вам доведеться встановити його знову.
Андрій Черненко

1
</html>btw :)
Jiří

36

або просто використовувати

myLabel.setText("<html>"+ myString +"</html>");

З JDK 7 цього було достатньо, дякую! JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
Матьє

4
Якщо ви зробите це, вам слід переконатися, що будь-які HTML-сутності в myStringспершу захищено. Якщо myStringщось на зразок "Значення <5", воно з'явиться як "Значення 5".
Рангі Кін,

13

Ви можете використовувати HTML без жорсткого кодування тегів розриву, якщо замість цього використовуєте теги абзаців.

JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");

Чомусь це не спрацювало для мене. p-теги, що слідують за заголовком, і текст не загортається. У мене відключена горизонтальна прокрутка, тому, можливо, це щось пов’язано.
Брем Ванрой

Вам не потрібні теги p.
Ерік Робертсон,


7

Там хороша техніка тут , перейдіть до кінця статті.

JLabel labelBeingUsed = myLabel;
View view = (View) labelBeingUsed.getClientProperty(BasicHTML.propertyKey);
view.setSize(scrollPane1.getWidth(), 0.0f);
float w = view.getPreferredSpan(View.X_AXIS);
float h = view.getPreferredSpan(View.Y_AXIS);
labelBeingUsed.setSize((int) w, (int) h);

7

Окрім загортання тексту в <html>теги, вам також потрібно помістити мітку в контейнер, який відповідає бажаній висоті та встановлює максимальну ширину. Наприклад, ви можете помістити мітку на ПІВНІЧ а BorderLayout.

Ось проста, але повна робоча програма, щоб проілюструвати це. Ви можете змінити розмір кадру будь-яким способом; мітка займе всю ширину, і висота буде відповідно налаштована, щоб обернути текст. Зверніть увагу, що все, що я роблю, це використання <html>тегів і розміщення мітки на ПІВНІЧІ 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("<html>"
            + "<h3>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</h3>"
            + "<p>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.</p>"
            + "<p>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.</p>"
            + "</html>");

        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);
            }

        });
    }

}

0

<html>обгортання працює, але не у всіх випадках. Якщо батьківський контейнер використовує FlowLayout, він не буде працювати. Тому я встановив його для BoxLayout. Подивіться на цей фрагмент коду:

javax.swing.JPanel pRefundNote = new javax.swing.JPanel(); 
javax.swing.JLabel lbNote = new javax.swing.JLabel();

pRefundNote.setAlignmentX(0.0F); 
pRefundNote.setMaximumSize(new java.awt.Dimension(32767, 33)); 
pRefundNote.setLayout(new javax.swing.BoxLayout(pRefundNote, javax.swing.BoxLayout.X_AXIS)); 

lbNote.setText("<html>Select items using Shift or Ctrl and Up/Down keys or Mouse</html>"); 
lbNote.setVerticalAlignment(javax.swing.SwingConstants.TOP);
lbNote.setVerticalTextPosition(javax.swing.SwingConstants.TOP); 
pRefundNote.add(lbNote);

Не додайте, <br>оскільки це розірве ваш текст, навіть якщо ви збільшите батьківський кадр і контейнер pRefundNote.


-7

Якщо ви хочете використовувати лише JLabel, ніж ви можете спробувати цей підхід,

просто покажіть кількість символів, які ви хочете відобразити на етикетці, використовуючи метод підрядка.

public void setLabel(String label){
    String dispLabel=label.substring(0, numOfCharacter);
    labelComponent.setText(dispLabel);
}

Це не перенесення тексту.
SapuSeven
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.