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.