我在创建GUI时遇到了问题。我想创建一个允许用户通过按钮输入密码的程序,在GUI关闭之前需要3次机会。我尝试过几种不同的方法但却无法完全发挥作用。
JTextField1是显示指令的地方。 JTextField2是输入密码的位置(正确的密码应为1234)
第三次输入错误密码后,我希望它关闭。
我认为问题是它使用相同的密码3次并会自动结束,但我不确定如何修复或循环正确,因为我对java和gui的新手。
这是我到目前为止所做的:
final String PASSWORD = "1234";
int attempts = 3;
String password = "";
while (attempts-- > 0 && !PASSWORD.equals(password))
{
jTextField1.setText("Enter your password");
password = jTextField2.getText();
if (password.equals(PASSWORD))
jTextField1.setText("Welcome ");
else
jTextField1.setText("Incorrect Pin, please try again");
}
答案 0 :(得分:2)
考虑以下两行:
jTextField1.setText("Enter your password");
password = jTextField2.getText();
第二行在第一行之后立即执行 。这里没有代码等待用户输入任何内容。
图形用户界面是基于事件的。程序必须根据用户行为响应事件。单个顺序函数无法处理GUI交互。
通过将事件侦听器添加到能够生成某些类型事件的对象来响应Java中的事件。当用户在具有焦点时按Enter键时,JTextField将触发操作事件。 JButtons在激活时触发一个动作事件(用户在其中按下鼠标并释放它,或者用户在有焦点时按空格键)。
您只想添加一次ActionListener,通常是在创建要添加它的组件之后。由于ActionListener是一个单独的方法,因此您需要在实例字段中跟踪attempts
:
private static final String PASSWORD = "1234";
private int attempts = 3;
// ...
private void buildWindow() {
// ...
jTextField2 = new JTextField(20);
jTextField2.addActionListener(e -> checkPassword());
// ...
}
private void checkPassword() {
if (password.equals(PASSWORD)) {
jTextField1.setText("Welcome ");
} else if (--attempts > 0) {
jTextField1.setText("Incorrect Pin, please try again");
} else {
System.exit(0);
}
}