自动调整大小的JButton图标

8
我有一些JButtons,我向它们添加了图标。这些图标最初太大了,所以我在调整大小之前对它们进行了缩放,这样就可以正常工作了。但是当我调整窗口大小时,JButtons的大小会改变,但是图标不会改变大小,这是一个问题。
有没有办法让图标只填充与其相连的JButton?以下是一些代码,以使其更清晰:
public JewelClass(){

    setBackground (new Color (30,30,30)); 
    addActionListener(this);
    setLayout(new GridLayout());

    ImageIcon icon = new ImageIcon(src/carre.jpg);
    setIcon (resizeIcon(icon,60,60));

}

resizeIcon是一个个人函数,它接受一个图标、一个宽度参数和一个高度参数,并返回一个调整大小后的图标(显然)。

我尝试改变布局,但它并没有改变任何东西。我尝试获取JButton的宽度/高度,但由于在添加图标时它们还不存在,所以无法工作。

你们有什么想法可以解决这个问题吗?只要我的JButton填充了我给它的图像,就很好 :)

谢谢!

3个回答

3
  1. 覆盖paintComponent
  2. 将图像直接绘制到其Graphics对象

在绘制图像时,提供尺寸参数getWidth()getHeight()。通过这样做,就可以自动调整大小。此外,在调整大小时,您还需要进行一些抗锯齿处理,以防图像过于呈像素化状态。


3
在Swing中,您可以将任何JComponent添加到另一个JComponent中,对于Image来说,JLabel是最好的JComponent,那么为什么不将JLabel#setIcon()放在JButton上呢?

enter image description here enter image description here

import java.awt.*;
import javax.swing.*;

public class ResizeIconInButton extends JFrame {
    private static final long serialVersionUID = 1L;

    public ResizeIconInButton() {
        JButton myButton = new JButton();
        myButton.setLayout(new BorderLayout());
        myButton.add(new CustomComponents0());
        add(myButton, BorderLayout.CENTER);
        setPreferredSize(getPreferredSize());
        setTitle("Resize Icon In Button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        Runnable r = new Runnable() {

            @Override
            public void run() {
                ResizeIconInButton main = new ResizeIconInButton();

            }
        };
        javax.swing.SwingUtilities.invokeLater(r);
    }
}

class CustomComponents0 extends JLabel {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getMinimumSize() {
        return new Dimension(200, 100);
    }

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(300, 200);
    }

    @Override
    public void paintComponent(Graphics g) {
        int margin = 10;
        Dimension dim = getSize();
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(margin, margin, dim.width - margin * 2, dim.height - margin * 2);
    }
}

EDIT:

import java.awt.*;
import javax.swing.*;

public class ResizeIconInButton extends JFrame {

    private static final long serialVersionUID = 1L;
    private static final String IMAGE_PATH = "http://duke.kenai.com/misc/Bullfight.jpg";
    private JButton myButton = new JButton();
    private JLabel myLabel = new JLabel();

    public ResizeIconInButton() {
        Icon myIcon = new ImageIcon(IMAGE_PATH);
        myLabel.setIcon(myIcon);
        myButton.setLayout(new BorderLayout());
        myButton.add(myLabel);
        add(myButton, BorderLayout.CENTER);
        setPreferredSize(new Dimension(200, 100));
        setTitle("Resize Icon In Button");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pack();
        setVisible(true);
    }

    public static void main(String[] args) {
        java.awt.EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                ResizeIconInButton main = new ResizeIconInButton();
            }
        });
    }
}

1
仍然无法调整图像大小(根据我的理解,这是OP的问题)。基本上,将组件添加到组件中是一种极其迂回的实现目标的方式,特别是如果它没有实现目标<g>。我错过了什么吗? - kleopatra
实际上,这个答案并没有达到预期的效果。 - Tomáš Zato
@mKorbel说过一句从未犯过错误的英文句子... 无论如何,我只是想指出我与kleopatra持有相同的反对意见。 - Tomáš Zato
@Tomáš Zato 1. “无论如何,我只是想指出我和kleopatra有同样的反对意见。” == 这不一样,例如真正的Swing大师与你,2. “说一个从未犯过错误的英语句子的人…” == 我不需要那个,嗯,现在我记得正确的话,期望你,3. 你尝试了什么,因为我的建议是所有建议中最快的,还有其他的,编辑时你非常清楚 - 调整图像大小的3种方法(连同)在JButton中,JLabel中Icon / ImageIcon的优化非常简单,快速且是我最喜欢的。 - mKorbel
我不理解你说的一半内容。很抱歉,我们无法用英语进行讨论。 - Tomáš Zato
显示剩余3条评论

2
您可以给该按钮添加一个组件监听器,以便在调整大小时调整其中的图像。
yourButton.addComponentListener(new ComponentListener() {

        @Override
        public void componentShown(ComponentEvent e) {
            // ignore
        }

        @Override
        public void componentResized(ComponentEvent e) {
            resizeIcon(icon, yourButton.getWidth(), yourButton.getHeight());
        }

        @Override
        public void componentMoved(ComponentEvent e) {
            // ignore
        }

        @Override
        public void componentHidden(ComponentEvent e) {
            // ignore
        }
    });

希望这有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接