2010-03-10 64 views
67

Tengo una JLabel que tiene una gran cantidad de texto en él. ¿Hay alguna manera de hacer que JLabel tenga un ancho máximo para que ajuste el texto para que no exceda este ancho?hacer una envoltura JLabel es texto estableciendo un ancho máximo

Gracias

+0

ver también http://stackoverflow.com/questions/1627048/how-to-add-multi-line-label-on-a-java-gui –

Respuesta

34

No.

Puede usar HTML en la etiqueta, pero entonces debe codificar la etiqueta de salto.

Un mejor enfoque es usar un JTextArea y activar el envoltorio. Puede cambiar el fondo, el primer plano, la fuente, etc. del texto para que parezca una etiqueta.

Nota, esta respuesta es obsoleta como de al menos Java 7.

Según @ respuesta de Darren, sólo hay que envolver la cadena con <html> y </html> etiquetas:

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

Usted no es necesario codificar ninguna etiqueta de corte. El texto se ajusta a medida que el componente cambia de tamaño.

+11

Eso no es del todo cierto. Si usa HTML, * puede * codificar las etiquetas de corte, pero si usa HTML y asigna el tamaño máximo, el texto se ajustará automáticamente. –

+2

Si decide romper las etiquetas del código, asegúrese de utilizar
y no
, ya que a Java 5 no le gusta lo último. – Craigo

+0

me gusta la segunda idea porque la primera puede dividir una palabra a la mitad y lo que quiero es ajustar la palabra – shareef

40

Sí, hay dos formas similares (primero con css style = "width: ... px", en segundo lugar con un ancho de html = ...:

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

Todo el asunto del uso de html para hacer ajustes de texto parece un truco, pero es la forma más fácil de hacerlo funcionar. Establecer el tamaño en el div es exactamente lo que necesitaba para hacer que el JLabel se envolviera con un ancho máximo sin bibliotecas de terceros ni hacks demasiado complicados. –

+5

¿Qué pasa si el tamaño de la ventana cambia? El texto debe volver a aparecer de acuerdo con el nuevo ancho de etiqueta, pero con esta solución deberá volver a configurarlo. –

6

Hay una buena técnica here, vaya al final del artículo.

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

o simplemente utilizar

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

Con JDK 7 suficiente, ¡gracias! 'JLabel lblTitle = new JLabel (" Mi texto de título muy muy largo ");' – Matthieu

+2

Si hace esto, debe asegurarse de que las entidades HTML en 'myString' se escapen por primera vez. Si 'myString' es algo así como" Value <5 ", aparecerá como" Value 5 ". –

11

JXLabel en los soportes SwingX project envolver

JXLabel label = new JXLabel(somelongtext); 
label.setLineWrap(true); 
+0

Gracias, funciona para mí. – ceklock

8

Usted puede usar HTML sin las etiquetas de saltos de codificación duros si utiliza etiquetas de párrafo en su lugar.

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

Por alguna razón esto no funcionó para mí. etiquetas p siguiendo un encabezado, y el texto no está ajustado. Tengo el desplazamiento horizontal deshabilitado, así que tal vez eso tenga algo que ver con eso. –

+0

No necesita las etiquetas p. –

6

Aparte de envolver el texto en <html> etiquetas, también hay que poner la etiqueta en un recipiente que respeta la altura preferida y establece el ancho al máximo. Por ejemplo, puede colocar la etiqueta en el NORTE de BorderLayout.

Aquí hay un programa de trabajo simple pero completo para ilustrar esto. Puedes cambiar el tamaño del cuadro de la forma que quieras; la etiqueta ocupará todo el ancho y la altura se ajustará en consecuencia para envolver el texto. Tenga en cuenta que todo lo que hago es usar las etiquetas <html> y poner la etiqueta en el NORTE de 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); 
      } 

     }); 
    } 

} 
-6

Si sólo desea utilizar JLabel que puede probar este enfoque,

acaba de mostrar el número de caracteres que desea mostrar en la etiqueta utilizando el método de subcadena.

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