¿Cómo justificar a la derecha el ícono en un JLabel?

Para un JLabel con ícono, sisetHorizontalTextPosition(SwingConstants.LEADING), el icono se pinta justo después del texto, sin importar qué tan ancho sea la etiqueta.

Esto es particularmente malo para una lista, ya que los íconos estarían por todas partes dependiendo de la duración del texto de cada elemento.

Rastreé el código y parece ser que enSwingUtilities#layoutCompoundLabelImpl, el ancho del texto simplemente se establece enSwingUtilities2.stringWidth(c, fm, text), y el icono x está configurado para seguir el texto sin tener en cuenta el ancho de la etiqueta.

Aquí está 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);
            }
        });
    }
}

Puede ver que la etiqueta siempre llena el marco, pero el ícono permanece fijo. Obtendrá el problema del espejo si establece ambos argumentos enTRAILING.

Sé que puedo anular la interfaz de usuario o usar un JPanel, etc. Me pregunto si me falta algo simple en JLabel. Si no, parece un error de Java.

FYI esto es jdk1.6.0_06 en Windows XP.

Respuestas a la pregunta(3)

Su respuesta a la pregunta