Para un JLabel con ícono, si setHorizontalTextPosition(SwingConstants.LEADING)
, el ícono se pinta justo después del texto, sin importar qué tan ancha sea la etiqueta.¿Cómo justificar correctamente el icono en un JLabel?
Esto es especialmente malo para una lista, ya que los iconos estarían por todas partes dependiendo de cuánto tiempo el texto es para cada elemento.
He rastreado el código y parece ser que en SwingUtilities#layoutCompoundLabelImpl
, el ancho del texto simplemente se establece en SwingUtilities2.stringWidth(c, fm, text)
, y el icono x está configurado para seguir el texto sin tener en cuenta el ancho de la etiqueta.
Aquí es el caso más simple:
import java.awt.*;
import javax.swing.*;
public class TestJLabelIcon
{
public static void main(String args[])
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
JLabel c = new JLabel("abc");
c.setHorizontalTextPosition(SwingConstants.LEADING);
c.setHorizontalAlignment(SwingConstants.LEADING);
c.setIcon(UIManager.getIcon("FileChooser.detailsViewIcon"));
c.setBorder(BorderFactory.createLineBorder(Color.RED));
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(c);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
se puede ver que la etiqueta siempre se llena el cuadro, pero el icono permanece fija. Obtendrá el problema de espejo si establece ambos argumentos en TRAILING
.
Sé que puedo anular la interfaz de usuario, o usar un JPanel, etc. Me pregunto si me está perdiendo algo simple en JLabel. Si no, parece un error de Java.
FYI esto es jdk1.6.0_06 en Windows XP.
Nop, tengo que tener el texto justificado a la izquierda y el icono justificado a la derecha. –
Ah, entiendo a qué te refieres. – trashgod