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_User Interface_Jframe - Fatal编程技术网

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(){
返回文本