我需要开发一个带有GUI的Java应用程序,它代表一台ATM机器。为此,我必须从“键盘”(9个按钮)中读取帐号和PIN。我必须读取按下的每个按钮的每个动作(动作监听器返回按钮的值),并将其数字连接到一个字符串,当按下“ok”按钮时,它应该返回int(Integer.parseInt()
)。我的问题是如何“等待\停止\冻结”我的程序,直到引入数字并按下“确定”?
如果这个问题有点令人困惑,我很抱歉
感谢您的帮助;)
P.S我为ATM机的每个部分都有一个班级。 EG:键盘,屏幕,ATM等等。P.S.S如果您希望看到一些代码,请告诉;)
答案 0 :(得分:6)
包含键盘组件的组件" OK"按钮,应将自己注册为ActionListener
所有人。要区分源组件,请使用getSource()
的{{1}}方法。一旦您确定了哪个组件生成了该事件,请将该号码添加到该组,或验证输入的PIN。
以下代码段尝试验证输入的PIN码的长度:
示例 -
EventObject
a)PIN长度无效
b)有效的PIN长度
答案 1 :(得分:3)
JFrame
。ActionListener
课程。在构造函数中,如果单击按钮,则放置按钮ActionListener将添加的文本。ActionListener
添加到每个。对于JButton
1,使ActionListener添加“1”。对于JButton
2,请将其添加为“2”。等..... Integer.parseInt()
pinString并使用真实的PIN检查已解析的值,并在匹配或不匹配时执行您想要执行的任何操作。答案 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
,则用户取消了对话框。