Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何中途停止按钮ActionListener并等待用户再次单击它?_Java_Awt_Actionlistener - Fatal编程技术网

Java 如何中途停止按钮ActionListener并等待用户再次单击它?

Java 如何中途停止按钮ActionListener并等待用户再次单击它?,java,awt,actionlistener,Java,Awt,Actionlistener,我真的需要一个解决这个问题的办法,甚至在搜索了2个小时之后,我还没有找到一个解决办法。我通过开发简单的应用程序来学习JavaAWT 我已经创建了一个注册页面/窗口/框架,当点击“注册”按钮时,当且仅当两个密码匹配时,该页面/窗口/框架通过各自的文本字段接受用户名、密码和确认密码,并将其添加到数据库中。如果不匹配,则清除密码文本字段,用户需要重新输入值并再次单击“注册”按钮。这需要循环进行。我已经在“注册”按钮的ActionListener中放置了所有需要的代码行,包括密码不相等逻辑 我正在发布按

我真的需要一个解决这个问题的办法,甚至在搜索了2个小时之后,我还没有找到一个解决办法。我通过开发简单的应用程序来学习JavaAWT

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

我正在发布按钮的ActionListener部分代码。您会注意到明显的逻辑错误,例如,在使用
setText(“”
)清除密码的文本字段后,密码实际上是匹配的,因为两者都是空字符串。但是,即使我只清除两个文本字段中的一个,一旦ActionListener被执行,我也无法在文本字段中重新输入新值,应用程序将永远挂起,直到强制关闭

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
    }
});

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

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
        }
    }
});
同样,关键问题是,在创建事件驱动的程序时,必须以非线性事件驱动的方式进行思考。线性控制台代码逻辑将不起作用(在这些情况下)


其他问题:您不应该使用字符串来保存密码,因为这些密码将被插入字符串池中,很容易被黑客攻击。此外,正如Camickr所说,是的,学习并遵循Java命名约定,包括用小写字母开始变量和方法名,用大写字母开始类名。避免使用
setBounds(…)
null
布局,因为这会导致GUI不能在所有平台上正常工作。相反,请学习并使用布局管理器。

您的while循环不属于此循环,因为对于线性控制台程序来说,它可以阻止Swing事件线程或事件驱动程序中的任何其他事件线程,从而使程序冻结且无用。相反,如果输入错误,您可能只想清除对话框的文本字段,并在JOptionPane中显示错误消息。事实上,您可能只需要if/else块和no while循环:

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
        }
    }
});
同样,关键问题是,在创建事件驱动的程序时,必须以非线性事件驱动的方式进行思考。线性控制台代码逻辑将不起作用(在这些情况下)


其他问题:您不应该使用字符串来保存密码,因为这些密码将被插入字符串池中,很容易被黑客攻击。此外,正如Camickr所说,是的,学习并遵循Java命名约定,包括用小写字母开始变量和方法名,用大写字母开始类名。避免使用
setBounds(…)
null
布局,因为这会导致GUI不能在所有平台上正常工作。相反,学习和使用布局管理器。

如果函数/方法只在单击按钮时触发一次,则不应在迭代时执行。如果函数/方法只在单击按钮时触发一次,则上述代码可能会以无限循环结束。

如果函数/方法只在单击按钮时触发一次,则不应在迭代时执行,上面的代码可能以无限循环结束。

首先,变量名不应以大写字符开头。遵循Java约定,以便我们可以阅读您的代码。不需要循环。然后使用时,单击按钮验证数据。如果有效,请继续。如果没有,请清除数据并等待他们重新输入数据,然后再次单击按钮<代码>我通过开发简单的应用程序来学习Java AWT。不确定为什么要从AWT开始。你至少应该使用Swing(即使它已经过时了)。除了使用“JLabel”和“JTextField”等外,基本相同。请阅读Swing基础知识。@camickr我想我已经理解了。我试试看。谢谢。@camickr我正在学习AWT和Swing。我必须这么做。我想你没抓住重点。Swing构建在AWT之上,因此Swing使用了很多AWT类。但在构建GUI时,应该使用Swing组件。首先,变量名不应以大写字符开头。遵循Java约定,以便我们可以阅读您的代码。不需要循环。然后使用时,单击按钮验证数据。如果有效,请继续。如果没有,请清除数据并等待他们重新输入数据,然后再次单击按钮<代码>我通过开发简单的应用程序来学习Java AWT。不确定为什么要从AWT开始。你至少应该使用Swing(即使它已经过时了)。除了使用“JLabel”和“JTextField”等外,基本相同。请阅读Swing基础知识。@camickr我想我已经理解了。我试试看。谢谢。@camickr我正在学习AWT和Swing。我必须这么做。我想你没抓住重点。Swing构建在AWT之上,因此Swing使用了很多AWT类。但在构建GUI时应该使用Swing组件。我意识到解决方案是多么简单。也许我需要休息一下。我已经更改了OP中的变量名。谢谢。我意识到解决方案是多么简单。也许我需要休息一下。我已经更改了OP中的变量名。谢谢。