setIconTextGap 用于居中对齐的标签
Posted
技术标签:
【中文标题】setIconTextGap 用于居中对齐的标签【英文标题】:setIconTextGap for labels with centered alignment 【发布时间】:2020-07-18 05:23:44 【问题描述】:我需要在 JLabel 的表头中添加一个图标。
当文本在左侧对齐时,它工作正常。
但是,当文本居中时,不考虑调用 setIconTextGap()。这样的效果是,图标也被放置在标签的中心:
这不是一般的工作,还是我错过了什么?
我正在使用 Java 6(无法改变这一事实)。
我在下面创建了一个 SSCCE:
import javax.swing.*;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import java.awt.*;
public class Main
public static void main(String[] args)
IconLabel label1 = new IconLabel("test text left", new TableArrowIcon(TableArrowIcon.TableArrowDirection.NORTH), SwingConstants.LEFT);
IconLabel label2 = new IconLabel("test text center", new TableArrowIcon(TableArrowIcon.TableArrowDirection.NORTH), SwingConstants.CENTER);
Object[][] data =
"Speed reading", 20, true ,
"Joe", "Brown", "Pool", 10, false
;
String[] columnNames = "test", "test" ;
JPanel panel = new JPanel(new BorderLayout());
final JTable table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
label2.setHorizontalTextPosition(JLabel.CENTER);
TableColumn column1 = new TableColumn();
TableColumn column2 = new TableColumn();
column1.setHeaderRenderer(label1);
column2.setHeaderRenderer(label2);
table.addColumn(column1);
table.addColumn(column2);
JScrollPane scrollPane = new JScrollPane(table);
panel.add(scrollPane);
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(1);
frame.add(panel);
frame.pack();
frame.setVisible(true);
public static class IconLabel extends JLabel implements TableCellRenderer
private final Icon icon;
private final int alignment;
public IconLabel(String text, Icon icon, int alignment)
super(text);
this.icon = icon;
setIcon(icon);
setPreferredSize(new Dimension(50, 20));
this.alignment = alignment;
@Override
public void setBounds(int x, int y, int width, int height)
super.setBounds(x, y, width, height);
int textWidth = getFontMetrics(getFont()).stringWidth(getText());
Insets insets = getInsets();
int iconTextGap = width - textWidth - icon.getIconWidth() - insets.left - insets.right - 3;
setIconTextGap(iconTextGap);
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column)
setHorizontalTextPosition(alignment);
return this;
public static class TableArrowIcon implements Icon
public enum TableArrowDirection
NORTH()
@Override
public void drawArrow(Graphics2D g, int controlSize, int x, int y)
g.drawLine(x + 3, y + (controlSize - 10), x + 7, y + (controlSize - 14));
g.drawLine(x + 7, y + (controlSize - 14), x + (controlSize - 9), y + (controlSize - 10));
;
public abstract void drawArrow(Graphics2D g, int controlSize, int x, int y);
private final TableArrowDirection direction;
public TableArrowIcon(TableArrowDirection direction)
this.direction = direction;
@Override
public void paintIcon(Component c, Graphics g, int x, int y)
g.setColor(Color.darkGray);
int controlSize = 20;
((Graphics2D) g).setRenderingHint( RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON );
direction.drawArrow((Graphics2D) g, controlSize, x, y);
@Override
public int getIconWidth()
return 14;
@Override
public int getIconHeight()
return 14;
提前感谢您的任何指点。
【问题讨论】:
【参考方案1】:-
使用 JPanel 作为渲染器并向面板添加两个标签。一个用于文本,另一个用于图标。
您可以为面板使用 BorderLayout。
将文本标签添加到 CENTER,将图标添加到 LINE_END。
然后您需要一个渲染器参数来指示文本是左对齐还是居中。这应该在构造函数中设置。
【讨论】:
感谢您,但这不会正常工作,因为文本不会居中对齐,而只会在其标签内。这意味着文本对齐将关闭图标大小:) @Fish-Guts 然后使用带有 FlowLayout 的 JPanel。关键是要有创意并使用适当的布局管理器来实现您想要的布局。您的问题没有清楚地解释您要做什么,因此该建议也不能具体。此外,当人们花时间提供帮助时,您不应该花一个月的时间来回复。以上是关于setIconTextGap 用于居中对齐的标签的主要内容,如果未能解决你的问题,请参考以下文章