Java多按钮动作

时间:2011-12-27 23:33:49

标签: java swing user-interface jbutton

我需要开发一个带有GUI的Java应用程序,它代表一台ATM机器。为此,我必须从“键盘”(9个按钮)中读取帐号和PIN。我必须读取按下的每个按钮的每个动作(动作监听器返回按钮的值),并将其数字连接到一个字符串,当按下“ok”按钮时,它应该返回int(Integer.parseInt())。我的问题是如何“等待\停止\冻结”我的程序,直到引入数字并按下“确定”?

如果这个问题有点令人困惑,我很抱歉

感谢您的帮助;)

P.S我为ATM机的每个部分都有一个班级。 EG:键盘,屏幕,ATM等等。

P.S.S如果您希望看到一些代码,请告诉;)

5 个答案:

答案 0 :(得分:6)

包含键盘组件的组件" OK"按钮,应将自己注册为ActionListener所有人。要区分源组件,请使用getSource()的{​​{1}}方法。一旦您确定了哪个组件生成了该事件,请将该号码添加到该组,或验证输入的PIN。


以下代码段尝试验证输入的PIN码的长度:

示例 -

EventObject

enter image description here

a)PIN长度无效

enter image description here

b)有效的PIN长度

enter image description here

答案 1 :(得分:3)

  1. 制作JFrame
  2. 创建一个名为pinString的实例变量。将其初始化为“”。
  3. 制作'JPanel'。
  4. 为您的按钮定义ActionListener课程。在构造函数中,如果单击按钮,则放置按钮ActionListener将添加的文本。
  5. 制作9个按钮。将ActionListener添加到每个。对于JButton 1,使ActionListener添加“1”。对于JButton 2,请将其添加为“2”。等.....
  6. 将按钮添加到JPanel。
  7. 制作另一个JButton,OK按钮。
  8. 让它的动作侦听器Integer.parseInt() pinString并使用真实的PIN检查已解析的值,并在匹配或不匹配时执行您想要执行的任何操作。
  9. 将按钮添加到面板。
  10. 将Frame的内容窗格设置为面板。
  11. 显示/打包框架。它应该工作。

答案 2 :(得分:2)

您不想“冻结”您的程序。相反,您希望对其进行编码,以便响应按下“确定”按钮的侦听器仅在先前按下数字按钮时才执行其操作。这将要求您为类提供一个变量,该变量保存最后一个xxx按钮的结果(数组或列表可以用于此或甚至是简单的String),然后在ok按钮的监听器中,有一个if块检查这个变量,如果确定,就会发挥其魔力。

例如,您可以使用名为pinInput的String并使其为“”或空字符串(或者更好的是StringBuilder - 但这对于您的简单程序来说并不是完全必要的)。在每个数字按钮侦听器中,您将表示按下的数字的String连接到pinInput字符串。在OK按钮的监听器中,检查pinInput的长度是否超过所需的最小字符长度,如果是,请从字符串中取出最后x个字符并测试它们是否与PIN匹配。

修改
你说:

  

ATM类将是程序的“主要”,它将调用类Keypad的方法readInt()。它应该在这里,我得到用户介绍的号码。

如果需要,您可以允许主类将侦听器添加到任何其他类,以便在按下按钮时通知它。

无论你如何看待这个,你都需要使用监听器,以便你的程序响应事件(“事件驱动”)。这就是Java Swing GUI的工作方式。

编辑2
例如,这里的代码中JFrame包含一个JPanel,其上有JButtons,而JFrame只响应JPanel上的按钮按特定顺序推送 - A,然后B,然后OK:

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class AnExample {
   private static void createAndShowGui() {
      AnExample mainPanel = new AnExample();

      JFrame frame = new AnExMain();
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

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

class AnExMain extends JFrame {
   private JTextField field = new JTextField(
         "Press A, then B, then OK, in that order", 20);
   private Control control = new Control(this);

   public AnExMain() {
      add(field, BorderLayout.PAGE_START);
      add(new InnerPanel(control), BorderLayout.CENTER);
   }

   public void fieldSetText(String text) {
      field.setText(text);
   }
}

class Control {
   private AnExMain anExMain;
   private String data = "";

   public Control(AnExMain anExMain) {
      this.anExMain = anExMain;
   }

   public void btnPressed(String actionCommand) {
      anExMain.fieldSetText("");
      if (actionCommand.equals("OK")) {
         if (data.equals("AB")) {
            anExMain.fieldSetText("Buttons pressed in proper order!");
         }
         data = "";
      } else {
         data += actionCommand;
         if (data.length() > 2) {
            data = data.substring(data.length() - 2);
         }
      }      
   }

}

class InnerPanel extends JPanel {

   public InnerPanel(final Control control) {
      JButton btnA = new JButton("A");
      JButton btnB = new JButton("B");
      JButton btnOK = new JButton("OK");

      add(btnA);
      add(btnB);
      add(btnOK);

      ActionListener listener = new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            control.btnPressed(e.getActionCommand());
         }
      };
      btnA.addActionListener(listener);
      btnB.addActionListener(listener);
      btnOK.addActionListener(listener);
   }
}

答案 3 :(得分:2)

查看其他代码会有所帮助; java计算器教程很多。原则上,您可以禁用“确定”按钮(setEnabled(false)),并将4个键添加到全局字符串:setEnabled(pinCode.length() == 4)

答案 4 :(得分:2)

也许你喜欢模态对话。 E.G。

String pinString = JOptionPane.showInputDialog(parent, "PIN");

这将“冻结”主GUI,直到被解雇。

检查返回值。如果是null,则用户取消了对话框。