Java JButton две или более иконки - PullRequest
0 голосов
/ 26 апреля 2020

Я хотел бы установить два или более значков на один JButton (Java, Swing). Возможно ли это?

Я добавляю рисунок, выполненный на чертеже. ; -)

enter image description here

Ответы [ 3 ]

4 голосов
/ 26 апреля 2020

Лучший способ добиться этого - создать собственный класс, реализующий интерфейс 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));

Результат: я просто использую иконки, которые рисуют здесь цвет solid. Один имеет размер 16x16, а другой 20x20 для демонстрации вертикального выравнивания.

enter image description here

Фактически это не ограничивается JButton и будет для любого JComponent, который может использовать значок, например JLabel et c.

1 голос
/ 26 апреля 2020

Эти две иконки (счастливые / грустные) буквально требуются? Если это так, я бы предложил вместо этого использовать 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);
    }
}
0 голосов
/ 26 апреля 2020

Не думаю, что это возможно. Но вы можете сделать это следующим образом.

  1. Создайте базовый JButton и не добавляйте в него ничего.

JButton base = new JButton();

Создайте 3 кнопки J и передайте на них свои изображения.

JButton b1= new JButton(img1);

JButton b2= new JButton(img2);

JButton b3= new JButton(img3);

Добавьте 3 кнопки J в базу JButton. base.add(b1); base.add(b2); base.add(b3);

Совет: Вы также можете взять JLabel за основу.

...