【问题标题】:Java JButton two or more iconsJava JButton 两个或多个图标
【发布时间】:2020-04-26 16:00:57
【问题描述】:

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

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

【问题讨论】:

    标签: java swing jbutton


    【解决方案1】:

    实现这一点的最佳方法是创建一个实现Icon 接口的自定义类,它只是并排绘制两个给定的图标。

    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

    【讨论】:

    • (1+) 请参阅:Compound Icon 以获得更灵活的类,它提供了许多不同的图标组合选项。
    【解决方案2】:

    这两个图标(快乐/悲伤)真的是所需的图标吗?如果是这样,我建议改为使用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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-24
      • 1970-01-01
      • 2011-08-24
      • 2019-06-19
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2015-07-03
      相关资源
      最近更新 更多