For a JLabel with icon, if you setHorizontalTextPosition(SwingConstants.LEADING)
, the icon is painted right after text, no matter how wide the label is.
I found a much easier way to do this. I needed to have this kind of layout in a JTable, and did the right justification by getting the text width and then manually setting the width between the text and the icon. I subclassed a DefaultTableCellRenderer for my JTable
public class FixedWidthRenderer extends DefaultTableCellRenderer
{
...
@Override
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column)
{
...
FontMetrics met = super.getFontMetrics(super.getFont());
int width = met.stringWidth(super.getText());
super.setIconTextGap(DESIREDWIDTH - width);
...
}
}
Works great!
And yes, for real code one should check that the text width is not bigger than the DESIREDWIDTH.
For automatic right-alignment without a fixed width that works with columns of variable width:
@Override
public void setBounds(int x, int y, int width, int height) {
super.setBounds(x, y, width, height);
if (getIcon() != null) {
int textWidth = getFontMetrics(getFont()).stringWidth(getText());
Insets insets = getInsets();
int iconTextGap = width - textWidth - getIcon().getIconWidth() - insets.left - insets.right - PADDING;
setIconTextGap(iconTextGap);
} else {
setIconTextGap(0);
}
}
Is this the desired effect?
Addendum: I think a panel is the way to go.
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;
}
});
}
}
You should use:
label1.setHorizontalTextPosition(SwingConstants.LEFT);
(Set the position of the text, relative to the icon)