Как остановить кнопку ActionListener на полпути и подождать, пока пользователь снова не нажмет ее? - PullRequest
0 голосов
/ 09 сентября 2018

Мне действительно нужно решение этой проблемы, и я так и не нашел решение даже после 2 часов поиска. Я изучаю Java AWT, разрабатывая простые приложения.

Я создал страницу / окно / фрейм регистрации, которая берет имя пользователя, пароль и пароль подтверждения через соответствующие текстовые поля и добавляет их в базу данных при нажатии кнопки «Зарегистрироваться», если и только если два пароля совпадают. Если они не совпадают, текстовые поля пароля очищаются, и пользователю необходимо повторно ввести значения и снова нажать кнопку «Зарегистрироваться». Это должно продолжаться в цикле. Я поместил все строки необходимого кода, включая логику неравных паролей, в ActionListener кнопки «Зарегистрироваться».

Я публикую часть кода ActionListener кнопки. Вы заметите очевидные логические ошибки, такие как, после очистки TextFields паролей с помощью setText(""), пароли фактически совпадают, так как обе являются пустыми строками. Но, тем не менее, даже если я очищаю только одно из двух TextFields, после запуска ActionListener я не смогу повторно ввести новые значения в TextFields, и приложение навсегда зависнет, пока не будет принудительно закрыто.

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 голосов
/ 09 сентября 2018

Не следует выполнять итерации во время выполнения, если функции / методы должны запускаться только один раз при нажатии кнопки, ваш приведенный выше код, вероятно, заканчивается бесконечным циклом.

0 голосов
/ 09 сентября 2018

Ваш цикл while не принадлежит, поскольку, хотя это нормально для линейной консольной программы, он будет блокировать поток событий Swing или любой другой поток событий в программе, управляемой событиями, делая программу замороженной и бесполезной. Вместо этого вы, вероятно, захотите просто очистить текстовые поля диалогового окна, если ввод неправильный, и отобразить сообщение об ошибке в панели JOptionPane. На самом деле, скорее всего, все, что вам нужно, это блок if / else и цикл 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, так как это приводит к графическому интерфейсу, который не работает на всех платформах. Вместо этого изучите и используйте менеджеры по расположению.

...