You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 10:57:02