spraw, aby JLabel zawinął tekst, ustawiając maksymalną szerokość

Odpowiedzi:

57

Nie.

Możesz użyć HTML w etykiecie, ale wtedy musisz na stałe zakodować znacznik break.

Lepszym podejściem jest użycie JTextArea i włączenie zawijania. Możesz zmienić tło, pierwszy plan, czcionkę itp. Tekstu, aby wyglądał jak etykieta.

Uwaga, ta odpowiedź jest nieaktualna przynajmniej od wersji Java 7.

Zgodnie z odpowiedzią @ darren, wystarczy owinąć ciąg tagami <html>i </html>:

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

Nie musisz na stałe kodować żadnych znaczników przerwania. Tekst zawija się wraz ze zmianą rozmiaru komponentu.

camickr
źródło
14
To nie do końca prawda. Jeśli używasz HTML, możesz na stałe zakodować tagi break, ale jeśli użyjesz HTML i przypiszesz maksymalny rozmiar, tekst zostanie automatycznie zawijany.
Daniel Rikowski,
2
Jeśli zdecydujesz się na trwałe łamanie kodu, upewnij się, że używasz języka <br>, a nie <br />, ponieważ Java 5 nie lubi tego drugiego.
Craigo,
Podoba mi się drugi pomysł, ponieważ pierwszy może przełamać słowo na pół, a ja chcę zawijać słowa
shareef
„Możesz użyć HTML w etykiecie, ale musisz wtedy na stałe zakodować znacznik podziału”. To jest źle. CSS może określić preferowaną szerokość, po czym ciąg zostanie zawinięty w słowo, automatycznie, na tyle wierszy, ile potrzeba.
Andrew Thompson,
45

Tak, są dwa podobne sposoby (pierwszy ze stylem css = "width: ... px", drugi z 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);
Alexander.Berg
źródło
5
Cała sprawa związana z używaniem html do zawijania tekstu wygląda jak hack, ale to najłatwiejszy sposób, aby to zadziałało. Ustawienie rozmiaru w div jest dokładnie tym, czego potrzebowałem, aby zawinąć JLabel z maksymalną szerokością bez żadnych bibliotek innych firm lub nadmiernie skomplikowanych hacków.
Peter Dolberg
6
Co jeśli zmieni się rozmiar okna? Tekst musi zostać przepuszczony zgodnie z nową szerokością etykiety, ale przy takim rozwiązaniu trzeba by było ustawić go ponownie.
Andrii Chernenko
1
</html>btw :)
Jiří
36

lub po prostu użyj

myLabel.setText("<html>"+ myString +"</html>");
Darren
źródło
Dzięki JDK 7 to wystarczyło, dzięki! JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
Matthieu
4
Jeśli to zrobisz, upewnij się, że wszystkie encje HTML w programie myStringsą najpierw chronione. Jeśli myStringjest coś w rodzaju „Wartość <5”, pojawi się jako „Wartość 5”.
Rangi Keen
13

Możesz używać HTML bez znaczników przerwania kodowania, jeśli zamiast tego używasz znaczników akapitu.

JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");
DemBones
źródło
Z jakiegoś powodu to nie zadziałało dla mnie. p-tagi po nagłówku, a tekst nie jest zawijany. Mam wyłączone przewijanie w poziomie, więc może to ma z tym coś wspólnego.
Bram Vanroy,
Nie potrzebujesz znaczników p.
Erick Robertson
10

JXLabel w projekcie SwingX obsługuje zawijanie

JXLabel label = new JXLabel(somelongtext);
label.setLineWrap(true);  
Kleopatra
źródło
7

Jest to dobra technika tutaj , przewiń do końca artykułu.

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);
Sam Barnum
źródło
7

Oprócz zawijania tekstu w <html>znaczniki, musisz również umieścić etykietę w pojemniku, który przestrzega preferowanej wysokości i ustawia szerokość na maksimum. Na przykład możesz umieścić etykietę na PÓŁNOCNEJ części pliku BorderLayout.

Oto prosty, ale kompletny program roboczy, który to ilustruje. Możesz zmienić rozmiar ramki w dowolny sposób; etykieta zajmie całą szerokość, a wysokość dostosuje się odpowiednio, aby zawinąć tekst. Zauważ, że wszystko, co robię, to używanie <html>tagów i umieszczanie etykiety w PÓŁNOCNEJ części 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);
            }

        });
    }

}
Andrei Vajna II
źródło
0

<html>owijanie działa, ale nie we wszystkich przypadkach. Jeśli kontener nadrzędny używa FlowLayout, to nie będzie działać. Dlatego ustawiłem to na BoxLayout. Spójrz na ten fragment kodu:

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

Nie dodawaj, <br>ponieważ złamie to twój tekst, nawet jeśli powiększysz ramkę nadrzędną i kontener pRefundNote.

Jeff_Alieffson
źródło
-7

Jeśli chcesz używać tylko JLabel, możesz wypróbować to podejście,

po prostu wyświetl liczbę znaków, które chcesz wyświetlić na etykiecie, używając metody podciąg.

public void setLabel(String label){
    String dispLabel=label.substring(0, numOfCharacter);
    labelComponent.setText(dispLabel);
}
Rajj
źródło
To nie jest zawijanie tekstu.
SapuSeven