Como justificar à direita o ícone em um JLabel?

Para um JLabel com ícone, se vocêsetHorizontalTextPosition(SwingConstants.LEADING), o ícone é pintado logo após o texto, independentemente da largura do rótulo.

Isso é particularmente ruim para uma lista, pois os ícones estariam em todo o lugar, dependendo do tamanho do texto de cada item.

Rastreei o código e parece que emSwingUtilities#layoutCompoundLabelImpl, a largura do texto é simplesmente definida comoSwingUtilities2.stringWidth(c, fm, text), e o ícone x está definido para seguir o texto sem considerar a largura da etiqueta.

Aqui está o caso mais simples:

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

Você pode ver que a etiqueta sempre preenche o quadro, mas o ícone permanece colocado. Você terá o problema de espelhamento se definir os dois argumentos paraTRAILING.

Sei que posso substituir a interface do usuário ou usar um JPanel etc. Apenas me pergunto se estou perdendo algo simples no JLabel. Caso contrário, parece um bug do Java.

Para sua informação, este é o jdk1.6.0_06 no Windows XP.