Java 按下按钮时的第二个图像图像不变

Java 按下按钮时的第二个图像图像不变,java,swing,Java,Swing,我有一组按钮,当按下时,一些按钮被禁用。按钮有各自的图标。然而,困扰我的是,当我点击btnAdd时,按钮被禁用,btnAdd的图像没有改变。我使用的是Java Netbeans 8.0.2,并且连接到MySql 我在问,当actionperform发生时,如何让btnAdd处理第二个映像 这是密码 if(btnAdd.getText().equals("Add")){ btnAdd.setText("Save"); btnDelete.setEnabled(true);

我有一组按钮,当按下时,一些按钮被禁用。按钮有各自的图标。然而,困扰我的是,当我点击btnAdd时,按钮被禁用,btnAdd的图像没有改变。我使用的是Java Netbeans 8.0.2,并且连接到MySql

我在问,当actionperform发生时,如何让btnAdd处理第二个映像

这是密码

if(btnAdd.getText().equals("Add")){
btnAdd.setText("Save");
        btnDelete.setEnabled(true);
            btnEdit.setEnabled(false);
                btnExit.setEnabled(false);
                    btnSwitch.setEnabled(false);
                        btnCancel.setEnabled(true);
}else{
    btnAdd.setText("Add");
            btnAdd.setEnabled(true); 
                btnEdit.setEnabled(true);
                    btnDelete.setEnabled(true); 
                        btnSwitch.setEnabled(true);
                            btnCancel.setEnabled(false);
                                btnExit.setEnabled(true);
}

我在问,当actionperform发生时,我将如何使btnAdd处理第二个映像

在这种情况下,解决方案是根据我的注释——在要更改其图像的JButton上调用
setIcon(newImageIcon)
。如果按钮使用动作,还可以通过
putValue(大图标键,新图像图标)
更改动作的
大图标键
属性

例如:

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.util.HashMap;
import java.util.Map;
import javax.swing.*;

public class MultipleButtons extends JPanel {
   private static final long serialVersionUID = 1L;
   private JButton btnSaveAdd = new JButton();
   private JButton btnDelete = new JButton("Delete");
   private JButton btnEdit = new JButton("Edit");
   private JButton btnExit = new JButton("Exit");
   private JButton btnSwitch = new JButton("Switch");
   private JButton btnCancel = new JButton("Cancel");
   private JButton[] btns = {btnSaveAdd, btnDelete, btnEdit, btnExit, btnSwitch, btnCancel};

   public MultipleButtons() {
      Icon saveIcon = UIManager.getIcon("FileView.floppyDriveIcon");

      // wouldn't really use this icon but just used as an example
      Icon addIcon = UIManager.getIcon("OptionPane.warningIcon");

      SaveAction saveAction = new SaveAction("Save", saveIcon);
      AddAction addAction = new AddAction("Add", addIcon);

      saveAction.setNextAction(addAction);
      addAction.setNextAction(saveAction);

      saveAction.buttonMapPut(btnDelete, true);
      saveAction.buttonMapPut(btnEdit, true);
      saveAction.buttonMapPut(btnExit, true);
      saveAction.buttonMapPut(btnSwitch, true);
      saveAction.buttonMapPut(btnCancel, false);

      addAction.buttonMapPut(btnDelete, true);
      addAction.buttonMapPut(btnEdit, false);
      addAction.buttonMapPut(btnExit, false);
      addAction.buttonMapPut(btnSwitch, false);
      addAction.buttonMapPut(btnCancel, true);

      btnSaveAdd.setAction(addAction);

      setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
      setLayout(new GridLayout(1, 0, 5, 5));
      for (JButton jButton : btns) {
         add(jButton);
      }
   }

   private static void createAndShowGui() {
      MultipleButtons mainPanel = new MultipleButtons();

      JFrame frame = new JFrame("MultipleButtons");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

// parent class for both SaveAction and AddAction
abstract class SaveAddAction extends AbstractAction {
   private static final long serialVersionUID = 1L;
   private Map<AbstractButton, Boolean> buttonMap = new HashMap<>(); 
   private Action nextAction; // swap to this Action

   public SaveAddAction(String name, Icon icon) {
      super(name, icon);
      int mnemonic = (int) name.charAt(0);
      putValue(MNEMONIC_KEY, mnemonic);
   }

   public void buttonMapPut(AbstractButton key, Boolean value) {
      buttonMap.put(key, value);
   }

   public void setNextAction(Action nextAction) {
      this.nextAction = nextAction;
   }

   public void setButtonsEnabled(ActionEvent e) {
      AbstractButton source = (AbstractButton) e.getSource();
      if (nextAction != null) {
         source.setAction(nextAction);
      }
      for (AbstractButton button : buttonMap.keySet()) {
         button.setEnabled(buttonMap.get(button));
      }
   }
}

class AddAction extends SaveAddAction {
   private static final long serialVersionUID = 1L;

   public AddAction(String name, Icon icon) {
      super(name, icon);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      setButtonsEnabled(e);
      // TODO: code for adding goes here
   }

}

class SaveAction extends SaveAddAction {
   private static final long serialVersionUID = 1L;

   public SaveAction(String name, Icon icon) {
      super(name, icon);
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      setButtonsEnabled(e);
      // TODO: code for saving goes here
   }

}
导入java.awt.GridLayout;
导入java.awt.event.ActionEvent;
导入java.util.HashMap;
导入java.util.Map;
导入javax.swing.*;
公共类多按钮扩展了JPanel{
私有静态最终长serialVersionUID=1L;
私有JButton btnSaveAdd=新JButton();
私有JButton btnDelete=新JButton(“删除”);
私有JButton btnEdit=新JButton(“编辑”);
私有JButton btnExit=新JButton(“退出”);
专用JButton btnSwitch=新JButton(“开关”);
私有JButton btnCancel=新JButton(“取消”);
私有JButton[]btns={btnSaveAdd,btnDelete,btnEdit,btnExit,btnSwitch,btnCancel};
公共多按钮(){
Icon saveIcon=UIManager.getIcon(“FileView.floppyDriveIcon”);
//不会真的使用这个图标,只是作为一个例子
Icon addIcon=UIManager.getIcon(“OptionPane.warningIcon”);
SaveAction SaveAction=新的SaveAction(“保存”,saveIcon);
AddAction AddAction=新的AddAction(“添加”,addIcon);
saveAction.setNextAction(addAction);
addAction.setNextAction(saveAction);
saveAction.buttonMapPut(btnDelete,true);
saveAction.buttonMapPut(btnEdit,true);
saveAction.buttonMapPut(btnExit,true);
saveAction.buttonMapPut(btnSwitch,true);
saveAction.buttonMapPut(btnCancel,false);
addAction.buttonMapPut(btnDelete,true);
addAction.buttonMapPut(btnEdit,false);
addAction.buttonMapPut(btnExit,false);
addAction.buttonMapPut(btnSwitch,false);
addAction.buttonMapPut(btnCancel,true);
btnSaveAdd.setAction(addAction);
setBorder(BorderFactory.createEmptyByOrder(5,5,5,5));
setLayout(新的GridLayout(1,0,5,5));
用于(JButton JButton:btns){
添加(jButton);
}
}
私有静态void createAndShowGui(){
MultipleButtons主面板=新的MultipleButtons();
JFrame=新JFrame(“多个按钮”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}
//SaveAction和AddAction的父类
抽象类SaveAddAction扩展了AbstractAction{
私有静态最终长serialVersionUID=1L;
私有映射按钮Map=newhashmap();
私有操作nextAction;//交换到此操作
公共SaveAddAction(字符串名称、图标){
超级(名称、图标);
int助记符=(int)name.charAt(0);
putValue(助记符键,助记符);
}
公共void按钮应用(AbstractButton键,布尔值){
按钮映射放置(键、值);
}
公共无效设置下一步(操作下一步){
this.nextAction=nextAction;
}
已启用公共无效设置按钮(ActionEvent e){
AbstractButton源=(AbstractButton)e.getSource();
如果(nextAction!=null){
source.setAction(nextAction);
}
对于(AbstractButton:buttonMap.keySet()){
button.setEnabled(buttonMap.get(button));
}
}
}
类AddAction扩展了SaveAddAction{
私有静态最终长serialVersionUID=1L;
公共AddAction(字符串名称、图标){
超级(名称、图标);
}
@凌驾
已执行的公共无效操作(操作事件e){
设置按钮启用(e);
//TODO:用于添加的代码位于此处
}
}
类SaveAction扩展了SaveAddAction{
私有静态最终长serialVersionUID=1L;
公共保存操作(字符串名称、图标){
超级(名称、图标);
}
@凌驾
已执行的公共无效操作(操作事件e){
设置按钮启用(e);
//TODO:保存代码在这里
}
}

为了更好的帮助,请考虑创建和发布一个。我们不想看到你的整个程序,但你应该把你的代码压缩成最小的代码,它仍然可以编译,没有与你的问题无关的额外代码,但仍然可以演示你的问题。还有,为什么图像要改变?我在任何地方都看不到对
setIcon(…)
的调用。对于更改映像,我的顾问希望看到我系统中的CRUD。按钮用于CRUD操作。这是我的案例研究中的一个要求。您的代码不会为我们编译或运行,因此它不允许我们看到您的错误可能在哪里。请重读这本书。关于上面的CRUD语句,您知道只有在您调用JButton上的
setIcon(…)
并传入新图标时JButton图标才会更改,对吗?同样,我在您发布的代码中没有看到对此方法的显式调用。好的,我将重新编写代码。我要求你有点耐心。我会回来的