アイコン付きのJLabelの場合setHorizontalTextPosition(SwingConstants.LEADING)
、ラベルの幅に関係なく、アイコンはテキストの直後に描画されます。
各アイテムのテキストの長さに応じてアイコンがいたるところに表示されるため、これはリストにとって特に悪いことです。
コードをトレースしたところ、SwingUtilities#layoutCompoundLabelImpl
では、テキストの幅は単純にに設定されてSwingUtilities2.stringWidth(c, fm, text)
おり、アイコンxはラベルの幅を考慮せずにテキストの後に続くように設定されているようです。
最も単純なケースは次のとおりです。
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);
}
});
}
}
ラベルは常にフレーム全体に表示されますが、アイコンは配置されたままであることがわかります。両方の引数をに設定すると、ミラーの問題が発生しますTRAILING
。
UIをオーバーライドしたり、JPanelなどを使用したりできることはわかっています。JLabelに単純なものが欠けているのではないかと思います。そうでない場合は、Javaのバグのようです。
参考までに、これはWindowsXPではjdk1.6.0_06です。