Java 如何创建按钮左边有文本,按钮右边有图标的JButton

Java 如何创建按钮左边有文本,按钮右边有图标的JButton,java,swing,icons,alignment,jbutton,Java,Swing,Icons,Alignment,Jbutton,基本上,我试图制作一个文本向左对齐的按钮(因此我使用setHorizontalAlignment(SwingConstants.left))和按钮右边框上远离文本的图像 我已经尝试了setHorizontalTextAlignment(SwingConstants.LEFT),但这只会使文本移到图标的左侧,这并不是我想要的,因为我需要将图标与之隔离 此外,我不能设置任何固定间距,因为这是一系列具有不同文本和不同大小的按钮。您可以向按钮添加布局管理器 JButton btn = new JButt

基本上,我试图制作一个文本向左对齐的按钮(因此我使用
setHorizontalAlignment(SwingConstants.left))
和按钮右边框上远离文本的图像

我已经尝试了
setHorizontalTextAlignment(SwingConstants.LEFT)
,但这只会使文本移到图标的左侧,这并不是我想要的,因为我需要将图标与之隔离


此外,我不能设置任何固定间距,因为这是一系列具有不同文本和不同大小的按钮。

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

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

很抱歉,在挑选一个好的布局时,我帮不了你多少忙,但这最终会让你得到你想要的。也许其他人可以对使用哪个按钮发表评论。

您可以在按钮中添加布局管理器

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
很抱歉,在挑选一个好的布局时,我帮不了你多少忙,但这最终会让你得到你想要的。也许其他人可以评论使用哪一个

我不能做任何固定的间距,因为这是一系列按钮,有不同大小的不同文本

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

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);
我不能做任何固定的间距,因为这是一系列按钮,有不同大小的不同文本

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

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);

这是camickr答案的衍生版本,允许在GUI构建器中进行编辑并将其放置在动态布局中。我还删除了
UIManager.getInt(“Button.iconTextGap”)
,因此如果需要,间隙将缩小到0

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

这还没有完全准备好生产,需要一些现场测试。如果我找到什么,我会编辑代码

[编辑]现在适用于垂直文本对齐。也简化了一点。

[edit2]还可以操纵
getPreferredSize
以更好地使用滚动窗格(否则滚动窗格会不断增长,不再收缩)

这是camickr答案的衍生版本,允许在GUI生成器中进行编辑,并将其放置在动态布局中。我还删除了
UIManager.getInt(“Button.iconTextGap”)
,因此如果需要,间隙将缩小到0

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

这还没有完全准备好生产,需要一些现场测试。如果我找到什么,我会编辑代码

[编辑]现在适用于垂直文本对齐。也简化了一点。

[edit2]还可以操纵
getPreferredSize
以更好地使用滚动窗格(否则滚动窗格将继续增长,不再收缩)

我打算提出这个建议,但“焦点指示器”不会在添加到按钮的组件周围绘制。我打算提出这个建议,但是“焦点指示器”不会在添加到按钮的组件周围绘制。请充分使用
getIconTextGap()
。对于那些想知道的人来说,它
返回文本与此按钮中显示的图标之间的空间量。
不幸的是,当按钮在GUI生成器生成的代码中实例化时,它不能使用此值。解决方法是将按钮子类化,并将其添加到GUI builder调色板中,这就是我所做的。我发现使用Java 11和分数显示比例(如125%),我必须从
gap
中减去一个2像素的模糊因子,否则随着一些布局的调整,偶尔会出现一个省略号。更新:@MarkJeronimus的回答似乎避免了这一点(并避免了文本位置的“抖动”)。很好地使用了
getIconTextGap()
。对于那些想知道的人来说,它
返回文本与此按钮中显示的图标之间的空间量。
不幸的是,当按钮在GUI生成器生成的代码中实例化时,它不能使用此值。解决方法是将按钮子类化,并将其添加到GUI builder调色板中,这就是我所做的。我发现使用Java 11和分数显示比例(如125%),我必须从
gap
中减去一个2像素的模糊因子,否则随着一些布局的调整,偶尔会出现一个省略号。更新:@MarkJeronimus的回答似乎避免了这一点(并避免了文本位置的“抖动”)