Java Swing登录页如何读取本地JSON文件验证学生账号密码并跳转
Java Swing学生登录功能实现(JSON校验)
需求说明
已完成基础登录界面开发,当前点击登录按钮仅会隐藏按钮,需要新增以下功能:
- 读取本地存储的JSON学生信息文件
- 校验用户输入的用户名和密码是否匹配存储数据
- 校验通过后自动跳转到系统内页
现有代码
登录页代码
import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.GridLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.BufferedReader; import java.io.FileReader; import javax.swing.BorderFactory; import javax.swing.JButton; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.SwingConstants; import java.io.FileReader; import java.io.IOException; import java.util.HashMap; public class LoginPage extends JPanel implements ActionListener { private static final long serialVersionUID = -337449186297669567L; private JLabel user_label = new JLabel("Username: "); private JLabel password_label = new JLabel("Password: "); private JLabel screenName = new JLabel("Login",SwingConstants.CENTER); private JTextField username = new JTextField(10); private JTextField password = new JTextField(10); private JButton login, cancel; private JPanel panel = new JPanel(); private String hidden = "login"; public LoginPage() { System.out.println("Creating the label panel"); setBorder(BorderFactory.createEtchedBorder()); setLayout(new GridLayout(0, 1)); add(screenName); add(user_label); add(username); add(password_label); add(password); login = new JButton("LOGIN"); setVisible(true); addToggleListener(); initialize(); } public void initialize(){ JPanel buttonPanel = new JPanel(new GridBagLayout()); GridBagConstraints c = new GridBagConstraints(); add(buttonPanel); c.weightx = 0.6; c.weighty = 0.6; c.gridx = 1; c.gridy = 1; c.fill = GridBagConstraints.NONE; c.insets = new Insets(10, 50, 10, 20); login.setPreferredSize(new Dimension(100,50)); c.anchor = GridBagConstraints.SOUTHEAST; buttonPanel.add(login,c); } public void setText(String s) { screenName.setText(s); } public boolean isLabelVisible() { return screenName.isVisible(); } public void setLabelVisibility(boolean value) { screenName.setVisible(value); } public void addToggleListener(ActionListener al){ login.addActionListener(al); } public void addToggleListener() { login.addActionListener(new ActionListener(){ @Override public void actionPerformed(ActionEvent e){ if(hidden.equals("login")){ login.setVisible(false); } else { login.setVisible(true); } } }); } @Override public void actionPerformed(ActionEvent e) { throw new UnsupportedOperationException("Not supported yet."); } }
主类(JSON处理逻辑)代码
import java.awt.BorderLayout; import java.util.ArrayList; import java.util.List; import javax.swing.JFrame; import javax.swing.JPasswordField; import javax.swing.JSplitPane; import javax.swing.JTextField; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import javax.enterprise.util.TypeLiteral; import javax.json.bind.Jsonb; import javax.json.bind.JsonbBuilder; public class Main { // 配置JSON文件存储路径常量,方便全局调用 public static final String STUDENT_JSON_PATH = System.getProperty("user.home") + "/NetBeansProjects/studentInfo.json"; public static void main(String[] args) { AppFrame frame = new AppFrame(); LoginPage lp = new LoginPage(); // 给登录按钮绑定校验逻辑监听 lp.login.addActionListener(e -> { String inputUser = lp.username.getText().trim(); String inputPwd = new String(lp.password.getPassword()).trim(); if(validateLogin(inputUser, inputPwd)){ // 校验成功,跳转到主页,这里的HomePage是你后续自己实现的系统主页面板 // frame.switchPanel(new HomePage()); JOptionPane.showMessageDialog(frame, "登录成功"); }else{ JOptionPane.showMessageDialog(frame, "用户名或密码错误", "登录失败", JOptionPane.ERROR_MESSAGE); } }); frame.setLayout(new BorderLayout()); frame.add(lp, BorderLayout.CENTER); frame.setVisible(true); // 仅当JSON文件不存在时才生成初始化数据,避免重复覆盖 File jsonFile = new File(STUDENT_JSON_PATH); if(!jsonFile.exists()){ List<Student> studentList = new ArrayList<>(); addAnisa(studentList); Jsonb jsonb = JsonbBuilder.create(); String jsonStudent = jsonb.toJson(studentList); Path dirPath = Paths.get(System.getProperty("user.home") + "/NetBeansProjects"); if(!Files.exists(dirPath)){ new File(System.getProperty("user.home") + "/NetBeansProjects").mkdir(); } try{ FileWriter fw = new FileWriter(jsonFile.getAbsoluteFile()); BufferedWriter bw = new BufferedWriter(fw); bw.write(jsonStudent); bw.close(); }catch(IOException e){ e.printStackTrace(); System.exit(-1); } } } // 登录校验静态方法 public static boolean validateLogin(String inputUsername, String inputPassword){ if(inputUsername.isEmpty() || inputPassword.isEmpty()) return false; Jsonb jsonb = JsonbBuilder.create(); try { String jsonContent = Files.readString(Paths.get(STUDENT_JSON_PATH)); java.lang.reflect.Type t = new TypeLiteral<List<Student>>(){}.getType(); List<Student> studentList = jsonb.fromJson(jsonContent, t); for(Student stu : studentList){ for(LoginInfo info : stu.getLoginInfo()){ if(info.getUsername().equals(inputUsername) && info.getPassword().equals(inputPassword)){ return true; } } } } catch (IOException e) { e.printStackTrace(); } return false; } private static void addAnisa(List<Student> list){ Student s = new Student(); s.setFirstName("Anisa"); s.setLastName("Callis"); List<LoginInfo> loginInfo = new ArrayList<>(); LoginInfo LI = new LoginInfo(); LI.setUsername("amc123"); LI.setPassword("demo2021"); loginInfo.add(LI); s.setLoginInfo(loginInfo); list.add(s); } }
窗口基础类代码
import javax.swing.*; import java.awt.*; public class AppFrame extends JFrame { private static final long serialVersionUID = -337449186297669567L; public AppFrame(){ setTitle("Plan & Earn"); setSize(400, 400); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } // 新增页面切换方法,登录成功后调用替换面板 public void switchPanel(JPanel newPanel){ getContentPane().removeAll(); getContentPane().add(newPanel, BorderLayout.CENTER); revalidate(); repaint(); } }
实体类代码
LoginInfo(登录信息类)
public class LoginInfo { String username; String password; public LoginInfo(){ } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
Student(学生信息类)
import java.util.ArrayList; import java.util.List; public class Student { String firstName; String lastName; private List<LoginInfo> loginInfo; public Student(){ } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public List<LoginInfo> getLoginInfo() { return loginInfo; } public void setLoginInfo(List<LoginInfo> loginInfo) { this.loginInfo = loginInfo; } @Override public String toString(){ return "Student{" + "firstName=" + firstName + ", lastName=" + lastName + ", Login Info=" + loginInfo + '}'; } }
优化点说明
- 将原密码输入框从
JTextField替换为JPasswordField,避免密码明文显示 - 调整JSON文件生成逻辑,仅当文件不存在时才生成初始数据,避免每次启动覆盖本地修改
- 新增独立的登录校验方法,逻辑解耦方便后续维护
- 新增窗口页面切换方法,登录成功后直接调用即可跳转到系统主页
内容的提问来源于stack exchange,提问作者Anisa Callis
相关产品推荐
相关产品推荐

