无法关闭 JFrame,从 JPanel 内部单击

Can't close JFrame, from click inside JPanel

我有以下情况:

我有一个 JFrame(GridBagLayout),里面有 3 个 JPanel(headerPanel、bodyPanel、footerPanel); 在 bodyPanel 上我有一个登录按钮; 我想要的是关闭JFrame,一个打开另一个;

主要:

package com.system.reservation.airline;

public class Main {
    public static void main(String[] args) { // Main function that executes the program
        LoginPage loginPage = new LoginPage();
    }
}

登录页面:

public class LoginPage extends JFrame{
    HeaderPanel headerPanel = new HeaderPanel();
    BodyPanel bodyPanel = new BodyPanel();
    FooterPanel footerPanel = new FooterPanel();

    public LoginPage(){ // Constructor
        this.setTitle("Login"); // Frame title
        this.setSize(400, 600); // Frame size
        this.setLocationRelativeTo(null); // Center frame, when launched
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // Frame function, on close button (will close)
        this.getContentPane().setBackground(new Color(240,248,255)); // Light blue
        this.setLayout(new GridBagLayout());

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridheight = 1;
        this.add(headerPanel, gbc);

        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridheight = 1;
        this.add(bodyPanel, gbc);

        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.gridheight = 3;
        this.add(footerPanel, gbc);

        this.pack();
        this.setVisible(true); // Frame visible
    }
}

正文面板:

package com.system.reservation.airline.panels;

import com.system.reservation.airline.HomePage;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class BodyPanel extends JPanel implements ActionListener { // Listens to events

    JButton login_button;
    JTextField userName_txb, password_txb;
    JLabel tokenResponse;

    String username;
    String password;

    public void setUsername(String newUsername){
        username = newUsername;
    }
    public String getUsername(){
        return username;
    }

    public void setPassword(String newPassword){
        password = newPassword;
    }
    public String getPassword(){
        return password;
    }
    public BodyPanel(){
        Color transparent = new Color(1f,0f,0f,0f);

        this.setBackground(transparent);
        this.setLayout(new BorderLayout());
        //this.setBorder(BorderFactory.createLineBorder(Color.green, 3));
        //------------ Login Panel ------------------------
        JPanel login_panel = new JPanel(new BorderLayout());
        login_panel.setBackground(transparent);
        login_panel.setPreferredSize(new Dimension(400, 50));
        //login_panel.setBorder(BorderFactory.createLineBorder(Color.YELLOW, 5));

        JLabel login_label = new JLabel();
        login_label.setText("Login");
        login_label.setHorizontalAlignment(JLabel.CENTER);
        login_label.setFont(new Font("Arial", Font.PLAIN, 20));

        login_panel.add(login_label, BorderLayout.CENTER);
        //------------ Login Panel ------------------------

        //------------ Input Panel ------------------------
        JPanel input_fields_panel = new JPanel(new GridBagLayout());
        input_fields_panel.setBackground(transparent);
        //input_fields_panel.setPreferredSize(new Dimension(400, 150));
        //input_fields_panel.setBorder(BorderFactory.createLineBorder(Color.black, 5));

        GridBagConstraints gbc = new GridBagConstraints();

        gbc.weightx = 1;
        gbc.weighty = 1;
        gbc.fill = GridBagConstraints.BOTH;

        //-------------
        JLabel userName_label = new JLabel("Username: ");
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        gbc.insets = new Insets(0,10,0,0);
        input_fields_panel.add(userName_label, gbc);

        userName_txb = new JTextField();
        userName_txb.setPreferredSize(new Dimension(250,30));
        gbc.gridx = 3;
        gbc.insets = new Insets(5,0,5,20);
        input_fields_panel.add(userName_txb, gbc);
        //-------------

        //-------------
        JLabel password_label = new JLabel("Password: ");
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 1;
        gbc.gridheight = 1;
        gbc.insets = new Insets(0,10,0,0);
        input_fields_panel.add(password_label, gbc);

        password_txb = new JTextField();
        password_txb.setPreferredSize(new Dimension(250,30));
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.gridwidth = 3;
        gbc.gridheight = 1;
        gbc.insets = new Insets(5,0,5,20);
        input_fields_panel.add(password_txb, gbc);
        //-------------

        //------ Login Button -----------
        login_button = new JButton("Login");
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.gridwidth = 4;
        gbc.gridheight = 1;
        gbc.insets = new Insets(10,150,5,150);
        login_button.addActionListener(this);
        input_fields_panel.add(login_button, gbc);
        //------ Login Button -----------

        tokenResponse = new JLabel("");
        tokenResponse.setHorizontalAlignment(JLabel.CENTER);
        gbc.gridx = 0;
        gbc.gridy = 3;
        gbc.gridwidth = 4;
        gbc.gridheight = 1;
        gbc.insets = new Insets(0,0,0,0);
        input_fields_panel.add(tokenResponse, gbc);
        //------------ Input Panel ------------------------

        //-------------------------------------
        this.add(login_panel, BorderLayout.NORTH);
        this.add(input_fields_panel, BorderLayout.CENTER);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == login_button) {
            System.out.println("Olá");
            //-------------------------
            if(userName_txb.getText().replaceAll("\s+","").equals("") || password_txb.getText().replaceAll("\s+","").equals("")){ // removes white spaces
                // If either of the text fields are empty, a label is displayed
                System.out.println("It's empty!");
                tokenResponse.setText("The input fields are empty!");
            } else {
                String userName_value = userName_txb.getText();
                String userPassword_value = password_txb.getText();
                // User inputs are stored

                setUsername(userName_value);
                setPassword(userPassword_value);
                // User inputs are initialized
                //-----------------------
                try{
                    Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/user_login", "root", "***********");
                    // Connect to the database;
                    Statement statement = connection.createStatement();
                    // It will initiate a command;
                    ResultSet resultSet = statement.executeQuery("select customer_username, customer_password from user_authentication");
                    // Execute the command;                                                 // column                   // table

                    while (resultSet.next()){ // While there are results, it will print them;
                        String name = resultSet.getString("customer_username");
                        String password = resultSet.getString("customer_password");

                        if(!getUsername().equals(name) || !getPassword().equals(password)){
                            tokenResponse.setText("The username or the password are incorrect!");
                            System.out.println("It does not match!");
                            //break;
                        } else {
                            // CLOSE JFRAME
                            System.out.println("It matches!");
                            HomePage homePage = new HomePage();
                            break;
                        }
                    }
                }catch(Exception e2){
                    e2.printStackTrace();
                }
            }
        }
    }
}

点击登录后,左边的JFrame出现了。 我要关闭右边那个

如有任何帮助,我们将不胜感激。

来自@camickr 的回答,通过在 Jpanel 中单击成功关闭了 Jframe:

login_button = (JButton) e.getSource();
SwingUtilities.windowForComponent(login_button).dispose();