java - mostrar - private jlabel
¿Hay una propiedad de "ajuste de palabras" para JLabel? (6)
Debería funcionar si ajusta el texto en <html>...</html>
ACTUALIZACIÓN: probablemente también deberías establecer el tamaño máximo, entonces.
Estoy mostrando un texto en un JLabel. Básicamente estoy generando ese texto dinámicamente, y luego aplico algunas etiquetas HTML (por ejemplo, BR
y B
) para formatear el texto. Finalmente asigno este texto formateado a mi JLabel.
Ahora quiero que mi Jlabel ajuste automáticamente el texto a la siguiente línea cuando llegue al final de la pantalla, como la función "Ajuste de texto" en el Bloc de notas.
¿Cómo puedo hacer eso?
Descubrí que esta solución es la más simple y funciona correctamente con el cambio de tamaño también. Además de envolver el texto en etiquetas <html>
, también debe colocar la etiqueta en un contenedor que respete la altura preferida y establecer el ancho al máximo. Por ejemplo, puede poner la etiqueta en el NORTE de un 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 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);
}
});
}
}
Me gusta el enfoque JTextArea mencionado anteriormente, porque cambia de tamaño muy bien en SOUTH en un panel BorderLayout (siempre que el componente CENTER pueda tomar el relevo si cambia el número de líneas en el JTextArea).
Sin embargo, en Nimbus L & F hay una trampa al establecer el color de fondo de JTextArea. Parece que Nimbus usa colores mágicos (clase extendida de java.awt.Color) que se vuelven transparentes en JTextArea. Entonces, si está copiando el color de fondo de un JPanel al área de JText, necesita convertir el Color a ARGB y volver a Color. El siguiente código funciona para mí en todos los L & F de mi JRE (Nimbus, CDE Motif, Metal, Mac OS X):
JTextArea ta = new JTextArea(text);
ta.setEditable(false);
ta.setLineWrap(true);
ta.setWrapStyleWord(true);
JLabel lb = new JLabel();
Font f = lb.getFont();
ta.setFont(f.deriveFont(f.getSize2D() * 0.9f));
ta.setBorder(lb.getBorder());
ta.setBackground(new Color(lb.getBackground().getRGB(), true));
ta.setForeground(new Color(lb.getForeground().getRGB(), true));
ta.setOpaque(lb.isOpaque());
Hice la fuente un poco más pequeña. Por supuesto, puede mantener el tamaño de fuente de JLabel si lo desea.
Se puede establecer un ancho para el body
usando estilos HTML (CSS). Esto a su vez determinará la cantidad de líneas a renderizar y, a partir de eso, la altura preferida de la etiqueta.
Establecer el ancho en CSS evita la necesidad de calcular dónde deberían ocurrir los saltos de línea en (o el mejor tamaño de) la etiqueta.
import javax.swing.*;
public class FixedWidthLabel {
public static void main(String[] srgs) {
final String s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean eu nulla urna. Donec sit amet risus nisl, a porta enim. Quisque luctus, ligula eu scelerisque gravida, tellus quam vestibulum urna, ut aliquet sapien purus sed erat. Pellentesque consequat vehicula magna, eu aliquam magna interdum porttitor. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Sed sollicitudin sapien non leo tempus lobortis. Morbi semper auctor ipsum, a semper quam elementum a. Aliquam eget sem metus.";
final String html1 = "<html><body style=''width: ";
final String html2 = "px''>";
Runnable r = new Runnable() {
@Override
public void run() {
JOptionPane.showMessageDialog(
null, new JLabel(html1 + "200" + html2 + s));
JOptionPane.showMessageDialog(
null, new JLabel(html1 + "300" + html2 + s));
}
};
SwingUtilities.invokeLater(r);
}
}
Solo pensé que debería publicar esto para cualquiera que busque en Internet, ya que fue el pequeño pequeño error que me costó 30 minutos, pero asegúrese de haber envuelto el texto en HTML. Puede haber pensado que lo hizo y aún no lo hizo. Compruébalo, lo olvidé, y cuando los envolví en HTML lo arreglé para mí.
JLabel label = new JLabel("Lorem ipsum long paragraph");
incorrecto.
JLabel label = new JLabel("<html>Lorem ipsum long paragraph</html>");
¡correcto!
Una forma sería usar un JTextArea
lugar de un JLabel
con setWrapStyleWord
y setLineWrap
establecido en true y con configuraciones para que se vea y se comporte como un JLabel
(eliminar el borde, hacerlo no opaco, hacerlo no editable y no enfocable).
De lo contrario, si necesita utilizar un JLabel
, se verá obligado a utilizar FontMetrics para medir su texto, verificar el espacio en blanco y, a continuación, agregar el HTML en las posiciones adecuadas usted mismo.