Pregunta

Estoy tratando de hacer un JLabel oscilación con varias líneas de texto. Se añadió muy bien, pero los saltos de línea no vienen a través. ¿Cómo hago esto? Por otra parte, ¿puedo especificar un ancho máximo de un JLabel y saber que el texto se envolvía, como en un div?

    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);        
    }
¿Fue útil?

Solución

Usar HTML en setText, por ejemplo.

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

Otros consejos

Por defecto, Swing no ajustar el texto. Si especifica un tamaño en el JLabel que sólo pintar la parte del texto que se ajusta y luego añadir "..." al final.

Como se ha sugerido que puede utilizar HTML para permitir el ajuste de línea. Sin embargo, en realidad, he creado un delegado interfaz de usuario personalizada oscilación no hace mucho tiempo para lograr esto y aún más: MultiLineLabelUI .

Se envolverá el texto para adaptarse al espacio disponible y también respetar los saltos de línea duros. Si decide probarlo, es tan simple como:

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

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

Actualizar

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

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

Se puede poner HTML dentro de un JLabel y utilizar la etiqueta de salto de línea para lograr esto.

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

simple, usar HTML. Los componentes Swing de Java, aunque no proporciona un soporte 'fantástico' para el HTML, que se puede utilizar para tales fines simples.

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

no me las arreglo para especificar la anchura máxima de una etiqueta, pero se puede especificar un ancho de hormigón. 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);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top