Для 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.
Это желаемый эффект?
Приложение: Я думаю, что панель - это лучший вариант.
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;
}
});
}
}