Erstellen Sie einen JLabel-Zeilenumbruch, indem Sie eine maximale Breite festlegen

81

Ich habe ein JLabel, auf dem viel Text steht. Gibt es eine Möglichkeit, das JLabel auf eine maximale Breite zu bringen, damit der Text so umbrochen wird, dass er diese Breite nicht überschreitet?

Vielen Dank

Aly
quelle
siehe auch stackoverflow.com/questions/1627048/…
Leif Gruenwoldt

Antworten:

55

Nein.

Sie können HTML in der Beschriftung verwenden, müssen dann aber das break-Tag hart codieren.

Ein besserer Ansatz besteht darin, eine JTextArea zu verwenden und das Wrapping zu aktivieren. Sie können den Hintergrund, den Vordergrund, die Schriftart usw. des Textes ändern, damit er wie eine Beschriftung aussieht.

Beachten Sie, dass diese Antwort ab mindestens Java 7 veraltet ist.

Gemäß der Antwort von @ darren müssen Sie den String lediglich mit <html>und </html>tags umbrechen:

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

Sie müssen keine Break-Tags fest codieren. Der Text wird umgebrochen, wenn die Größe der Komponente geändert wird.

camickr
quelle
14
Das stimmt nicht ganz. Wenn Sie HTML verwenden, können Sie die Unterbrechungs-Tags hart codieren. Wenn Sie jedoch HTML verwenden und die maximale Größe zuweisen, wird der Text automatisch umbrochen.
Daniel Rikowski
2
Wenn Sie sich für Hardcode-Break-Tags entscheiden, stellen Sie sicher, dass Sie <br> und nicht <br /> verwenden, da Java 5 letzteres nicht mag.
Craigo
Ich mag die zweite Idee, weil die erste ein Wort in zwei
Hälften teilen
"Sie können HTML in der Bezeichnung verwenden, aber dann müssen Sie das break-Tag hart codieren." Das ist falsch. CSS kann eine bevorzugte Breite angeben. Anschließend wird die Zeichenfolge das Wort automatisch in so viele Zeilen wie nötig umbrochen.
Andrew Thompson
45

Ja, es gibt zwei ähnliche Möglichkeiten (erstens mit css style = "width: ... px", zweitens mit 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
quelle
5
Das Ganze über die Verwendung von HTML zum Umbrechen von Text fühlt sich wie ein Hack an, aber es ist der einfachste Weg, damit es funktioniert. Das Einstellen der Größe im div ist genau das, was ich brauchte, um den JLabel-Wrap mit einer maximalen Breite ohne Bibliotheken von Drittanbietern oder übermäßig komplizierte Hacks zu erstellen.
Peter Dolberg
6
Was ist, wenn sich die Fenstergröße ändert? Text muss entsprechend der neuen Beschriftungsbreite neu geflogen werden, aber mit dieser Lösung müssten Sie ihn erneut festlegen.
Andrii Chernenko
1
</html>Übrigens :)
Jiří
35

oder einfach benutzen

myLabel.setText("<html>"+ myString +"</html>");
Darren
quelle
Mit JDK 7 war das ausreichend, danke! JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
Matthieu
4
Wenn Sie dies tun, sollten Sie sicherstellen, dass alle HTML-Entitäten in myStringzuerst maskiert werden. Wenn myStringes sich um etwas wie "Wert <5" handelt, wird es als "Wert 5" angezeigt.
Rangi Keen
12

Sie können HTML ohne Hardcodierung von Break-Tags verwenden, wenn Sie stattdessen Absatz-Tags verwenden.

JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");
demBones
quelle
Aus irgendeinem Grund hat das bei mir nicht funktioniert. p-Tags nach einer Überschrift und Text wird nicht umbrochen. Ich habe das horizontale Scrollen deaktiviert, also hat das vielleicht etwas damit zu tun.
Bram Vanroy
Sie benötigen die p-Tags nicht.
Erick Robertson
10

JXLabel im SwingX-Projekt unterstützt das Umbrechen

JXLabel label = new JXLabel(somelongtext);
label.setLineWrap(true);  
Kleopatra
quelle
7

Es gibt eine gute Technik hier , blättern Sie bis zum Ende des Artikels.

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
quelle
7

Abgesehen davon, dass der Text in <html>Tags eingeschlossen wird, müssen Sie das Etikett auch in einen Container legen, der die bevorzugte Höhe berücksichtigt und die Breite auf Maximum setzt. Beispielsweise können Sie das Etikett in den NORDEN von a einfügen BorderLayout.

Hier ist ein einfaches, aber vollständiges Arbeitsprogramm, um dies zu veranschaulichen. Sie können die Größe des Rahmens beliebig ändern. Das Etikett nimmt die gesamte Breite ein und die Höhe wird entsprechend angepasst, um den Text zu umbrechen. Beachten Sie, dass ich nur <html>Tags verwende und das Etikett in den Norden des 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
quelle
0

<html>Das Wickeln funktioniert aber nicht in allen Fällen. Wenn der übergeordnete Container FlowLayout verwendet, funktioniert dies nicht. Deshalb habe ich es auf BoxLayout gesetzt. Schauen Sie sich dieses Code-Snippet an:

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>Fügen Sie nichts hinzu, da dies Ihren Text beschädigt, selbst wenn Sie den übergeordneten Frame und den pRefundNote-Container vergrößern.

Jeff_Alieffson
quelle
-7

Wenn Sie nur JLabel verwenden möchten, können Sie diesen Ansatz ausprobieren.

Zeigen Sie einfach die Anzahl der Zeichen an, die Sie mit der Teilzeichenfolgenmethode auf dem Etikett anzeigen möchten.

public void setLabel(String label){
    String dispLabel=label.substring(0, numOfCharacter);
    labelComponent.setText(dispLabel);
}
Rajj
quelle
Dies ist kein Zeilenumbruch.
SapuSeven