11

アイコン付きの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です。

4

3 に答える 3

24

以下を使用する必要があります。

label1.setHorizo​​ntalTextPosition(SwingConstants.LEFT);

(アイコンを基準にして、テキストの位置を設定します)

于 2012-08-28T14:29:08.247 に答える
15

これは望ましい効果ですか?

補遺: パネルが最適だと思います。

画像

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;
            }
        });
    }
}
于 2010-05-29T00:25:42.453 に答える