2009-12-03 23 views
19

Estoy tratando de hacer un Swing JLabel con múltiples líneas de texto. Se agrega muy bien, pero los saltos de línea no llegan. ¿Cómo hago esto? Alternativamente, ¿puedo simplemente especificar un ancho máximo para un JLabel y saber que el texto se ajustará, como en un div?Java: Linebreaks en 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);   
    } 

Respuesta

37

Use HTML en setText, p.

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

O si quieres que sea más dinámica, a continuación, se puede utilizar el ancho de css o atributo dentro de la anchura de HTML, consulte [AQUÍ] (http://stackoverflow.com/questions/2420742/make-a-jlabel -wrap-its-text-by-setting-a-max-width/3194997 # 3194997) –

6

Puede colocar HTML dentro de un JLabel y usar la etiqueta linebreak para lograrlo.

9

De forma predeterminada, Swing no ajusta el texto. Si especifica un tamaño en JLabel, solo pintará la parte del texto que se ajuste y luego agregará "..." al final.

Como se sugiere, puede usar HTML para habilitar el ajuste de línea. Sin embargo, he creado un delegado Swing UI personalizado no hace mucho para lograr esto y aún más: MultiLineLabelUI.

Envolverá su texto para que se ajuste al espacio disponible y también respetará los saltos de línea dura. Si decide probarlo, es tan simple como:

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

O utilizar alternativamente la clase personalizada MultiLineLabel que además de ajustar el texto apoya la alineación de texto vertical y horizontal.

ACTUALIZACIÓN

que perdieron el dominio con los ejemplos de código originales. Ahora se puede ver en github lugar: https://github.com/sasjo/multiline

+0

¿Utiliza internamente HTML también? – Pacerier

+0

@Pacerier: No, no pude hacer eso porque necesitaba pintar los efectos en el texto envuelto. Creo que podrías decir que está rompiendo el texto de forma similar a una JTextArea. –

+1

@ SamuelSjöberg broken Link 'MultiLineLabelUI' – oliholz

3

¿Qué pasa con el uso de la función de envoltura en un 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

Buena idea, pero solo hay un inconveniente: el texto con formato no es posible. – Robert

0

No logré especificar el ancho máximo para una etiqueta pero puede especificar un ancho concreto. Mediante la medición de la anchura actual de un JLabel sólo podemos aplicar la nueva fijo con si el ancho de las JLabels es mayor que nuestra anchoMax:

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

, usted puede obtener salto de línea automática si se establece el ancho párrafo en HTML.

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

Simple, use HTML. Sin embargo, los componentes de Java Swing no proporcionan un soporte "fantástico" para el HTML, puedes usarlo para propósitos tan simples.

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