Java 第二次单击按钮时,图像不会更改
所以我这里有一个代码,就像游戏模拟人生,你可以改变你的模拟人生或人物的外观。所以我的问题是,一旦我在组合框上选择了一个选项,一旦我点击加载按钮,图像就会改变。但一旦我点击另一个选择,因为我想改变它,图像将不再改变。这是代码。我将提供我使用的照片的链接。下面是图片的下载链接:代码也是如此Java 第二次单击按钮时,图像不会更改,java,image,swing,user-interface,jframe,Java,Image,Swing,User Interface,Jframe,所以我这里有一个代码,就像游戏模拟人生,你可以改变你的模拟人生或人物的外观。所以我的问题是,一旦我在组合框上选择了一个选项,一旦我点击加载按钮,图像就会改变。但一旦我点击另一个选择,因为我想改变它,图像将不再改变。这是代码。我将提供我使用的照片的链接。下面是图片的下载链接:代码也是如此 import javax.swing.*; import java.awt.event.*; import java.awt.*; import javax.swing.JTextArea;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.JTextArea;
public class Sims extends JFrame {
private int x,y,z;
private Container game;
private JComboBox Head;
private JComboBox Ear;
private JLabel Avatar;
private JTextArea details;
private String []Hat = {"No Hat", "Captain Hat", "Black Leather Hat"};
private JButton load;
private String []Earrings = {"No Earrings", "Silver Dangling Earrings", "Gold Dangling Earrings"};
private ImageIcon [] Accessories =
{ new ImageIcon("blackleather.PNG"),//0
new ImageIcon("blackleather_goldear.PNG"),//1
new ImageIcon("blackleather_silverear.PNG"),//2
new ImageIcon("captainhat.PNG"),//3
new ImageIcon("captainhat_goldear.PNG"),//4
new ImageIcon("captainhat_silverear.PNG"),//5
new ImageIcon("goldear.PNG"),//6
new ImageIcon("noaccessories.PNG"),//7
new ImageIcon("silverear.PNG")};//8
public Sims() {
getContentPane().removeAll();
setTitle("Avatar!");
setSize(250,450);
setLocationRelativeTo(null);
game = getContentPane();
game.setLayout(new FlowLayout());
Head = new JComboBox(Hat);
Ear = new JComboBox(Earrings);
Avatar = new JLabel(Accessories[7]);
load = new JButton("Load Image");
details = new JTextArea("AVATAR DETAILS: "+"\n"+" Hat: "+Hat[Head.getSelectedIndex()]+"\n"+" Earrings: "+Earrings[Ear.getSelectedIndex()]);
game.add(Avatar);
game.add(Head);
game.add(Ear);
game.add(load);
game.add(details, BorderLayout.SOUTH);
setVisible(true);
details.setEditable(false);
Head.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
JComboBox temphead = (JComboBox) e.getSource();
int temphat = (int) temphead.getSelectedIndex();
x = temphat;
}
});
Ear.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
JComboBox tempear = (JComboBox) e.getSource();
int tempearrings = (int) tempear.getSelectedIndex();
y = tempearrings;
}
});
load.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
getContentPane().removeAll();
if(x==0&&y==0){
z = 7;
}
if(x==0&&y==1){
z = 8;
}
if(x==0&&y==2){
z = 6;
}
if(x==1&&y==0){
z = 3;
}
if(x==1&&y==1){
z = 5;
}
if(x==1&&y==2){
z = 4;
}
if(x==2&&y==0){
z = 0;
}
if(x==2&&y==1){
z = 2;
}
if(x==2&&y==2){
z = 1;
}
setTitle("Avatar");
setSize(250,450);
setLocationRelativeTo(null);
game = getContentPane();
game.setLayout(new FlowLayout());
Head = new JComboBox(Hat);
Ear = new JComboBox(Earrings);
Avatar = new JLabel(Accessories[z]);
load = new JButton("Load Image");
details = new JTextArea("AVATAR DETAILS: "+"\n"+" Hat: "+Hat[x]+"\n"+" Earrings: "+Earrings[y]);
game.add(Avatar);
game.add(Head);
game.add(Ear);
game.add(load);
game.add(details, BorderLayout.SOUTH);
setVisible(true);
details.setEditable(false);
}
});
}
public static void main(String[] args) {
Sims fs = new Sims();
fs.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
当按下JButton时,您正在加载全新的组件,因此新组件的响应将与旧组件的响应不同。不要那样做。相反,在ActionLIstener中,只需更改现有显示JLabel的图标即可 重申一下,JButton的ActionListener应该从JComboxes获取数据(无需提供组合框ActionListener),然后交换图标,就是这样。它不应该创建新组件 底线是JButton的ActionListener在半伪代码中应该是这样的:
@Override
public void actionPerformed(ActionEvent e) {
// get earrings selection from earrings combo box
// get hat selection from hat combo box
avatarLabel.setIcon(.... some value based on the selections abovbe ...);
}
我自己发现创建两个枚举(一个Hat枚举和一个earlings枚举)最简单,然后创建一个Head类来保存这两个枚举的值,重要的是重写对象的equals和hashCode方法,这样它就可以在HashMap中很好地工作。然后,我将每个头部对象与HashMap中的ImageIcon关联,并在ActionListener中使用此HashMap选择正确的图标。这对你来说有点过分了,我怀疑你能否把它用于你的任务,但不管怎样,它在这里:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.*;
public class ImageSwap extends JPanel {
private Map<Head, Icon> headIconMap = new HashMap<>();
private JComboBox<Earrings> earingCombo = new JComboBox<>(Earrings.values());
private JComboBox<Hat> hatCombo = new JComboBox<>(Hat.values());
private JButton loadButton = new JButton(new LoadAction("Load", KeyEvent.VK_L));
private JLabel avatarLabel = new JLabel();
public ImageSwap() throws IOException {
addToMap("blackleather.PNG", Earrings.NONE, Hat.BLACK_LEATHER);
addToMap("blackleather_goldear.PNG", Earrings.GOLD, Hat.BLACK_LEATHER);
addToMap("blackleather_silverear.PNG", Earrings.SILVER, Hat.BLACK_LEATHER);
addToMap("captainhat.PNG", Earrings.NONE, Hat.CAPTAIN);
addToMap("captainhat_goldear.PNG", Earrings.GOLD, Hat.CAPTAIN);
addToMap("captainhat_silverear.PNG", Earrings.SILVER, Hat.CAPTAIN);
addToMap("goldear.PNG", Earrings.GOLD, Hat.NONE);
addToMap("noaccessories.PNG", Earrings.NONE, Hat.NONE);
addToMap("silverear.PNG", Earrings.SILVER, Hat.NONE);
avatarLabel.setIcon(headIconMap.get(new Head(Earrings.NONE, Hat.NONE)));
JPanel buttonComboPanel = new JPanel(new GridLayout(0, 1, 0, 5));
buttonComboPanel.add(earingCombo);
buttonComboPanel.add(hatCombo);
buttonComboPanel.add(loadButton);
setLayout(new BorderLayout());
add(avatarLabel, BorderLayout.CENTER);
add(buttonComboPanel, BorderLayout.PAGE_END);
}
private void addToMap(String resourceText, Earrings earrings, Hat hat)
throws IOException {
BufferedImage img = ImageIO.read(getClass().getResource(resourceText));
Icon icon = new ImageIcon(img);
headIconMap.put(new Head(earrings, hat), icon);
}
private class LoadAction extends AbstractAction {
public LoadAction(String name, int mnemonic) {
super(name);
putValue(MNEMONIC_KEY, mnemonic);
}
@Override
public void actionPerformed(ActionEvent e) {
Earrings selectedEarrings = (Earrings) earingCombo.getSelectedItem();
Hat selectedHat = (Hat) hatCombo.getSelectedItem();
if (selectedEarrings != null && selectedHat != null) {
avatarLabel.setIcon(headIconMap.get(new Head(selectedEarrings, selectedHat)));
}
}
}
private static void createAndShowGui() {
ImageSwap mainPanel;
try {
mainPanel = new ImageSwap();
JFrame frame = new JFrame("ImageSwap");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class Head {
Earrings earrings;
Hat hat;
public Head(Earrings earrings, Hat hat) {
this.earrings = earrings;
this.hat = hat;
}
public Earrings getEarrings() {
return earrings;
}
public Hat getHat() {
return hat;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((earrings == null) ? 0 : earrings.hashCode());
result = prime * result + ((hat == null) ? 0 : hat.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Head other = (Head) obj;
if (earrings != other.earrings)
return false;
if (hat != other.hat)
return false;
return true;
}
}
enum Earrings {
NONE("No Earrings"), SILVER("Silver Dangling Earrings"), GOLD(
"Gold Dangling Earrings");
private String text;
private Earrings(String text) {
this.text = text;
}
@Override
public String toString() {
return text;
}
}
enum Hat {
NONE("No Hat"), CAPTAIN("Captain Hat"), BLACK_LEATHER("Black Leather Hat");
private String text;
private Hat(String text) {
this.text = text;
}
@Override
public String toString() {
return text;
}
}
导入java.awt.BorderLayout;
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.awt.event.KeyEvent;
导入java.awt.image.buffereImage;
导入java.io.IOException;
导入java.util.HashMap;
导入java.util.Map;
导入javax.imageio.imageio;
导入javax.swing.*;
公共类ImageSwap扩展了JPanel{
私有映射headIconMap=newhashmap();
private JComboBox earingCombo=newjcombobox(arrings.values());
private JComboBox hatCombo=新的JComboBox(Hat.values());
私有jbuttonloadbutton=newjbutton(newloadAction(“Load”,KeyEvent.VK_L));
私有JLabel avatarLabel=新JLabel();
公共ImageSwap()引发IOException{
addToMap(“blackleather.PNG”,耳环.NONE,帽子.BLACK_LEATHER);
addToMap(“blackleather\u goldear.PNG”,耳环.GOLD,帽子.BLACK\u LEATHER);
addToMap(“blackleather\u silverear.PNG”,耳环.SILVER,帽子.BLACK\u LEATHER);
addToMap(“captainhat.PNG”,earlings.NONE,Hat.CAPTAIN);
addToMap(“captainhat_goldear.PNG”,earlings.GOLD,Hat.CAPTAIN);
addToMap(“captainhat_silverear.PNG”,耳环.SILVER,帽子.CAPTAIN);
addToMap(“goldear.PNG”,earlings.GOLD,Hat.NONE);
addToMap(“noacccessories.PNG”,earlings.NONE,Hat.NONE);
addToMap(“silverear.PNG”,耳环.SILVER,帽子.NONE);
avatarLabel.setIcon(headIconMap.get)(新头(earlings.NONE,Hat.NONE));
JPanel buttonComboPanel=新的JPanel(新的网格布局(0,1,0,5));
按钮ComboPanel.add(earingCombo);
按钮ComboPanel.add(hatCombo);
buttonComboPanel.add(加载按钮);
setLayout(新的BorderLayout());
添加(虚拟标签,BorderLayout.CENTER);
添加(按钮图标面板,边框布局。第页\u末);
}
private void addToMap(字符串资源文本、耳环、耳环、帽子)
抛出IOException{
BuffereImage img=ImageIO.read(getClass().getResource(resourceText));
图标图标=新图像图标(img);
headIconMap.put(新头(耳环、帽子)、图标);
}
私有类LoadAction扩展了AbstractAction{
公共加载操作(字符串名称,int助记符){
超级(姓名);
putValue(助记符键,助记符);
}
@凌驾
已执行的公共无效操作(操作事件e){
耳环SelectedArrings=(耳环)earingCombo.getSelectedItem();
Hat selectedHat=(Hat)hatCombo.getSelectedItem();
if(selectedarrings!=null&&selectedHat!=null){
avatarLabel.setIcon(headIconMap.get)(新头(selectedarrings,selectedHat));
}
}
}
私有静态void createAndShowGui(){
图像交换主面板;
试一试{
mainPanel=新图像交换();
JFrame=新JFrame(“图像交换”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}捕获(IOE异常){
e、 printStackTrace();
}
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}
班长{
耳环;
帽子;
公众头(耳环、耳环、帽子){
这个。耳环=耳环;
this.hat=帽子;
}
公共耳环{
返回耳环;
}
公共帽子{
返回帽;
}
@凌驾
公共int hashCode(){
最终整数素数=31;
int结果=1;
result=prime*result+((arrings==null)?0:arrings.hashCode();
result=prime*result+((hat==null)?0:hat.hashCode();
返回结果;
}
@凌驾
公共布尔等于(对象obj){
if(this==obj)
返回true;
if(obj==null)
返回false;
如果(getClass()!=obj.getClass())
返回false;
头部其他=(头部)obj;
如果(耳环!=其他耳环)
返回false;
if(hat!=其他.hat)
返回false;
返回true;
}
}
枚举耳环{
无(“无耳环”)、银(“银垂耳环”)、金(
“金耳环”);
私有字符串文本;
私人耳环(字符串文本){
this.text=文本;
}
@凌驾
公共字符串toString(){
返回文本