无法关闭 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();
我有以下情况:
我有一个 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();