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),因此无需绘制任何内容。将您的类更改为extendJPanel
,然后您将使用默认的FlowLayout
(如果您愿意,可以进行更改)。