如何在中途停止Button ActionListener并等待用户再次单击它?

时间:2018-09-08 21:07:52

标签: java awt actionlistener

我真的需要解决此问题的方法,即使经过2个小时的搜索,仍未找到解决方案。我正在通过开发简单的应用程序来学习Java AWT。

我创建了一个注册页面/窗口/框架,当单击“注册”按钮时,仅当且仅当以下情况时,该页面/窗口/框架通过其各自的TextField获取用户名,密码和确认密码,并将其添加到数据库中这两个密码匹配。如果它们不匹配,则将清除密码文本字段,并且用户需要重新输入值,然后再次单击“注册”按钮。这需要循环进行。我已经在“注册”按钮的ActionListener中放入了所有需要的代码行,包括密码不相等的逻辑。

我正在发布代码中按钮的ActionListener部分。您会注意到明显的逻辑错误,例如,在使用setText("")清除了密码的TextField之后,由于两个都是空字符串,因此密码实际上是匹配的。但是,即使我只清除了两个TextField中的一个,一旦执行了ActionListener,我也无法在TextField中重新输入新值,并且应用程序会永久挂起,直到强制关闭。

signupButton.addActionListener(new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {               
        String username = "";
        String password = "";
        String confirmPass = "";

        do
        {
            username = usernameTF.getText();
            password = passwordTF.getText();
            confirmPass = confirmPassTF.getText();

            Label passErrorMsg = new Label("Passwords do not match. Enter again.");

            if(password.equals(confirmPass))
            {
                passErrorMsg.setVisible(false);
                break;
            }

            passErrorMsg.setBounds(70, 320, 205, 20);
            signupWindow.add(passErrorMsg);
            passErrorMsg.setVisible(true);

            passwordTF.setText(""); //If I comment this statement, the app hangs.
            //Else in the next iteration, the loop breaks since both the strings become empty

            confirmPassTF.setText("");

        }while(true);

       //Some more lines of code to work with the database
    }
});

2 个答案:

答案 0 :(得分:2)

您的while循环不属于线性控制台程序,因为它对于线性控制台程序而言是正常的,它将阻塞事件驱动程序中的Swing事件线程或任何其他事件线程,从而使程序冻结且无用。相反,您可能只想在输入错误的情况下清除对话框的文本字段,并在JOptionPane中显示错误消息。实际上,您可能需要的只是if / else块并且没有while循环:

同样的关键问题是,在创建事件驱动程序时,必须以非线性事件驱动方式进行思考。在这种情况下,线性控制台代码逻辑将不起作用。

其他问题:您不应使用字符串来保存密码,因为这些密码将被插入字符串池中,很容易被黑客入侵。同样,正如Camickr所言,请学习并遵循Java命名约定,包括以小写字母开头的变量和方法名称以及以大写字母开头的类名称。避免使用SignupButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { String Username = ""; String Password = ""; String ConfirmPass = ""; Username = UsernameTF.getText(); Password = PasswordTF.getText(); ConfirmPass = ConfirmPassTF.getText(); if(Password.equals(ConfirmPass)) { PassErrorMsg.setVisible(false); // do database stuff here } else { // here clear fields and show an error message // consider incrementing an error count as well } } }); setBounds(...)布局,因为它们会导致在所有平台上均无法正常工作的GUI。而是学习和使用布局管理器。

答案 1 :(得分:0)

如果仅应在单击按钮时触发一次函数/方法,则不应在迭代时进行迭代,上述代码可能最终陷入无限循环。