Java JButton 两个或多个图标

Java JButton two or more icons

我想为一个 JButton(Java、Swing)设置两个或更多图标。可能吗?

我添加了绘图中的图片。 ;-)

实现此目的的最佳方法是创建一个实现 Icon 界面的自定义 class,它只是并排绘制两个给定的图标。

public class TwoIcon implements Icon {

    private final int iconGap = 2;
    private final Icon icon1;
    private final Icon icon2;

    public TwoIcon(final Icon icon1, final Icon icon2) {
        this.icon1 = icon1;
        this.icon2 = icon2;
    }

    @Override
    public void paintIcon(Component c, Graphics g, int x, int y) {
        int mid = getIconHeight() / 2;
        int y1 = y + mid - icon1.getIconHeight() / 2;
        int y2 = y + mid - icon2.getIconHeight() / 2;
        icon1.paintIcon(c, g, x, y1);
        icon2.paintIcon(c, g, x + icon1.getIconWidth() + iconGap, y2);
    }

    @Override
    public int getIconWidth() {
        return icon1.getIconWidth() + icon2.getIconWidth() + iconGap;
    }

    @Override
    public int getIconHeight() {
        return Math.max(icon1.getIconHeight(), icon2.getIconHeight());
    }
}

图标将以 2 的内边距并排绘制,并垂直居中。 如果您希望它们以不同方式对齐,请调整间距。

Icon leftIcon = ...
Icon rightIcon = ...
button.setIcon(new TwoIcon(leftIcon, rightIcon));

结果: 我只是在这里使用绘制纯色的图标。一个大小为 16x16,另一个大小为 20x20,以演示垂直对齐。

事实上,这不仅限于 JButton,而且适用于任何可以使用图标的 JComponent,例如JLabel

这两个图标(快乐/悲伤)真的是必需的图标吗?如果是这样,我建议改为使用 JCheckBox 并将图标设置为默认图标和选定图标(以便复选框在选择时在它们之间更改)。

方法如下(使用红色图标表示快乐,使用蓝色图标表示悲伤)。

import java.awt.*;
import java.io.IOException;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.net.*;
import javax.imageio.ImageIO;

public class CheckBoxWithIcons {

    private JComponent ui = null;
    Image happyImage;
    Image sadImage;

    CheckBoxWithIcons() {
        try {
            initUI();
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public final void initUI() throws MalformedURLException, IOException {
        if (ui!=null) return;

        happyImage = ImageIO.read(new URL("https://i.stack.imgur.com/wCF8S.png"));
        sadImage = ImageIO.read(new URL("https://i.stack.imgur.com/gJmeJ.png"));

        ui = new JPanel(new BorderLayout(4,4));
        ui.setBorder(new EmptyBorder(4,100,4,100));

        JCheckBox checkBox = new JCheckBox("Mood", true);
        checkBox.setIcon(new ImageIcon(sadImage));
        checkBox.setSelectedIcon(new ImageIcon(happyImage));
        ui.add(checkBox);
    }

    public JComponent getUI() {
        return ui;
    }

    public static void main(String[] args) {
        Runnable r = () -> {
            try {
                UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
            } catch (Exception useDefault) {
            }
            CheckBoxWithIcons o = new CheckBoxWithIcons();

            JFrame f = new JFrame(o.getClass().getSimpleName());
            f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
            f.setLocationByPlatform(true);

            f.setContentPane(o.getUI());
            f.pack();
            f.setMinimumSize(f.getSize());

            f.setVisible(true);
        };
        SwingUtilities.invokeLater(r);
    }
}