Java 按下按钮时的第二个图像图像不变
我有一组按钮,当按下时,一些按钮被禁用。按钮有各自的图标。然而,困扰我的是,当我点击btnAdd时,按钮被禁用,btnAdd的图像没有改变。我使用的是Java Netbeans 8.0.2,并且连接到MySql 我在问,当actionperform发生时,如何让btnAdd处理第二个映像 这是密码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);
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图标才会更改,对吗?同样,我在您发布的代码中没有看到对此方法的显式调用。好的,我将重新编写代码。我要求你有点耐心。我会回来的