LoginGUI.java
完成效果如下图:

CODE
Summary:
This code sets up a login GUI using Swing.
It defines a LoginGUI class extending JFrame.
The constructor initializes the GUI components and sets up event listeners.
The event_login method handles the login logic, displaying messages based on the success or failure of the login attempt.
/*
package com.shiyanlou.view; - This declares the package name.
The import statements import various classes needed for the GUI components and event handling from the javax.swing and java.awt libraries, as well as a custom utility class JDOM.
*/
package com.shiyanlou.view;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
import com.shiyanlou.util.JDOM;
/Class Declaration
/*
LoginGUI extends JFrame, which means it is a type of window.
--
serialVersionUID is a unique identifier for the class, used during deserialization.
--
contentPane is a JPanel that acts as the main panel of the frame.
--
IDtxt, Passwdlabel, and passwordField are components for user input and labels.
--
login and back are buttons for submitting the login form and going back to the main window.
*/
public class LoginGUI extends JFrame {private static final long serialVersionUID = 4994949944841194839L;private JPanel contentPane; //面板private JTextField IDtxt; //ID输入框private JLabel Passwdlabel; //密码标签private JPasswordField passwordField; //密码输入框private JButton login;//登录按钮private JButton back;//返回按钮/ Member Method: loginGUI
/*
This method starts the application by creating and displaying the LoginGUI frame in the Event Dispatch Thread, ensuring thread safety.
*//**//*** Launch the application.* @return*/
public void loginGUI() {EventQueue.invokeLater(new Runnable() {public void run() {try {LoginGUI frame = new LoginGUI();frame.setVisible(true);}catch(Exception e) {e.printStackTrace();}}});
}Constructor: LoginGUI
/*
The constructor initializes the frame, sets the default close operation, size, and layout.
--
contentPane is set up as the main panel with a border and null layout for absolute positioning.
--
Labels and text fields (IDlabel, IDtxt, Passwdlabel, passwordField) are created and added to contentPane.
--
The login button is created, with mouse and key event listeners attached to handle clicks and Enter key presses.
--
The back button is created, with a mouse event listener to return to the main window.
A welcome label is added to the frame.
*///构造方法
/*** Create the frame.*/
public LoginGUI() {setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);setBounds(100,100,650,400);contentPane = new JPanel();contentPane.setBorder(new EmptyBorder(5,5,5,5));setContentPane(contentPane);contentPane.setLayout(null);JLabel IDlabel = new JLabel("Please input ID");//id 标签IDlabel.setBounds(68,170,100,39);contentPane.add(IDlabel);IDtxt = new JTextField();IDtxt.setBounds(220, 179, 126, 21);contentPane.add(IDtxt);IDtxt.setColumns(10);Passwdlabel = new JLabel("Please input password");Passwdlabel.setBounds(68, 219, 150, 50);contentPane.add(Passwdlabel);passwordField = new JPasswordField();passwordField.setBounds(220, 234, 126, 21);contentPane.add(passwordField);login = new JButton("login");//鼠标事件login.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {event_login();//登录事件方法}});//键盘事件login.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {if(e.getKeyCode() == KeyEvent.VK_ENTER) {//当键盘按enter时调用event_login();//登录事件方}}});login.setBounds(239, 310, 93, 23);contentPane.add(login);//返回按钮back = new JButton("BACK");back.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {IndexGUI.init();setVisible(false);}});back.setBounds(507, 310, 93, 23);contentPane.add(back);//标题JLabel label = new JLabel("Welcome to use KnowYou");label.setFont(new Font("Ubuntu",Font.BOLD | Font.ITALIC,30));}/event_login
/*
This method handles the login logic when the login button is clicked or Enter is pressed.
--
It retrieves the user ID and password from the input fields.
--
It calls JDOM.read(id, passwd) to validate the credentials.
--
If the login is successful, it displays a welcome message and opens the user GUI (UsersGUI.init(name)).
--
If the login fails, it shows an error message.
*///封装登录事件
private void event_login() {//这里的登录事件方法暂不处理,日后补充。String id = IDtxt.getText();String passwd = new String(passwordField.getPassword());String flag = JDOM.read(id, passwd);if(flag.contains("Successful landing")) {//拆分信息String[] bufs = flag.split("/");String name = bufs[1];//提示框,打印登录成功JOptionPane.showMessageDialog(contentPane, "Welcome: "+name,"Welcome", JOptionPane.PLAIN_MESSAGE);UsersGUI.init(name);setVisible(false);}else {//提示框,错误信息JOptionPane.showMessageDialog(contentPane, flag,"ERROR",JOptionPane.ERROR_MESSAGE);}
}
}
tips:
understanding the details of the code is crucial for a Java developer. Knowing the specifics allows you to:
-
debug effectively
-
write better code
-
understand others' code
-
optimize performance
-
implement features
Event Dispatch Thread
javaCopy codeEventQueue.invokeLater(new Runnable() {public void run() {try {LoginGUI frame = new LoginGUI();frame.setVisible(true);} catch (Exception e) {e.printStackTrace();}}
});
-
Purpose: Ensures that the creation and updating of GUI components happen on the Event Dispatch Thread (EDT), which is the thread responsible for handling GUI events in Swing.
-
Details
:
-
EventQueue.invokeLater(Runnable runnable): Schedules the specifiedRunnableto be executed on the EDT. -
new Runnable() { public void run() { ... } }: Defines theRunnable'srunmethod, which is executed on the EDT. -
LoginGUI frame = new LoginGUI();: Creates an instance ofLoginGUI. -
frame.setVisible(true);: Makes the frame visible.
-
Constructor: LoginGUI
javaCopy codesetDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 650, 400); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); contentPane.setLayout(null);
-
Purpose: Sets up the main window and its content pane.
-
Details
:
-
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);: Specifies that the application should exit when the window is closed. -
setBounds(int x, int y, int width, int height);: Sets the position and size of the frame. -
contentPane = new JPanel();: InitializescontentPane. -
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));: Adds an empty border with 5-pixel padding around thecontentPane. -
setContentPane(contentPane);: SetscontentPaneas the content pane for the frame. -
contentPane.setLayout(null);: Uses absolute positioning for the layout ofcontentPane.
-
Adding Components
javaCopy codeJLabel IDlabel = new JLabel("Please input ID");
IDlabel.setBounds(68, 170, 100, 39);
contentPane.add(IDlabel);
IDtxt = new JTextField();
IDtxt.setBounds(220, 179, 126, 21);
contentPane.add(IDtxt);
IDtxt.setColumns(10);
-
Purpose: Adds a label and a text field for user ID input.
-
Details
:
-
JLabel IDlabel = new JLabel("Please input ID");: Creates a label with the specified text. -
IDlabel.setBounds(int x, int y, int width, int height);: Sets the position and size of the label. -
contentPane.add(IDlabel);: Adds the label tocontentPane. -
IDtxt = new JTextField();: Creates a text field for user input. -
IDtxt.setBounds(int x, int y, int width, int height);: Sets the position and size of the text field. -
contentPane.add(IDtxt);: Adds the text field tocontentPane. -
IDtxt.setColumns(int columns);: Sets the number of columns in the text field, affecting its preferred width.
-
Event Listeners
javaCopy codelogin.addMouseListener(new MouseAdapter() {@Overridepublic void mouseClicked(MouseEvent e) {event_login();}
});
login.addKeyListener(new KeyAdapter() {public void keyPressed(KeyEvent e) {if (e.getKeyCode() == KeyEvent.VK_ENTER) {event_login();}}
});
-
Purpose: Attaches event listeners to the login button for handling mouse clicks and key presses.
-
Details
:
-
login.addMouseListener(new MouseAdapter() { ... });: Adds a mouse listener to handle mouse events. -
mouseClicked(MouseEvent e): Called when the login button is clicked. -
event_login();: Calls theevent_loginmethod to handle the login process. -
login.addKeyListener(new KeyAdapter() { ... });: Adds a key listener to handle key events. -
keyPressed(KeyEvent e): Called when a key is pressed while the login button is focused. -
if (e.getKeyCode() == KeyEvent.VK_ENTER) { ... }: Checks if the Enter key was pressed.
-
Event Handling Method: event_login
javaCopy codeprivate void event_login() {String id = IDtxt.getText();String passwd = new String(passwordField.getPassword());String flag = JDOM.read(id, passwd);if (flag.contains("Successful landing")) {String[] bufs = flag.split("/");String name = bufs[1];JOptionPane.showMessageDialog(contentPane, "Welcome: " + name, "Welcome", JOptionPane.PLAIN_MESSAGE);UsersGUI.init(name);setVisible(false);} else {JOptionPane.showMessageDialog(contentPane, flag, "ERROR", JOptionPane.ERROR_MESSAGE);}
}
-
Purpose: Handles the login process by validating user credentials.
-
Details
:
-
String id = IDtxt.getText();: Retrieves the user ID from the text field. -
String passwd = new String(passwordField.getPassword());: Retrieves the password from the password field. -
String flag = JDOM.read(id, passwd);: Calls a method fromJDOMto validate the credentials and returns a result string. -
if (flag.contains("Successful landing")) { ... }: Checks if the login was successful. -
String[] bufs = flag.split("/");: Splits the result string to extract the user's name. -
String name = bufs[1];: Gets the user's name. -
JOptionPane.showMessageDialog(contentPane, "Welcome: " + name, "Welcome", JOptionPane.PLAIN_MESSAGE);: Displays a welcome message. -
UsersGUI.init(name);: Initializes the user GUI with the user's name. -
setVisible(false);: Hides the login window. -
else { ... }: Displays an error message if the login failed.
-