【发布时间】:2011-02-25 07:39:52
【问题描述】:
对于带有图标的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 错误。
仅供参考,这是 Windows XP 上的 jdk1.6.0_06。
【问题讨论】:
标签: java swing jpanel jlabel layout-manager