不能总是在点击和悬停时加载图片

cannot always load the picture on click and hover

我正在制作启动器应用程序,我希望根据所采取的操作更改按钮,现在我想在以下操作发生时更改按钮,无论是玩家将鼠标悬停在图像上,还是点击图像, 释放图像点击或退出悬停。我遇到的问题是它并不总是正确加载,这很奇怪。

package LostStory;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.SystemTray;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.IOException;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;

@SuppressWarnings("serial")
public class LaunchPanel extends JComponent {

Image image;
JButton play;
SystemTray tray;

ImageIcon icon = new ImageIcon("res/images/buttons/playNonHover.png");
ImageIcon iconHover = new ImageIcon("res/images/buttons/playHover.png");
ImageIcon iconClick = new ImageIcon("res/images/buttons/playClick.png");

public LaunchPanel(Image img) {
    this.image = img;

}

@Override
protected void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.drawImage(image, 0, 0, this);
    init();

}

public void init() {
    play = new JButton("Play Lost Story", icon);

    play.setBounds(85, 210 - 75, getWidth() - 165, 50);

    play.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent arg0) {
            Runtime run = Runtime.getRuntime();
            try {
                run.exec("notepad");
                if (SystemTray.isSupported()) {
                    tray = SystemTray.getSystemTray();
                    play.setIcon(play.getIcon());
                    // Main.getClient().getJFrame().setVisible(false);
                    // tray.add(img);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    });

    play.addMouseListener(new MouseListener() {

        @Override
        public void mouseClicked(MouseEvent arg0) {
        } // no use

        @Override
        public void mouseEntered(MouseEvent e) {
            if (iconHover.getImageLoadStatus() == 8) {
                play.setIcon(iconHover);
                play.setIcon(play.getIcon());
                System.out.println("Entered");
            }
            System.out.println(iconHover.getImageLoadStatus());
        } // use

        @Override
        public void mouseExited(MouseEvent arg0) {
            if (icon.getImageLoadStatus() == 8) {
                play.setIcon(icon);
                play.setIcon(play.getIcon());
                System.out.println("Exited");
            }
            System.out.println(icon.getImageLoadStatus());
        } // use

        @Override
        public void mousePressed(MouseEvent arg0) {
            if (iconClick.getImageLoadStatus() == 8) {
                play.setIcon(iconClick);
                play.setIcon(play.getIcon());
                System.out.println("Pressed");
            }
            System.out.println(iconClick.getImageLoadStatus());

        } // use

        @Override
        public void mouseReleased(MouseEvent arg0) {
            if (icon.getImageLoadStatus() == 8) {
                play.setIcon(icon);
                play.setIcon(play.getIcon());
                System.out.println("Released");
            }
            System.out.println(icon.getImageLoadStatus());
        } // use

    });

    add(play);
}

}

第一个按钮始终加载(因为它是默认按钮),当我尝试使用 IconImage.getImageLoadStatus() 时它 return 显示为“8”,所以我希望它是“8”如果加载成功。 (但事实并非如此,据我所知,它总是 return 8)。

所以 TL;DR:我如何确保 ImageIcons 始终加载并正确应用?

不要尝试使用 setIcon() 方法来操作图标。

JButton 具有为各种状态 setRolloverIconsetPressedIcon 等设置图标的方法。

阅读 API 了解其他属性。

另外,一个画法是画法而已。切勿通过绘画方法创建组件。从 paintComponent() 方法中删除 init() 方法。

应该在面板的构造函数中创建组件并将其添加到面板中。