Как исправиться - выравнивают по ширине значок в JLabel?

Для 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.

К вашему сведению это - jdk1.6.0_06 на Windows XP.

9
задан mKorbel 31 March 2013 в 18:54
поделиться

1 ответ

Это желаемый эффект?

Приложение: Я думаю, что панель - это лучший вариант.

image

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;
            }
        });
    }
}
13
ответ дан 4 December 2019 в 06:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: