hacer que un JLabel ajuste su texto estableciendo un ancho máximo

Respuestas:

55

No.

Puede usar HTML en la etiqueta, pero luego debe codificar la etiqueta de ruptura.

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

Tenga en cuenta que esta respuesta está desactualizada al menos en Java 7.

Según la respuesta de @ darren, simplemente debe envolver la cadena con las etiquetas <html>y </html>:

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

No es necesario codificar de forma rígida ninguna etiqueta de interrupción. El texto se ajusta a medida que cambia el tamaño del componente.

camickr
fuente
14
Eso no es del todo cierto. Si usa HTML, puede codificar las etiquetas de ruptura, pero si usa HTML y asigna el tamaño máximo, el texto se ajustará automáticamente.
Daniel Rikowski
2
Si decide codificar las etiquetas de ruptura de código, asegúrese de usar <br> y no <br />, ya que a Java 5 no le gusta este último.
Craigo
me gusta la segunda idea porque la primera puede dividir una palabra a la mitad y lo que quiero es un
ajuste de
"Puede usar HTML en la etiqueta, pero luego debe codificar la etiqueta de ruptura". Esto está mal. CSS puede especificar un ancho preferido, luego la cadena se ajustará a la palabra, automáticamente, en tantas líneas como sea necesario.
Andrew Thompson
45

Sí, hay dos formas similares (primero con css style = "width: ... px", segundo con 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
fuente
5
Todo lo relacionado con el uso de html para ajustar el 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 JLabel se ajustara con un ancho máximo sin bibliotecas de terceros o hacks demasiado complicados.
Peter Dolberg
6
¿Y si cambia el tamaño de la ventana? El texto debe redistribuirse según el nuevo ancho de la etiqueta, pero con esta solución tendría que volver a configurarlo.
Andrii Chernenko
1
</html>por cierto :)
Jiří
35

o simplemente usa

myLabel.setText("<html>"+ myString +"</html>");
darren
fuente
Con JDK 7 eso fue suficiente, ¡gracias! JLabel lblTitle = new JLabel("<html>My very very very long title text</html>");
Matthieu
4
Si hace esto, debe asegurarse de que se escapen myStringprimero las entidades HTML en . Si myStringes algo así como "Valor <5", aparecerá como "Valor 5".
Rangi Keen
12

Puede utilizar HTML sin etiquetas de rotura de codificación rígida si utiliza etiquetas de párrafo.

JLabel biglabel = new JLabel("<html><p>A lot of text to be wrapped</p></html>");
demBones
fuente
Por alguna razón, esto no funcionó para mí. p-tags después de un encabezado y el texto no está ajustado. Tengo el desplazamiento horizontal deshabilitado, así que tal vez tenga algo que ver con eso.
Bram Vanroy
No necesitas las etiquetas p.
Erick Robertson
10

JXLabel en el proyecto SwingX admite la envoltura

JXLabel label = new JXLabel(somelongtext);
label.setLineWrap(true);  
Cleopatra
fuente
7

Hay una buena técnica aquí , 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);
Sam Barnum
fuente
7

Además de envolver el texto en <html>etiquetas, también debe colocar la etiqueta en un contenedor que respete la altura preferida y establezca el ancho al máximo. Por ejemplo, puede poner la etiqueta en el NORTE de unBorderLayout .

Aquí hay un programa de trabajo simple pero completo para ilustrar esto. Puede cambiar el tamaño del marco de la forma que desee; la etiqueta ocupará todo el ancho y la altura se ajustará en consecuencia para envolver el texto. Observe que todo lo que estoy haciendo es usar <html>etiquetas 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);
            }

        });
    }

}
Andrei Vajna II
fuente
0

<html>la envoltura funciona pero no en todos los casos. Si el contenedor principal usa FlowLayout, no funcionará. Por lo tanto, lo configuré en BoxLayout. Mira este fragmento de código:

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

No agregue <br>porque romperá su texto incluso si agranda el marco principal y el contenedor pRefundNote.

Jeff_Alieffson
fuente
-7

Si solo desea utilizar JLabel, puede probar este enfoque,

simplemente muestre el número de caracteres que desea mostrar en la etiqueta usando el método de subcadena.

public void setLabel(String label){
    String dispLabel=label.substring(0, numOfCharacter);
    labelComponent.setText(dispLabel);
}
Rajj
fuente
Esto no es un ajuste de texto.
SapuSeven