Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法始终在单击并悬停时加载图片_Java_Image_Swing_Mouseevent_Jbutton - Fatal编程技术网

Java 无法始终在单击并悬停时加载图片

Java 无法始终在单击并悬停时加载图片,java,image,swing,mouseevent,jbutton,Java,Image,Swing,Mouseevent,Jbutton,我正在制作一个启动程序应用程序,我希望根据所采取的操作更改按钮,现在我想在以下操作发生时更改按钮,或者玩家悬停在图像上,单击图像,释放图像,单击或退出悬停。我的问题是它并不总是正确加载,这很奇怪 package LostStory; import java.awt.Graphics; import java.awt.Image; import java.awt.SystemTray; import java.awt.event.ActionEvent; import java.awt.even

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

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()时,它返回了一个“8”,所以如果成功加载,我希望它是“8”。(但事实并非如此,据我所知,它将始终返回8)


So TL;DR:如何确保始终加载图像图标并正确应用?

不要尝试使用setIcon()方法操纵图标

JButton具有为各种状态设置图标的方法
setRolloverIcon
setPressedIcon
,等等

请阅读API以了解其他属性

此外,绘画方法仅适用于绘画。切勿使用绘制方法创建零部件。从paintComponent()方法中去掉
init()
方法


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

1)应用程序资源在部署时将成为嵌入式资源,因此现在就开始访问它们是明智的。必须通过URL而不是文件访问。有关如何形成URL的信息,请参见。2) 一旦打开应用程序。如果有一个带有图像路径的URL,请使用
ImageIO
加载它。图像图标将异步加载图像,这似乎是这里的问题。3) 请看..@AndrewThompson woops,感谢您指出这一点!否则,我如何才能实现按下按钮?一旦我绘制了背景,随之而来的是按钮不会弹出(因为它会在绘制的图像后面)@pandaJuan,按钮不会出现,因为您正在扩展
JComponent
JComponent
不使用布局管理器,因此组件的大小为(0,0),因此无需绘制任何内容。将您的类更改为extend
JPanel
,然后您将使用默认的
FlowLayout
(如果您愿意,可以进行更改)。