Значок автообновления JButton

поэтому у меня есть 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 заполнен изображением, которое я ему даю, это потрясающе:)

Спасибо!

Ответ 1

в Swing вы можете добавить любой JComponent к другому JComponent, для Image есть JLabel лучший JComponent, то почему бы не поместить JLabel#setIcon() в JButton

enter image description hereenter 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();
            }
        });
    }
}

Ответ 2

И при рисовании изображения укажите размерные аргументы getWidth() и getHeight(). При этом изменение размера будет автоматизировано. Кроме того, при изменении размера вы захотите сделать сглаживание, чтобы изображение не было слишком пиксельным.

Ответ 3

Вы можете добавить Component-Listener к этой кнопке, которая при изменении размера изменяет размер вашего изображения в нем

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

Надеюсь, что это поможет!