2009-12-03 14 views
19

Ich versuche, ein Swing JLabel mit mehreren Textzeilen zu machen. Es ist gut hinzugefügt, aber die Zeilenumbrüche kommen nicht durch. Wie mache ich das? Alternativ kann ich einfach eine maximale Breite für ein JLabel angeben und wissen, dass der Text wie in einem div?Java: Zeilenumbrüche in JLabels?

private void addLegend() { 
     JPanel comparisonPanel = getComparisonPanel(); 

     //this all displays on one line 
     JLabel legend = new JLabel("MMM FFF MMM FFFO O OOM M MMMM.\nMMM FFF MMM FFFO O OOM M MMMM.\nMMM FFF MMM FFFO O OOM M MMMM.\n"); 

     comparisonPanel.add(legend);   
    } 

Antwort

37

Verwenden Sie HTML in SetText, z.

myLabel.setText("<html><body>with<br>linebreak</body></html>"); 
+2

Oder wenn Sie es dynamisch mehr wollen, dann können Sie die Breite CSS oder Breite Attribut innerhalb des HTML verwenden, finden Sie [hier] (http://stackoverflow.com/questions/2420742/make-a-jlabel -wrap-its-text-by-Einstellung-a-max-width/3194997 # 3194997) –

6

Sie können HTML in ein JLabel einfügen und das linebreak-Tag verwenden, um dies zu erreichen.

9

Standardmäßig umschließt Swing Text nicht. Wenn Sie eine Größe für das JLabel angeben, wird nur der Teil des Textes gemalt, der passt, und dann "..." am Ende hinzufügen.

Wie vorgeschlagen, können Sie HTML verwenden, um Zeilenumbruch zu aktivieren. Allerdings habe ich vor kurzem einen benutzerdefinierten Swing UI-Delegierten erstellt, um dies und noch mehr zu erreichen: MultiLineLabelUI.

Der Text wird so umschlossen, dass er dem verfügbaren Platz entspricht und harte Zeilenumbrüche berücksichtigt werden. Wenn Sie wählen, um es auszuprobieren, ist es so einfach wie:

JLabel label = new JLabel("Text that'll wrap if necessary"); 
label.setUI(MultiLineLabelUI.labelUI);

Oder alternativ die benutzerdefinierte MultiLineLabel-Klasse verwenden, dass zusätzlich zu Einwickeln Text vertikale und horizontale Textausrichtung unterstützt.

UPDATE

verlor ich die Domain mit den ursprünglichen Codebeispiele. Es kann jetzt stattdessen auf Github angesehen werden: https://github.com/sasjo/multiline

+0

Intern verwenden Sie auch HTML? – Pacerier

+0

@Pacierer: Nein, ich konnte das nicht machen, weil ich Effekte auf den eingepackten Text malen musste. Ich denke, man könnte sagen, dass es den Text auf ähnliche Weise wie ein JTextArea bricht. –

+1

@ SamuelSjöberg defekten Link 'MultiLineLabelUI' – oliholz

3

Was ist mit der Verwendung der Umbruchfunktion in einer JTextArea?

String text = "some really long string that might need to"+ 
        "be wrapped if the window is not wide enough"; 

    JTextArea multi = new JTextArea(text); 
    multi.setWrapStyleWord(true); 
    multi.setLineWrap(true); 
    multi.setEditable(false); 

    JLabel single = new JLabel(text); 

    JPanel textpanel = new JPanel(new GridLayout(2,1)); 
    textpanel.add(multi); 
    textpanel.add(single); 

    JFrame frame = new JFrame(); 
    frame.add(textpanel); 
    frame.pack(); 
    frame.setVisible(true); 
+0

Nette Idee, aber es gibt nur einen Nachteil: Formatierter Text ist nicht möglich. – Robert

0

Ich habe es nicht geschafft, eine maximale Breite für ein Etikett anzugeben, aber Sie können eine Betonbreite angeben. Durch die aktuelle Breite eines JLabel Messung können wir nur die mit festen neuen Anwendung, wenn die Breite des JLabels höher ist, dass unsere maxWidth:

JLabel label = new JLabel("<html>" + myVeryLongMessage + "<html>"); 
int maxWidth = 400; 
Dimension size = label.getPreferredSize(); 
if (size.width > maxWidth) { 
    // Estimate the number of lines 
    int lineCount = (int) Math.ceil(((double) size.width)/maxWidth); 
    lineCount += 1; // Add one extra line as reserve 
    size.width = maxWidth; // Apply the maximum width 
    // Increase the height so that all lines will be visible 
    size.height *= lineCount; 
    label.setPreferredSize(size); 
} 
7

Sie können die automatischen Zeilenumbruch, wenn man die Absatzbreite in html einstellen.

label.setText("<html><p style=\"width:100px\">"+paragraph+"</p></html>"); 
1

Einfach, verwenden Sie HTML. Java Swing-Komponenten bieten zwar keine "fantastische" Unterstützung für den HTML-Code, Sie können ihn jedoch für solche einfachen Zwecke verwenden.

label.setText("<html>This is first line.<br/>This is second line.</html>");