Как уничтожить кадр, нажав на кнопку? - PullRequest
0 голосов
/ 01 июня 2019

Я хочу уничтожить кадр, нажав на кнопку.Я искал везде, и кажется, что я делаю это правильно.но это не работает.

public class LoginWindow {

    public void CreateLoginWindow () {

        /** Set Style to Main Frame **/
        JFrame main_window = new JFrame();
        main_window.setUndecorated(true);
        main_window.setLocationRelativeTo(null);
        main_window.setLayout(new BorderLayout());
        main_window.setLayout(new FlowLayout());
        main_window.setVisible(false);
        main_window.setContentPane(new JLabel(new ImageIcon("images/MainWindow-bg.jpg")));
        main_window.setExtendedState(JFrame.MAXIMIZED_BOTH);
        main_window.setSize(1920,1080);
        main_window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        /** Some Codes **/

        JButton login_button = new JButton("Click to Exit");
        login_button.setBounds(920,480,120,45);

        /** Login Button Action **/
        login_button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            ValidateLogin validateLogin = new ValidateLogin();
            Boolean valid = validateLogin.ValidateLoginAction(username_field.getText(),password_field.getText());
            main_window.dispose();
            }
        });

        main_window.add(login_button);
        main_window.setVisible(true);

    }

}

Кажется, ValidateLogin validateLogin = new ValidateLogin(); Boolean valid = validateLogin.ValidateLoginAction(username_field.getText(),password_field.getText()); создает некоторые проблемы.

И это мой ValidateLogin Класс:

public class ValidateLogin {

    public Boolean ValidateLoginAction (String username, String password){

        ConnectToDB validate_login = new ConnectToDB();
        String right_password = validate_login.GetPassOfAnUsername(username);
        if ( right_password.equals(password) ){
            return true;
        } else {
            return false;
        }

    }

}

И этомой ConnectToDB класс:

public class ConnectToDB {

    /** Connect to Database **/
    private Connection connect() {

        String url = "jdbc:sqlite:E://Resturant Project/db/Resturant.db";
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url);
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        return connection;
    }

    /** Get Password of an Username **/
    public String GetPassOfAnUsername(String username){

        String password = "SELECT Password FROM Person WHERE UserName = '" + username +"'";

        try (Connection connection = this.connect();
             PreparedStatement statement= connection.prepareStatement(password);
             ResultSet results = statement.executeQuery()) {

            return results.getString("Password");

        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }

        return null;
    }

}

а это мой MainWindow класс:

public class MainWindow {

    public static void main(String[] args) {
        LoginWindow loginWindow = new LoginWindow();
        loginWindow.CreateLoginWindow();
    }

}

Ответы [ 2 ]

0 голосов
/ 01 июня 2019

Я попытался, и я могу закрыть окно и JVM выходов также. Ниже приведен фрагмент кода действия кнопки.

login_button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                try {
                    ValidateLogin validateLogin = new ValidateLogin();
                    Boolean valid = validateLogin.ValidateLoginAction(username_field.getText(),password_field.getText());
                }
                catch(Exception ex) {
                    //handle exception
                }
                finally {
                    main_window.dispose();
                }
            }
        });
0 голосов
/ 01 июня 2019

Были ли где-нибудь созданы переменные username_field и password_field ? Возможно, строка, к которой вы обращаетесь к методу getText (), выдает исключение NullPointerException, когда вызывается метод actionPerformed , и поэтому программа никогда не достигает строки main_window.dispose ().
Попробуйте проверить, являются ли обе эти переменные нулевыми, когда выполняется метод actionPerformed, прежде чем пытаться получить доступ к методу getText () из них.
Также отметим, что соединение с базой данных успешно установлено.

ConnectToDB validate_login = new ConnectToDB();
String right_password = validate_login.GetPassOfAnUsername(username);

Вторая строка также может выдать исключение NullPointerException в случае, если validate_login равно нулю, поскольку ваш код вернет значение null из конструктора ConnectToDB () в случае сбоя соединения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...