Авто-изменение размера JButton Icon - PullRequest
8 голосов
/ 23 ноября 2011

поэтому у меня есть эти JButtons, к которым я добавляю значки.Значки изначально слишком велики, поэтому я заранее изменил их размер, и все работает отлично.За исключением того, что когда я изменяю размер окна, кнопки JButtons меняют размер, но не значки, что проблематично.

Есть ли способ сделать так, чтобы Icon просто заполнял 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 - это личная функция, которая принимает Icon, параметр ширины и параметр высоты и возвращает измененный размер Icon (очевидно).Я пытался изменить макет, но это ничего не меняет.Я попытался получить ширину / высоту JButton, но, поскольку при добавлении Icon они еще не существуют, он не работает.

Не могли бы вы, ребята, представить, как это сделать?Это не обязательно должен быть значок, если мой JButton заполнен изображением, которое я ему даю, это здорово:)

Спасибо!

Ответы [ 3 ]

3 голосов
/ 23 ноября 2011
  1. Переопределить paintComponent
  2. Нарисуйте изображение непосредственно к Graphics объекту

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

3 голосов
/ 23 ноября 2011

в 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();
            }
        });
    }
}
2 голосов
/ 23 ноября 2011

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

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

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

...