在JButton上设置多个图标

时间:2013-04-30 12:06:22

标签: java swing button icons jbutton

我有JButton我已经设置了自定义图标。现在我希望它在我将鼠标光标拖到它上面时显示的另一个图标上面显示但我无法弄清楚如何操作它,因为如果我使用button.setIcon(icon);它将替换图标已经显示。我怎样才能以尽可能简单的方式做到这一点?

5 个答案:

答案 0 :(得分:4)

  

我有一个JButton,我已经设置了自定义图标。现在我想要它   在我显示的那个上显示另一个图标   将我的鼠标光标拖到它上面,但我无法弄清楚如何做到这一点   因为如果我使用button.setIcon(icon);它将取代那个图标   已经显示。我将如何以一种简单的方式做到这一点   可能的

  • 我认为那是JButton.setRolloverIcon(myIcon);

JButton已在API

中实现了这些方法
JButton.setIcon(myIcon);
JButton.setRolloverIcon(myIcon);
JButton.setPressedIcon(myIcon);
JButton.setDisabledIcon(myIcon);

答案 1 :(得分:3)

如果您的图标已经透明,则可以轻松实现自己的Icon以将两者结合起来 -

public class CombineIcon implements Icon {
    private Icon top;
    private Icon bottom;

    public CombineIcon(Icon top, Icon bottom) {
        this.top = top;
        this.bottom = bottom;
    }

    public int getIconHeight() {
        return Math.max(top.getIconHeight(), bottom.getIconHeight());
    }

    public int getIconWidth() {
        return Math.max(top.getIconWidth(), bottom.getIconWidth());
    }

    public void paintIcon(Component c, Graphics g, int x, int y) {
        bottom.paintIcon(c, g, x, y);
        top.paintIcon(c, g, x, y);
    }
}

使用setRolloverIcon(icon)指定鼠标悬停在按钮上时要显示的图标。

答案 2 :(得分:1)

创建包含叠加层的该按钮图标的第二个版本。鼠标悬停切换到带叠加层的图像。

另一种方法可能是将图标及其叠加层组合到内存中的新图标,并将其作为图标放在按钮上。如果您的图标经常更改,这可能是一个很好的方法。如果不是这样,我肯定会使用第一种方法。

答案 3 :(得分:1)

我觉得这很容易。

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

class CombinedIconButton {

    public static BufferedImage getCombinedImage(BufferedImage i1, BufferedImage i2) {
        if (i1.getHeight() != i2.getHeight()
                || i1.getWidth() != i2.getWidth()) {
            throw new IllegalArgumentException("Images are not the same size!");
        }
        BufferedImage bi = new BufferedImage(
                i1.getHeight(), 
                i1.getWidth(), 
                BufferedImage.TYPE_INT_ARGB);
        Graphics g = bi.getGraphics();
        g.drawImage(i1,0,0,null);
        g.drawImage(i2,0,0,null);
        g.dispose();

        return bi;
    }

    public static void main(String[] args) throws Exception {
        URL url1 = new URL("http://i.stack.imgur.com/gJmeJ.png"); // blue circle
        URL url2 = new URL("http://i.stack.imgur.com/5v2TX.png"); // red triangle
        final BufferedImage bi1 = ImageIO.read(url1);
        final BufferedImage bi2 = ImageIO.read(url2);
        final BufferedImage biC = getCombinedImage(bi1,bi2);
        Runnable r = new Runnable() {

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

                JToggleButton b = new JToggleButton();
                b.setIcon(new ImageIcon(bi1));
                b.setRolloverIcon(new ImageIcon(biC));
                b.setSelectedIcon(new ImageIcon(bi2));

                gui.add(b);

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

图片来自this answer

答案 4 :(得分:0)

一种方法是:

创建一个图标,当某个图像编辑工具将指针悬停在按钮顶部时,您想要查看该图标。并在鼠标悬停事件发生后设置该图像。

P.S。使用任何图片编辑工具,您可以轻松创建叠加图像。

我现在也看到了AbsractButton类中存在滚动图标的概念。你也可以使用它。