使用宽高比自动调整JButton的大小

时间:2013-08-25 15:57:29

标签: java image swing jbutton imageicon

我想要一个只显示图标(或图像,真的)的JButton。我喜欢有正常的按钮边框,以便用户确认它是一个他可以点击的按钮。此按钮应具有固定高度,但会根据其图标的宽高比调整其宽度。

  • 假设按钮将要从每条边缘5px绘制的图像进行插入
  • 假设我已将按钮的首选高度和最大高度设置为50px。
  • 因此,我分配给按钮的任何图像都应该以40像素的高度绘制,宽度取决于图像的纵横比。
  • 例如,如果我指定尺寸为200x100的图像,结果应该是按钮的尺寸应为90x50(图像绘制为80x40,加上5px边框)。

是否有可以执行此操作的自定义JButton类?如果没有,我将如何实施?

编辑 BTW,我可以从外面重新调整图标,但我更喜欢按钮来执行此操作。

编辑2:对我来说,最大的问题是:何时以及如何确定和设置所需的按钮大小?缩放图像以进行绘图不是问题。

2 个答案:

答案 0 :(得分:4)

  

是否有可以执行此操作的自定义JButton类?

不是我知道的。

  

如果没有,我将如何实施?

我会通过扩展ImageIcon来扩展图像。

E.G。

Scaled images

import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;

class ScaledImageIcon extends ImageIcon {
    ScaledImageIcon(Image image, int height) {
        super(image.getScaledInstance(-1, height, Image.SCALE_SMOOTH));
    }
}

public class ScalableIcons {

    public static void main(String[] args) throws Exception {
        final Image img1 = ImageIO.read(
                new URL("http://i.stack.imgur.com/gJmeJ.png"));
        final Image img2 = ImageIO.read(
                new URL("http://i.stack.imgur.com/ET1EH.png"));
        Runnable r = new Runnable() {

            @Override
            public void run() {
                JPanel gui = new JPanel(new BorderLayout(5,5));

                final JLabel display = new JLabel();
                display.setPreferredSize(new Dimension(410,200));

                ActionListener al = new ActionListener() {

                    @Override
                    public void actionPerformed(ActionEvent e) {
                        String s = e.getActionCommand();
                        switch (s) {
                            case "1":
                                display.setIcon(new ImageIcon(img1));
                                break;
                            case "2":
                                display.setIcon(new ImageIcon(img2));
                                break;
                        }
                    }
                };

                JPanel imageButtons = new JPanel(
                        new FlowLayout(FlowLayout.CENTER,5,5));

                JButton b1 = new JButton( "1", new ScaledImageIcon(img1,40));
                b1.addActionListener(al);
                imageButtons.add(b1);

                JButton b2 = new JButton( "2", new ScaledImageIcon(img2,40));
                b2.addActionListener(al);
                imageButtons.add(b2);

                gui.add(imageButtons, BorderLayout.NORTH);
                gui.add(display, BorderLayout.CENTER);

                JOptionPane.showMessageDialog(null, gui);
            }
        };
        // Swing GUIs should be created and updated on the EDT
        // http://docs.oracle.com/javase/tutorial/uiswing/concurrency
        SwingUtilities.invokeLater(r);
    }
}

答案 1 :(得分:0)

不确定我完全理解用户界面或要求,但Darryl的Stretch Icon可能会帮助你。它会根据组件大小自动调整图标大小,并可选择保持宽高比。