如何在左侧按钮上创建一个带有文本并在右侧按钮上与其分开的图标的 JButton

Posted

技术标签:

【中文标题】如何在左侧按钮上创建一个带有文本并在右侧按钮上与其分开的图标的 JButton【英文标题】:How to create a JButton with text on the button left and the icon separated from it on the button right 【发布时间】:2016-03-26 10:24:28 【问题描述】:

基本上,我正在尝试制作一个文本与左对齐的按钮(所以我使用setHorizontalAlignment(SwingConstants.LEFT)) 和按钮右边框上的图像,远离文本。

我已经尝试过setHorizontalTextAlignment(SwingConstants.LEFT),但这只会使文本相对于图标的左侧,这并不是我想要的,因为我需要将图标与它隔离开来。

另外,我无法设置任何固定间距,因为它是一系列按钮,带有不同大小的不同文本。

【问题讨论】:

【参考方案1】:

您可以为按钮添加布局管理器。

JButton btn = new JButton();
btn.add(new JLabel(text));
btn.add(new JLabel(img));
btn.setLayout(/*best layout choice here*/);
btn.setPreferredSize(new Dimension(x,y));
btn.setMaximumSize(new Dimension(maxX, minY));
btn.setMinimumSize(new Dimension(minX, minY)); //this one is most important when it comes to layoutmanagers

抱歉,在选择一个好的布局时我帮不上什么忙 - 但这最终会让你得到你想要的。也许其他人可以评论使用哪一个。

【讨论】:

我打算建议这样做,但“焦点指示器”不会围绕您添加到按钮的组件进行绘制。【参考方案2】:

我无法设置任何固定间距,因为它是一系列不同大小的不同文本的按钮。

您可以使用以下代码动态更改间距:

JButton button = new JButton("Text on left:")

    @Override
    public void doLayout()
    
        super.doLayout();

        int preferredWidth = getPreferredSize().width;
        int actualWidth = getSize().width;

        if (actualWidth != preferredWidth)
        
            int gap = getIconTextGap() + actualWidth - preferredWidth;
            gap = Math.max(gap, UIManager.getInt("Button.iconTextGap"));
            setIconTextGap(gap);
        
    
;
button.setIcon( new ImageIcon("copy16.gif") );
button.setHorizontalTextPosition(SwingConstants.LEADING);

【讨论】:

善用getIconTextGap()。对于那些想知道的人,Returns the amount of space between the text and the icon displayed in this button. 很遗憾,当按钮在 GUI 构建器生成的代码中实例化时,无法使用此功能。一种解决方法是将按钮子类化并将其添加到 GUI 构建器面板中,这就是我所做的。 我发现使用 Java 11 和分数显示缩放(如 125%)我必须从 gap 中减去 2 个像素的软糖因子,否则在调整某些布局大小时会偶尔出现省略号。 更新: @MarkJeronimus 的回答似乎避免了这种情况(并避免了文本位置“抖动”。)【参考方案3】:

这是 camickr 答案的衍生版本,允许在 GUI 构建器中进行编辑以及将其放置在动态布局中。我还删除了UIManager.getInt("Button.iconTextGap"),因此如有必要,差距将缩小到 0。

我将其称为“对齐”按钮,类似于对齐文本对齐(通过增加空格字符的宽度来左右拉伸段落)。

public class JustifiedButton extends JButton 
    @Override
    public void doLayout() 
        super.doLayout();

        setIconTextGap(0);
        if (getHorizontalTextPosition() != CENTER) 
            int newGap = getSize().width - getMinimumSize().width;
            if (newGap > 0)
                setIconTextGap(newGap);
        
    

    @Override
    public Dimension getMinimumSize() 
        Dimension minimumSize = super.getMinimumSize();

        if (getHorizontalTextPosition() != CENTER)
            minimumSize.width -= getIconTextGap();

        return minimumSize;
    

    @Override
    public Dimension getPreferredSize() 
        Dimension preferredSize = super.getPreferredSize();

        if (getHorizontalTextPosition() != CENTER)
            preferredSize.width -= getIconTextGap();

        return preferredSize;
    

这还不是完全可以生产的,需要进行一些现场测试。如果我找到任何东西,我会编辑代码。

[编辑] 现在适用于垂直文本对齐。也简化了一点。 [edit2] 还可以操纵getPreferredSize 与滚动窗格配合使用(否则它会不断增长并且永远不会再次缩小)

【讨论】:

以上是关于如何在左侧按钮上创建一个带有文本并在右侧按钮上与其分开的图标的 JButton的主要内容,如果未能解决你的问题,请参考以下文章

Silverlight:带有文本修剪功能的按钮模板

在搜索栏的左侧和右侧添加按钮

如何在屏幕的左侧和右侧放置 Angular Material 单选按钮?

如何在右侧耳机播放音频,在左侧播放音乐?

带有按钮和文本字段的 UIScrollview [关闭]

如何在右侧创建一个带有图标的按钮?