鼠标悬停时更改背景图片的JButton

5

我想要展示一个带有图像的JButton,但是我不知道如何让鼠标悬停在上面时起作用。图片的正常显示可以工作。 另外,如果按钮上绘制的文本能够居中就更好了。

import java.awt.*;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JFrame;

public class ImageButtonTest {

    private static JButton imageButton;

    public static void main(String[] args) throws IOException {
        JFrame frm = new JFrame();
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frm.setSize(90, 27);
        frm.setLocation(50, 50);
        Image image = ImageIO.read(new URL("http://i.imgur.com/bitgM6l.png"));
        Image imageHover = ImageIO.read(new URL("http://i.imgur.com/dt81BWk.png"));
        imageButton = new ImageButton(image, imageHover);
        imageButton.setText("Download");
        frm.add(imageButton);
        frm.pack();
        frm.setVisible(true);
    }

    static class ImageButton extends JButton {
        private Image image, imageHover;
        private boolean hover;

        ImageButton(Image image, Image imageHover) {
            this.image = image;
            this.hover = false;


            addMouseListener(new java.awt.event.MouseAdapter() {  
                @Override
                public void mouseEntered(java.awt.event.MouseEvent evt) {
                    hover = true;
                    repaint();
                }

                @Override
                public void mouseExited(java.awt.event.MouseEvent evt) {
                    hover = false;
                    repaint();
                }
            });
        };

        @Override
        protected void paintComponent(Graphics g) {

            if(isEnabled()) {
                Graphics2D g2 = (Graphics2D) g.create();
                g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
                g2.setFont(new Font("Arial", Font.PLAIN, 12));
                g2.setColor(Color.WHITE);

                if(hover) {
                    g2.drawImage(imageHover, 0, 0, getWidth(), getHeight(), this);
                } else {
                    g2.drawImage(image, 0, 0, getWidth(), getHeight(), this);
                }
                g2.drawString(getText(), 20, getHeight() / 2 + 5);

                g2.dispose();
            } else {
                super.paintComponent(g);
            }

        }

    }

}

2
使用setRolloverIcon(Icon)方法。还有禁用图标、按下图标等方法,请参阅文档。 - Andrew Thompson
1
可能是此问题的重复:如何在Java中更改鼠标进入和鼠标退出时按钮的图标图像 或者是 这个 或者是 这个 - Andrew Thompson
1个回答

6

使用以下标准方法即可:

Image image = ImageIO.read(new URL("http://i.imgur.com/bitgM6l.png")); Image imageHover = ImageIO.read(new URL("http://i.imgur.com/dt81BWk.png"));

您可以使用JButton API中实现的标准方法。

//button.setBorderPainted(false);
//button.setBorder(null);
//button.setFocusable(false);
//button.setMargin(new Insets(0, 0, 0, 0));
button.setContentAreaFilled(false);
button.setIcon(icon());
button.setRolloverIcon(iconA());
button.setPressedIcon(iconB());
button.setDisabledIcon(iconC());

JButton.getModel().addChangeListener()

    JButton.getModel().addChangeListener(new ChangeListener() {
        @Override
        public void stateChanged(ChangeEvent e) {
            ButtonModel model = (ButtonModel) e.getSource();
            if (model.isRollover()) {
                button.setIcon(icon());
            } else {
                button.setIcon(iconA());
            } etc ...//  if (model.isPressed()) {
         }
    });

我需要在X轴上重复背景。这可行吗? - Marius
将图标放入队列,不知道“背景在X轴上重复”的意思。 - mKorbel
我需要图标在我的按钮上重复/拉伸。我必须在应用之前编辑图标吗? - Marius
你在谈论如何使用JButton实现图标可调大小的功能,是的,这是可能的,没有问题。 - mKorbel
这种方法有点问题,因为当鼠标光标最初悬停在按钮上时,它不会应用悬停效果。我建议改用addMouseListener + mouseEntered() + mouseExited()。 - Brikowski
@Brikowski 做出了错误的决定,因为Mouse和KeyEvents是在JButton及其模型中实现的,并且它们被正确地实现了。 - mKorbel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接