2

我想要一个只显示一个图标(或图像,真的)的 JButton。我确实喜欢有正常的按钮边框,以便用户确实认识到这是一个他可以单击的按钮。这个按钮应该有一个固定的高度,但是根据图标的纵横比调整它的宽度。

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

是否有可用的自定义 JButton 类可以做到这一点?如果没有,我将如何实施?

编辑:顺便说一句,我可以从外面重新缩放图标,但我更喜欢按钮来做到这一点。

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

4

2 回答 2

4

是否有可用的自定义 JButton 类可以做到这一点?

从来没听说过。

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

我会通过扩展ImageIcon来缩放图像来接近它。

例如

缩放图像

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);
    }
}
于 2013-08-25T16:06:48.613 回答
0

不确定我是否完全理解 UI 或要求,但也许 Darryl 的Stretch Icon会帮助你。它会根据组件大小自动调整图标大小,并可以选择保持纵横比。

于 2013-08-25T17:19:53.437 回答