如何在JLabel中右对齐图标?

Geoffrey Zheng :

对于带有图标的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。

垃圾神:

这是理想的效果吗?

附录:我认为应该有一个小组。

图片

import java.awt.*;
import javax.swing.*;

public class TestJLabelIcon {

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                JFrame frame = new JFrame();
                frame.setLayout(new GridLayout(0, 1));
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(createPanel("abc"));
                frame.add(createPanel("defghij"));
                frame.add(createPanel("klmn"));
                frame.add(createPanel("opq"));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

            private JPanel createPanel(String s) {
                JPanel p = new JPanel(new BorderLayout());
                p.add(new JLabel(s, JLabel.LEFT), BorderLayout.WEST);
                Icon icon = UIManager.getIcon("FileChooser.detailsViewIcon");
                p.add(new JLabel(icon, JLabel.RIGHT), BorderLayout.EAST);
                p.setBorder(BorderFactory.createLineBorder(Color.blue));
                return p;
            }
        });
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章