如何在另一个事件中为一个按钮创建多个动作?

时间:2013-12-05 18:53:38

标签: java swing events

我想通过带有子菜单的菜单运行,但是当我使用这种级联样式进行子菜单时,“输入”上的操作仅执行序列中的第一个操作,而不执行其余操作。任何帮助表示赞赏。

 open.addActionListener(new ActionListener(){
         String text;
      double amt;
      String bal;
     double ir;
    String name;
       String acbal;

        public void actionPerformed(ActionEvent e) { 
            screen.setText("Press s for savings or c for checking");

            save.addActionListener(new ActionListener(){


                public void actionPerformed(ActionEvent arg0) {
                    screen.setText("Enter name");
                    //get name
                     enter.addActionListener(new ActionListener(){



                            //balance
                            public void actionPerformed(ActionEvent e) {
                            text= entering.getText();   
                            name=text;
                                entering.setText(null);
                                screen.setText("enter account balance");
                                //bal
                                enter.addActionListener(new ActionListener(){


                                    public void actionPerformed(ActionEvent e) {
                                     bal=entering.getText();
                                         amt = Double.parseDouble(bal); 
                                         entering.setText(null);


                                         //interest
                                         screen.setText("enter interest rate");
                                         enter.addActionListener(new ActionListener(){


                                            public void actionPerformed(
                                                    ActionEvent e) {
                                                bal=entering.getText();
                                                ir=Double.parseDouble(bal);
                                                entering.setText(null);
                                                screen.setText("enter account number");

                                                enter.addActionListener(new ActionListener(){


                                                    public void actionPerformed(
                                                            ActionEvent e) {
                                                        text=entering.getText();
                                                        acbal=text;
                                                        entering.setText(null);
                                                        screen.setText("Commands : O- Open Account\n"+
                                                                   "           D- Deposit\n"+
                                                                   "           W- Withdraw\n"+
                                                                   "           I- Pay Interest\n"+
                                                                   "           T- Transaction");
                                                    }

                                                });
                                            }


                                         });
                                    }

                                });

                            }

                        });
                     //


                    SavingAccount sav = new SavingAccount(name,acbal,amt,ir);
                    banker.add(sav);
                }

            });//open account action

        } 

    });

1 个答案:

答案 0 :(得分:0)

我在这里猜测是因为写这篇文章的时候,你的问题非常不完整,但是说了之后,看起来你想要一个可以从用户那里得到输入的组件集合,但是你希望得到的具体输入是改变,取决于程序的“状态”。因此,例如,当此代码启动时,您希望此组件集合获取名称,然后在完成后,您希望它获得帐户余额,依此类推。

如果是这种情况,那么考虑为为此目的明确创建JPanel的类编写代码,并通过更改提示和执行不同的操作来响应程序的 state 中的更改输入输入。

例如,让我们将您的问题简化为我们希望用户输入姓名,地址和城市信息的问题。所以让我们创建一个枚举来封装这些状态:

enum InputState {
   NAME("Name"), ADDRESS("Address"), CITY("City"), DONE("Done");

   private String text;

   private InputState(String text) {
      this.text = text;
   }
   public String getText() {
      return text;
   }
}

然后我们可以创建一个包含感兴趣组件的JPanel,并且可以根据需要更改提示和JButton Actions:

class GetInputPanel extends JPanel {
   // almost arbitrary numbers below. 
   // you'll want to change this
   private static final int PREF_W = 500; 
   private static final int PREF_H = 40;
   private JLabel promptLabel = new JLabel();
   private JTextField inputField = new JTextField(10);
   private JButton doActionButton = new JButton();

   public GetInputPanel() {
      add(promptLabel);
      add(inputField);
      add(doActionButton);
   }

   // the most important method
   // allow outside objects the ability to change
   // our JButton and JTextField's Action
   public void setAction(Action action) {
      inputField.setAction(action);
      doActionButton.setAction(action);
      // note that setting a JButton's Action
      // will change its text and the action it 
      // performs on being pressed
   }

   // allow outside objects the ability to change
   // our promptLabel's text
   public void setPrompt(String prompt) {
      promptLabel.setText(prompt);
   }

   public String getInputText() {
      return inputField.getText();
   }

   public void clearInputText() {
      inputField.setText("");
   }

   @Override
   public Dimension getPreferredSize() {
      return new Dimension(PREF_W, PREF_H);
   }

   @Override
   public void setEnabled(boolean enabled) {
      super.setEnabled(enabled);
      inputField.setEnabled(enabled);
      doActionButton.setEnabled(enabled);
   }
}

然后我们可以创建自己的Action,根据其状态改变它的作用。它当然有一个State字段state,每次按下JButton时都会改变它(或者在JTextField中按下enter键):

class GetDataAction extends AbstractAction {

   private GetInputPanel inputPanel;
   private Data data;
   private InputState state = InputState.NAME;

   public GetDataAction(GetInputPanel inputPanel, Data data) {
      super("Get Name");
      this.inputPanel = inputPanel;
      this.data = data;
   }

   @Override
   public void actionPerformed(ActionEvent evt) {
      if (state == InputState.NAME) {
         data.setName(inputPanel.getInputText());
         state = InputState.ADDRESS;
      } else if (state == InputState.ADDRESS) {
         data.setAddress(inputPanel.getInputText());
         state = InputState.CITY;
      } else if (state == InputState.CITY) {
         data.setCity(inputPanel.getInputText());
         state = InputState.DONE;
         System.out.println("Data: " + data);
         putValue(NAME, "");
         inputPanel.setPrompt("");

         inputPanel.setEnabled(false);
      } 

      if (state != InputState.DONE) {
         putValue(NAME, "Get " + state.getText());
         inputPanel.setPrompt("Please Enter Your " + state.getText());
      }
      inputPanel.clearInputText();
   }
}

一个Data类,用于保存我们正在根据用户输入更改的数据:

class Data {
   private String name;
   private String address;
   private String city;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getAddress() {
      return address;
   }

   public void setAddress(String address) {
      this.address = address;
   }

   public String getCity() {
      return city;
   }

   public void setCity(String city) {
      this.city = city;
   }

   @Override
   public String toString() {
      return "Data [name=" + name + ", address=" + address + ", city=" + city
            + "]";
   }

}

然后是一个GUI类,将它们放在一起并显示所有内容:

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import javax.swing.*;

public class GetSuccessiveInputs {
   private static void createAndShowGui() {
      Data data = new Data();

      GetInputPanel inputPanel = new GetInputPanel();
      inputPanel.setPrompt("Please enter your name:");
      inputPanel.setAction(new GetDataAction(inputPanel, data));

      JFrame frame = new JFrame("GetSuccessiveInputs");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(inputPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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