简单学生管理系统

news/2024/11/9 9:52:14/

简单学生管理系统(Java)_封奚泽优的博客-CSDN博客icon-default.png?t=N5F7https://blog.csdn.net/weixin_64066303/article/details/130667107?spm=1001.2014.3001.5501

转载请注明出处,尊重作者劳动成果。

目录

前期准备:

数据库的连接:

用户账号类:

用户登录:

用户注册:

忘记密码:

学生类:

增:

删:

改:

查:

 主界面:

类主界面:

主程序:

程序说明与体会:


前期准备:

还是决定提供源代码了。我这里用到的数据库是SQLserver,插入信息的时候要注意,登录时候的用户名是用英文的,但是导入学生数据时候是用的中文.且长度但有要求。原本是设计了S,C,SC这几张表,但是要设计的界面太多了,所以就简化成两张表,users的主键是用户名,Student的主键是学号(这个要注意一下)


--User(userName,Sno,PhoneNumber,password)
--Student(sno,name,sex,age,id,phoneNumber,address)create database education
ON 
( NAME = education_dat,FILENAME = 'd:\SqlTest\data\education_Dat.mdf',SIZE = 20,FILEGROWTH = 25% )
LOG ON
( NAME = 'education_log',FILENAME = 'd:\SqlTest\log\education_Log.ldf',SIZE = 5MB,FILEGROWTH = 5MB )
GOuse education
gocreate table S(Sno int not null IDENTITY (200400001,1) primary key,Sname varchar(20),Ssex char(2) default('男') check(Ssex='男' or Ssex='女'),Sage tinyint)
GO
create table C(Cno char(5) not null primary key,Cname varchar(30),Teacher varchar(20))
GO
create table SC(Sno INT not null REFERENCES S(Sno),--外键Cno CHAR(5) not null REFERENCES C(Cno),--外键Grade tinyint,CONSTRAINT pk_key primary key(Sno,Cno))
GO
--用户名为主键
create table users(	userName varchar(80) not null primary key,password varchar(80),sno varchar(26) ,phoneNumber varchar(24))
GO
create table Student(Sno  varchar(26)  not null primary key,name varchar(20),sex char(2) default('男') check(sex='男' or sex='女'),age tinyint,id varchar(80),phoneNumber varchar(80),address varchar(160))
GO--需要默认插入数据(需要根据自己的信息来插入)
use education
insert into users values('users','123456','自己的学号','自己的电话号码')
insert into Student values('自己的学号','自己的姓名','男','年龄','自己的身份证号码'
,'自己的电话号码','湖南省耒阳市')
go
select * from usersselect * from Student

 接下来就是java程序了,直接放代码了。

数据库的连接:

这里把127.0.0.1改成自己的ip也没有问题。要注意的就是驱动的安装了。

eclipse连接SQLserver_封奚泽优的博客-CSDN博客icon-default.png?t=N5F7https://blog.csdn.net/weixin_64066303/article/details/130469647?spm=1001.2014.3001.5501

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class GetConnection {//数据库连接对象private Connection con;//还是要加上encrypt=false,不然程序会报错//连接数据库的urlprivate static final String url="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=education;encrypt=false";//forTest为你的数据库名//数据库的用户名private static final String username="sa";//你的数据库用户名//连接数据库的密码private static final String password="123456";//你自己设置的密码//数据库驱动private static final String className="com.microsoft.sqlserver.jdbc.SQLServerDriver";public GetConnection() {try {//加载驱动Class.forName(className);}catch(ClassNotFoundException e) {System.out.println("加载数据库驱动失败");e.printStackTrace();}}//获取数据库连接public Connection getCon() {try {//获取数据库连接con=DriverManager.getConnection(url,username,password);}catch(SQLException e) {System.out.println("创建数据库连接失败!");con=null;e.printStackTrace();}//返回数据库连接对象return con;}
}

用户账号类:

就是一些构造方法以及get和set的一些方法,要注意的就是我把所有的成员变量都设置成String类型了,主要是和数据库数据插入和查询的时候感觉方便一点。


public class User {private String userName;private String password;private String Sno;private String phoneNumber;public User(String userName, String password, String sno, String phoneNumber) {this.userName = userName;this.password = password;Sno = sno;this.phoneNumber = phoneNumber;}public User() {}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;}public String getSno() {return Sno;}public void setSno(String sno) {Sno = sno;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}
}

用户登录:

 

import java.awt.Font;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Random;import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;public class Enter extends JFrame implements ActionListener{public static void main(String[] args) {new Enter();}//面板final JPanel panel=new JPanel();//创建教务管理系统标签final JLabel system=new JLabel();//创建用户名标签final JLabel userNameLabel=new JLabel();//创建用户名文本框final JTextField userNameTextField=new JTextField();//创建密码标签final JLabel passwordLabel=new JLabel();//创建密码文本框final JTextField passwordTextField=new JTextField();//创建验证码标签final JLabel verificationCodeLabel=new JLabel();//创建验证码文本框final JTextField verificationCodeTextField=new JTextField();//创建随机生成验证码标签final JLabel randomCodeLabel=new JLabel();//登录按钮final JButton loginButton=new JButton();//注册按钮final JButton registerButton=new JButton();//忘记密码按钮final JButton forgetPasswordButton=new JButton();//警告标签,放在弹窗里面final JLabel warningLabel=new JLabel();//用来存储随机生成的验证码String code="";//用户登录名String name="";//用户密码String password="";//用户输入的验证码String inputCode="";//输入密码的次数int count=3;//用来在运行时存储用户的账号User user=new User();//账号存在这个集合里面,所以我把他设置成静态的了,这样在其他类里面也可以用static ArrayList<User>list=new ArrayList<>();//准备连接的对象GetConnection connection=new GetConnection();Connection conn=null;public Enter() {//初始化窗体initFrame();//初始化面板initPanel();//绑定监听事件buttonAction();//窗体可见,放最后吧,不然里面的东西不会显示呢this.setVisible(true);}public void initFrame() {//设置窗体的标题this.setTitle("用户登录");//设置窗体大小不可改变this.setResizable(false);//设置界面置顶(就是页面不会别其他页面覆盖,界面始终在最上面)this.setAlwaysOnTop(true);//那还是改成setSize吧,设置窗体的大小就行了this.setSize(500,400);//居中this.setLocationRelativeTo(null);//设置窗体关闭按钮的动作作为退出this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//初始化面板public void initPanel() {initModule();//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了panel.setLayout(null);//添加相关的组件panel.add(system);panel.add(userNameLabel);panel.add(userNameTextField);panel.add(passwordLabel);panel.add(passwordTextField);panel.add(verificationCodeLabel);panel.add(verificationCodeTextField);panel.add(randomCodeLabel);panel.add(loginButton);panel.add(registerButton);panel.add(forgetPasswordButton);this.setContentPane(panel);}//初始化组件public void initModule() {//最开始有一个用户已经登录//list.add(user);//把数据库中存在的用户取出到程序中select();//初始化管理系统相关组件system.setText("学生管理系统");//设置字体的类型,加粗,和大小system.setFont(new Font("Microsoft YaHei",Font.BOLD,35));//标签的位置和大小system.setBounds(150,0,250,50);//初始化用户名相关的组件userNameLabel.setText("用户名:");//设置字体的类型,加粗,和大小userNameLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));//标签的位置和大小userNameLabel.setBounds(30,75,100,50);//文本框位置userNameTextField.setBounds(130,80,150,50);userNameTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//初始化密码相关的组件passwordLabel.setText("密码:");//设置字体的类型,加粗,和大小passwordLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));//标签的位置和大小passwordLabel.setBounds(40,145,100,50);//文本框位置passwordTextField.setBounds(130,150,150,50);//文本框字体的大小passwordTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//初始化验证码相关的组件verificationCodeLabel.setText("验证码:");//设置字体的类型,加粗,和大小verificationCodeLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));//标签的位置和大小verificationCodeLabel.setBounds(30,215,100,50);//文本框位置verificationCodeTextField.setBounds(130,220,150,50);verificationCodeTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//初始化随机生成的验证码相关的组件//随机生成验证码securityCode();//每次生成都要打印,我干脆就放一起了//randomCodeLabel.setText(code);//设置字体的类型,不加粗,和大小randomCodeLabel.setFont(new Font("Microsoft YaHei",Font.PLAIN,20));//标签的位置和大小randomCodeLabel.setBounds(290,215,100,50);//登录按钮loginButton.setBounds(20,290,450,60);loginButton.setText("登录/注册");loginButton.setFont(new Font("宋体",Font.BOLD,30));//注册按钮registerButton.setBounds(380,215,100,50);registerButton.setText("注册账号");registerButton.setFont(new Font("宋体",Font.BOLD,15));//按钮透明registerButton.setContentAreaFilled(false);//忘记密码按钮forgetPasswordButton.setBounds(290,150,180,50);forgetPasswordButton.setText("忘记密码");forgetPasswordButton.setFont(new Font("宋体",Font.BOLD,25));//按钮透明forgetPasswordButton.setContentAreaFilled(false);}public void buttonAction() {loginButton.addActionListener(this);registerButton.addActionListener(this);forgetPasswordButton.addActionListener(this);}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubJButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本if(buttonName.equals("登录/注册")) {//System.out.println("我登录了");verify();}else if(buttonName.equals("注册账号")) {//System.out.println("我注册了");this.setVisible(false);new Register();}else if(buttonName.equals("忘记密码")) {//System.out.println("我忘记密码了");this.setVisible(false);new ForgetPassword();}}//随机生成验证码public void securityCode() {//每次都重新随机一个验证码code = "";Random r = new Random();char[] arr = new char[52];char[] number = new char[5];int count = 0;for (int i = 0; i < 26; i++) {arr[i] = (char) ('A' + i);}for (int i = 26; i < 52; i++) {arr[i] = (char) ('a' + i - 26);}//随机生成四位字母for (int i = 0; i < 4; i++) {int index = r.nextInt(arr.length);number[count++] = arr[index];}//随机生成一位数字number[count] = (char) (r.nextInt(10) + 48);//打乱顺序for (int i = 0; i < number.length; i++) {int index = r.nextInt(number.length);char tmp = number[i];number[i] = number[index];number[index] = tmp;}//需要先将code添加进去,在此基础上添加新的字符for (int i = 0; i < number.length; i++) {code = new StringBuilder().append(code).append(number[i]).toString();}randomCodeLabel.setText(code);}//用户登录验证public void verify() {//等一下要判断是否规范,所以需要用trim去除字符串前面的空白字符name=userNameTextField.getText().trim().toString();password=passwordTextField.getText().trim().toString();inputCode=verificationCodeTextField.getText().trim().toString();//System.out.println(name+password);//exisit是用户定义的方法哈if(exisit(list,name)) {//判断验证码是否正确if(!code.equals(inputCode)){warning("      验证码输入错误,请重新输入");//更新验证码securityCode();}else {//用户名的密码int index=getIndex(list,name);User user=list.get(index);count--;if(user.getPassword().equals(password)){//进入主界面new MainFrame();System.out.println("登录成功");}else{warning("      密码错误,你还有"+count+"次机会");if(count==0){warning("          三次错误,账号锁定");//直接关闭虚拟机System.exit(0);}//更新验证码securityCode();}}}else {//System.out.println("用户名为注册,请先注册");//warning也是用户定义的//前面空白是占位用的warning("          用户名未注册,请先注册");}}//判断用户名是否已经存在public  boolean exisit(ArrayList<User> list, String name) {/*     for (int i = 0; i < list.size(); i++) {if (list.get(i).getUserName().equals(name)) {return true;}}return false;*/return getIndex(list,name)>=0;}//返回用户账号的索引public int getIndex(ArrayList<User>list,String name){for (int i = 0; i < list.size(); i++) {if(list.get(i).getUserName().equals(name)){return i;}}return -1;}//输出警告弹窗public void warning(String str) {//添加一个弹窗的警告JDialog jDialog=new JDialog();//创建弹窗对象jDialog.setTitle("警告");//设置弹窗标题,和Frame差不多,可能还要通过标签来提示jDialog.setSize(500,400);//设置弹窗的大小jDialog.setAlwaysOnTop(true);//让弹窗置顶jDialog.setLocationRelativeTo(null);//让弹窗居中jDialog.setModal(true);//弹窗不关闭则无法操作下面的界面//设置字体的类型,加粗,和大小warningLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));//输出警告提示符warningLabel.setText(str);//标签的位置和大小warningLabel.setBounds(0,100,500,100);//这个也要取消布局管理器才行jDialog.getContentPane().setLayout(null);//往弹窗中添加标签jDialog.getContentPane().add(warningLabel);jDialog.setVisible(true);//让弹窗显示出来}//查询已经存在的用户,避免重复插入,在程序初始化的时候调用public void select() {//获取数据库连接,不然会报空指针异常conn=connection.getCon();try{//sname,password,sno,phoneNumber//定义静态select语句String sql="select * from users";//实例化Statement对象(静态),这里不知道为什么需要//java.sql这个东西,不然就没有executeQuery这个方法java.sql.Statement s=conn.createStatement();//执行静态select语句ResultSet rs=s.executeQuery(sql);//添加到集合中while(rs.next()) {//获取数据String name=rs.getString(1);String password=rs.getString(2);String sno=rs.getString(3);String phone=rs.getString(4);//System.out.println(name+" "+password+" "+sno+" "+phone+" ");//插入到集合中list.add(new User(name, password, sno, phone));}}catch(SQLException e) {e.printStackTrace();}}
}

用户注册:

 

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.sql.*;import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;public class Register extends JFrame implements ActionListener {public static void main(String[] args) {new Register();}//面板final JPanel panel=new JPanel();//创建教务管理系统标签final JLabel system=new JLabel();//创建用户名标签final JLabel userNameLabel=new JLabel();//创建用户名文本框final JTextField userNameTextField=new JTextField();//创建学号标签final JLabel snoLabel=new JLabel();//创建学号文本框final JTextField snoTextField=new JTextField();//创建手机号码标签final JLabel phoneNumberLabel=new JLabel();//创建手机号码文本框final JTextField phoneNumberTextField=new JTextField();//创建密码标签final JLabel passwordLabel=new JLabel();//创建密码文本框final JTextField passwordTextField=new JTextField();//创建再次输入密码标签final JLabel againPasswordLabel=new JLabel();//创建再次输入密码文本框final JTextField againPasswordTextField=new JTextField();//注册按钮final JButton registerButton=new JButton();//警告标签,放在弹窗里面final JLabel warningLabel=new JLabel();//用户登录名String name="";//用户学号String sno="";//用户手机号码String phoneNumber="";//用户密码String password="";//用户再次确定密码String againPassword="";//准备连接的对象GetConnection connection=new GetConnection();Connection conn=null;public Register() {//初始化窗体initFrame();//初始化面板initPanel();//绑定监听事件buttonAction();//窗体可见,放最后吧,不然里面的东西不会显示呢this.setVisible(true);}public void initFrame() {//设置窗体的标题this.setTitle("用户注册");//设置窗体大小不可改变this.setResizable(false);//设置界面置顶(就是页面不会别其他页面覆盖,界面始终在最上面)this.setAlwaysOnTop(true);//那还是改成setSize吧,设置窗体的大小就行了this.setSize(500,400);//居中this.setLocationRelativeTo(null);//设置窗体关闭按钮的动作作为退出this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//初始化面板public void initPanel() {initModule();//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了panel.setLayout(null);//添加相关的组件panel.add(system);panel.add(userNameLabel);panel.add(userNameTextField);panel.add(snoLabel);panel.add(snoTextField);panel.add(phoneNumberLabel);panel.add(phoneNumberTextField);panel.add(passwordLabel);panel.add(passwordTextField);panel.add(againPasswordLabel);panel.add(againPasswordTextField);panel.add(registerButton);this.setContentPane(panel);}//初始化组件public void initModule() {//初始化管理系统相关组件system.setText("学生管理系统");//设置字体的类型,加粗,和大小system.setFont(new Font("Microsoft YaHei",Font.BOLD,35));//标签的位置和大小system.setBounds(150,0,250,50);//初始化用户名相关的组件userNameLabel.setText("用户名:");//设置字体的类型,加粗,和大小userNameLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小userNameLabel.setBounds(30,55,100,50);//文本框位置userNameTextField.setBounds(130,60,150,40);//文本框字体的大小userNameTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//初始化学号相关的组件snoLabel.setText("学号:");//设置字体的类型,加粗,和大小snoLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小snoLabel.setBounds(30,100,100,50);//文本框位置snoTextField.setBounds(130,105,150,40);//文本框字体的大小snoTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,15));//初始化手机号码相关的组件phoneNumberLabel.setText("手机号码:");//设置字体的类型,加粗,和大小phoneNumberLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小phoneNumberLabel.setBounds(30,140,100,50);//文本框位置phoneNumberTextField.setBounds(130,150,150,40);//文本框字体的大小phoneNumberTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//初始化密码相关的组件passwordLabel.setText("密码:");//设置字体的类型,加粗,和大小passwordLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小passwordLabel.setBounds(30,187,100,50);//文本框位置passwordTextField.setBounds(130,195,150,40);//文本框字体的大小passwordTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//初始化密码相关的组件againPasswordLabel.setText("再次确认:");//设置字体的类型,加粗,和大小againPasswordLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小againPasswordLabel.setBounds(30,233,100,50);//文本框位置againPasswordTextField.setBounds(130,240,150,40);//文本框字体的大小againPasswordTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//登录按钮registerButton.setBounds(20,290,450,60);registerButton.setText("注册");registerButton.setFont(new Font("宋体",Font.BOLD,30));					}//绑定按钮public void buttonAction() {registerButton.addActionListener(this);	}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubJButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本if(buttonName.equals("注册")) {//System.out.println("我注册了");reginster();}}//注册用户public void reginster() {//获取文本框里面的数据name=userNameTextField.getText().trim().toString();sno=snoTextField.getText().trim().toString();phoneNumber=phoneNumberTextField.getText().trim().toString();password=passwordTextField.getText().trim().toString();againPassword=againPasswordTextField.getText().trim().toString();//其实判断都用正则表达式还是方便一点//判断用户名称是否规范/** if(judgeName(name)) {* * }*//** //判断用户学号是否规范 if(judgeSno(sno)) {* * }*///判断用户电话号码是否规范/** if(judgePhoneNumber(phoneNumber)) {* * }*///		 判断用户密码是否一致
//		 if(password.equals(againPassword)) {
//		  
//		 }else {
//			 warning("         两次用户密码输入不一致");
//		 }if(judgeName(name)){if(judgeSno(sno)) {if(judgePhoneNumber(phoneNumber)) {if(password.equals(againPassword)) {//虽然是插入到数据库里面,但是在程序里面也可以写一下Enter.list.add(new User(name,password,sno,phoneNumber));//准备好数据之后执行插入操作insert();this.setVisible(false);new Enter();}else {warning("         两次用户密码输入不一致");}}}}}//判断用户名是否已经存在public  boolean exisit(ArrayList<User> list, String name) {/*     for (int i = 0; i < list.size(); i++) {if (list.get(i).getUserName().equals(name)) {return true;}}return false;*/return getIndex(list,name)>=0;}//返回用户账号的索引public int getIndex(ArrayList<User>list,String name){for (int i = 0; i < list.size(); i++) {if(list.get(i).getUserName().equals(name)){return i;}}return -1;}//判定用户名是否符合规则,我把这个分成一个方法了,调用了judgeNameStandard//也是用来判断用户名规范的public boolean judgeName(String name) {//判定用户名if (name.length() >= 3 && name.length() <= 15) {if (judgeNameStandard(name)) //对用户名规范的判定if (exisit(Enter.list, name)) {//判定用户名是否已经存在warning("      用户名已存在,请重新输入");return false;} else {return true;}} else {warning("       待注册的用户名长度不合法");return false;}return true;}//判定用户名是否符合规范public boolean judgeNameStandard(String name) {int count = 0;for (int i = 0; i < name.length(); i++) {//判断当前字符是字母if ((name.charAt(i) >= 'a' && name.charAt(i) <= 'z') || (name.charAt(i) >= 'A' && name.charAt(i) <= 'Z')) {continue;} else {//判断当前字符是否是数字if (name.charAt(i) >= '0' && name.charAt(i) <= '9') {count++;} else {warning("  用户名存在字母和数字以外的字符");return false;}}}//用户名不能是纯数字if (count == name.length()) {warning("           用户名不能是纯数字");return false;}return true;}public boolean judgeSno(String sno){if(sno.matches("2[0-9]{11}")) {return true;}else {warning("               学号不符合规范");return false;}}//判断手机号码是否符合规范public boolean judgePhoneNumber(String number) {if (number.length() == 11) {if (number.charAt(0) != '0') {if (judgeDigit(number) && number.charAt(10) >= '0' && number.charAt(10) <= '9') {return true;} else {warning("       手机号码不是由纯数字构成");return false;}} else {warning("        手机号码不能以0为开头");return false;}} else {warning("           手机号码长度不为11");return false;}}//判定前length-1的字符是否都是数字public  boolean judgeDigit(String id) {//前length-1位必须都是数字for (int i = 0; i < id.length() - 1; i++) {if (id.charAt(i) >= '0' && id.charAt(i) <= '9') {continue;} else {return false;}}return true;}//输出警告弹窗public void warning(String str) {//添加一个弹窗的警告JDialog jDialog=new JDialog();//创建弹窗对象jDialog.setTitle("警告");//设置弹窗标题,和Frame差不多,可能还要通过标签来提示jDialog.setSize(500,400);//设置弹窗的大小jDialog.setAlwaysOnTop(true);//让弹窗置顶jDialog.setLocationRelativeTo(null);//让弹窗居中jDialog.setModal(true);//弹窗不关闭则无法操作下面的界面//设置字体的类型,加粗,和大小warningLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));//输出警告提示符warningLabel.setText(str);//标签的位置和大小warningLabel.setBounds(0,100,500,100);//这个也要取消布局管理器才行jDialog.getContentPane().setLayout(null);//往弹窗中添加标签jDialog.getContentPane().add(warningLabel);jDialog.setVisible(true);//让弹窗显示出来}//准备好数据之后执行插入操作public void insert() {//获取数据库连接,不然会报空指针异常conn=connection.getCon();try{//sname,password,sno,phoneNumber//定义插入数据预处理的SQL语句String sql="insert into users values(?,?,?,?)";//实例化PreparedStatement对象PreparedStatement ps=conn.prepareStatement(sql);//设置预处理语句参数ps.setString(1, name);ps.setString(2, password);ps.setString(3, sno);ps.setString(4, phoneNumber);//执行插入操作ps.executeUpdate();}catch(SQLException e) {//warning("该用户已经注册,请勿重复注册");e.printStackTrace();}}
}

忘记密码:

 

import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;public class ForgetPassword extends JFrame implements ActionListener {public static void main(String[] args) {new ForgetPassword();}//面板final JPanel panel=new JPanel();//创建教务管理系统标签final JLabel system=new JLabel();//创建用户名标签final JLabel userNameLabel=new JLabel();//创建用户名文本框final JTextField userNameTextField=new JTextField();//创建学号标签final JLabel snoLabel=new JLabel();//创建学号文本框final JTextField snoTextField=new JTextField();//创建手机号码标签final JLabel phoneNumberLabel=new JLabel();//创建手机号码文本框final JTextField phoneNumberTextField=new JTextField();//修改密码标签final JLabel passwordLabel=new JLabel();//修改密码文本框final JTextField passwordTextField=new JTextField();//创建再次输入密码标签final JLabel againPasswordLabel=new JLabel();//创建再次输入密码文本框final JTextField againPasswordTextField=new JTextField();//注册按钮final JButton registerButton=new JButton();//用户登录名String name="";//用户学号String sno="";//用户手机号码String phoneNumber="";//用户密码String password="";//用户再次确定密码String againPassword="";//警告标签,放在弹窗里面final JLabel warningLabel=new JLabel();//准备连接的对象GetConnection connection=new GetConnection();Connection conn=null;public ForgetPassword() {//初始化窗体initFrame();//初始化面板initPanel();//绑定监听事件buttonAction();//窗体可见,放最后吧,不然里面的东西不会显示呢this.setVisible(true);}public void initFrame() {//设置窗体的标题this.setTitle("忘记密码");//设置窗体大小不可改变this.setResizable(false);//设置界面置顶(就是页面不会别其他页面覆盖,界面始终在最上面)this.setAlwaysOnTop(true);//那还是改成setSize吧,设置窗体的大小就行了this.setSize(500,400);//居中this.setLocationRelativeTo(null);//设置窗体关闭按钮的动作作为退出this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//初始化面板public void initPanel() {initModule();//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了panel.setLayout(null);//添加相关的组件panel.add(system);panel.add(userNameLabel);panel.add(userNameTextField);panel.add(snoLabel);panel.add(snoTextField);panel.add(phoneNumberLabel);panel.add(phoneNumberTextField);panel.add(passwordLabel);panel.add(passwordTextField);panel.add(againPasswordLabel);panel.add(againPasswordTextField);panel.add(registerButton);this.setContentPane(panel);}//初始化组件public void initModule() {//初始化管理系统相关组件system.setText("学生管理系统");//设置字体的类型,加粗,和大小system.setFont(new Font("Microsoft YaHei",Font.BOLD,35));//标签的位置和大小system.setBounds(150,0,250,50);//初始化用户名相关的组件userNameLabel.setText("用户名:");//设置字体的类型,加粗,和大小userNameLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小userNameLabel.setBounds(30,55,100,50);//文本框位置userNameTextField.setBounds(130,60,150,40);//初始化学号相关的组件snoLabel.setText("学号:");//设置字体的类型,加粗,和大小snoLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小snoLabel.setBounds(30,100,100,50);//文本框位置snoTextField.setBounds(130,105,150,40);//初始化手机号码相关的组件phoneNumberLabel.setText("手机号码:");//设置字体的类型,加粗,和大小phoneNumberLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小phoneNumberLabel.setBounds(30,140,100,50);//文本框位置phoneNumberTextField.setBounds(130,150,150,40);//修改密码相关的组件passwordLabel.setText("新密码:");//设置字体的类型,加粗,和大小passwordLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小passwordLabel.setBounds(30,187,100,50);//文本框位置passwordTextField.setBounds(130,195,150,40);//初始化密码相关的组件againPasswordLabel.setText("再次确认:");//设置字体的类型,加粗,和大小againPasswordLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小againPasswordLabel.setBounds(30,233,100,50);//文本框位置againPasswordTextField.setBounds(130,240,150,40);//登录按钮registerButton.setBounds(20,290,450,60);registerButton.setText("修改密码");registerButton.setFont(new Font("宋体",Font.BOLD,30));					}//绑定按钮public void buttonAction() {registerButton.addActionListener(this);	}@Overridepublic void actionPerformed(ActionEvent e) {// TODO Auto-generated method stubJButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本if(buttonName.equals("修改密码")) {forgetPassword();}}public void forgetPassword() {//获取文本框里面的数据name=userNameTextField.getText().trim().toString();sno=snoTextField.getText().trim().toString();phoneNumber=phoneNumberTextField.getText().trim().toString();password=passwordTextField.getText().trim().toString();againPassword=againPasswordTextField.getText().trim().toString();if(exisit(Enter.list,name)) {int index=getIndex(Enter.list,name);User user=Enter.list.get(index);String sno1=user.getSno();String number=user.getPhoneNumber();//验证用户的身份信息if(sno1.equals(sno)&&number.equals(phoneNumber)) {if(password.equals(againPassword)) {//更新密码update();//更新数据库里面的密码user.setPassword(password);Enter.list.set(index, user);this.setVisible(false);new Enter();}else {warning("         两次用户密码输入不一致");}}else {warning("       账号信息不匹配,修改失败");}}else {warning("                  账号未注册");}}//判断用户名是否已经存在public  boolean exisit(ArrayList<User> list, String name) {/*     for (int i = 0; i < list.size(); i++) {if (list.get(i).getUserName().equals(name)) {return true;}}return false;*/return getIndex(list,name)>=0;}//返回用户账号的索引public int getIndex(ArrayList<User>list,String name){for (int i = 0; i < list.size(); i++) {if(list.get(i).getUserName().equals(name)){return i;}}return -1;}//输出警告弹窗public void warning(String str) {//添加一个弹窗的警告JDialog jDialog=new JDialog();//创建弹窗对象jDialog.setTitle("警告");//设置弹窗标题,和Frame差不多,可能还要通过标签来提示jDialog.setSize(500,400);//设置弹窗的大小jDialog.setAlwaysOnTop(true);//让弹窗置顶jDialog.setLocationRelativeTo(null);//让弹窗居中jDialog.setModal(true);//弹窗不关闭则无法操作下面的界面//设置字体的类型,加粗,和大小warningLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));//输出警告提示符warningLabel.setText(str);//标签的位置和大小warningLabel.setBounds(0,100,500,100);//这个也要取消布局管理器才行jDialog.getContentPane().setLayout(null);//往弹窗中添加标签jDialog.getContentPane().add(warningLabel);jDialog.setVisible(true);//让弹窗显示出来}public void update() {//获取数据库连接,不然会报空指针异常conn=connection.getCon();try{//sname,password,sno,phoneNumber//定义插入数据预处理的SQL语句String sql="update users set password=? where userName=?";//实例化PreparedStatement对象PreparedStatement ps=conn.prepareStatement(sql);//设置预处理语句参数ps.setString(1, password);ps.setString(2, name);//执行修改操作ps.executeUpdate();}catch(SQLException e) {e.printStackTrace();}}
}

学生类:

这个就和前面那个用户账号类一样了。

import java.net.InetAddress;
//student(sno,name,sex,age,id,phone,address)
//表格需要是二维数组,这个我不知道怎么弄,就把类型全部设置成string类型了
public class Student {private String sno;//学号private String name;//姓名private String sex;//性别private String age;//年龄private String id;//身份证号码private String phoneNumber;//手机号码private String address;//家庭住址public Student(String sno, String name, String sex, String age, String id, String phoneNumber, String address) {this.sno = sno;this.name = name;this.sex = sex;this.age = age;this.id = id;this.phoneNumber = phoneNumber;this.address = address;}public Student() {}public String getSno() {return sno;}public void setSno(String sno) {this.sno = sno;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAge() {return age;}public void setAge(String age) {this.age = age;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getPhoneNumber() {return phoneNumber;}public void setPhoneNumber(String phoneNumber) {this.phoneNumber = phoneNumber;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
}

增:

Java GUI编程11---单选按钮:JRadioButton_蓝蓝223的博客-CSDN博客icon-default.png?t=N5F7https://blog.csdn.net/qq_21808961/article/details/80765423

 

import com.sun.tools.javac.Main;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.ArrayList;public class AddFrame extends JFrame implements ActionListener, ItemListener {//主方法public static void main(String[] args) {new AddFrame();}//面板final JPanel panel=new JPanel();//创建学生管理系统标签final JLabel system=new JLabel();//创建学号标签final JLabel snoLabel=new JLabel();//创建学号文本框final JTextField snoTextField=new JTextField();//创建学生姓名标签final JLabel nameLabel=new JLabel();//创建学生姓名文本框final JTextField nameTextField=new JTextField();//创建性别标签final JLabel sexLabel=new JLabel();//创建性别文本框//final JTextField sexTextField=new JTextField();//性别文本框改成单选按钮//创建按钮组对象final ButtonGroup buttonGroup=new ButtonGroup();//创建单选按钮对象final JRadioButton manRadioButton=new JRadioButton();final JRadioButton womanRadioButton=new JRadioButton();//创建年龄标签final JLabel ageLabel=new JLabel();//创建年龄文本框final JTextField ageTextField=new JTextField();//创建身份证号码标签final JLabel idLabel=new JLabel();//创建身份证号码文本框final JTextField idTextField=new JTextField();//创建手机号码标签final JLabel phoneNumberLabel=new JLabel();//创建手机号码文本框final JTextField phoneNumbeTextField=new JTextField();//创建家庭住址标签final JLabel addressLabel=new JLabel();//创建家庭住址文本框final JTextField addressTextField=new JTextField();//添加按钮final JButton addButton=new JButton();//保存文本框中的相关数据String name="";String age="";//真的麻烦了不是一点,要按下单选按钮才会有值,所以就先给他赋一个初值吧String sex="男";String sno="";String id="";String number="";String address="";//准备连接的对象GetConnection connection=new GetConnection();Connection conn=null;public AddFrame(){//初始化窗体initFrame();//初始化面板initPanel();//绑定监听事件buttonAction();//窗体可见,放最后吧,不然里面的东西不会显示呢this.setVisible(true);}public void initFrame() {//设置窗体的标题this.setTitle("添加学生信息");//设置窗体大小不可改变this.setResizable(false);//设置界面置顶(就是页面不会别其他页面覆盖,界面始终在最上面)this.setAlwaysOnTop(true);//那还是改成setSize吧,设置窗体的大小就行了this.setSize(500,400);//居中this.setLocationRelativeTo(null);//设置窗体关闭按钮的动作作为退出this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//初始化面板public void initPanel() {initModule();//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了panel.setLayout(null);//添加相关的组件panel.add(system);panel.add(snoLabel);panel.add(snoTextField);panel.add(nameLabel);panel.add(nameTextField);panel.add(sexLabel);panel.add(manRadioButton);panel.add(womanRadioButton);panel.add(ageLabel);panel.add(ageTextField);panel.add(idLabel);panel.add(idTextField);panel.add(phoneNumberLabel);panel.add(phoneNumbeTextField);panel.add(addressLabel);panel.add(addressTextField);panel.add(addButton);this.setContentPane(panel);}//初始化组件public void initModule() {//初始化管理系统相关组件system.setText("学生管理系统");//设置字体的类型,加粗,和大小system.setFont(new Font("Microsoft YaHei",Font.BOLD,35));//标签的位置和大小system.setBounds(150,0,250,50);//初始化学号相关的组件snoLabel.setText("学号:");//设置字体的类型,加粗,和大小snoLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小snoLabel.setBounds(30,150,100,50);//文本框位置snoTextField.setBounds(120,155,150,40);//文本框字体大小snoTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,15));//初始化姓名相关的组件nameLabel.setText("姓名:");//设置字体的类型,加粗,和大小nameLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小nameLabel.setBounds(30,50,100,50);//文本框位置nameTextField.setBounds(120,55,150,40);//文本框字体大小nameTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,15));//初始化性别相关的组件sexLabel.setText("性别:");//设置字体的类型,加粗,和大小sexLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小sexLabel.setBounds(280,50,100,50);//性别按钮组buttonGroup.add(manRadioButton);//将单选按钮添加到按钮组中buttonGroup.add(womanRadioButton);//将单选按钮添加到按钮组中manRadioButton.setText("男");//设置单选按钮的文本womanRadioButton.setText("女");//设置单选按钮的文本manRadioButton.setSelected(true);//将单选按钮默认认为被选中manRadioButton.setBounds(340,50,50,50);//设置单选按钮的位置womanRadioButton.setBounds(390,50,50,50);//设置单选按钮的位置//初始化年龄相关的组件ageLabel.setText("年龄:");//设置字体的类型,加粗,和大小ageLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小ageLabel.setBounds(30,100,100,50);//文本框位置ageTextField.setBounds(120,105,150,40);//文本框字体大小ageTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,15));//初始化身份证号码相关的组件idLabel.setText("身份证号码:");//设置字体的类型,加粗,和大小idLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小idLabel.setBounds(5,200,110,50);//文本框位置idTextField.setBounds(120,205,150,40);//初始化手机号码相关的组件phoneNumberLabel.setText("手机号码:");//设置字体的类型,加粗,和大小phoneNumberLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小phoneNumberLabel.setBounds(15,250,110,50);//文本框位置phoneNumbeTextField.setBounds(120,255,150,40);//文本框字体大小phoneNumbeTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,15));//初始化家庭住址相关的组件addressLabel.setText("家庭住址:");//设置字体的类型,加粗,和大小addressLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小addressLabel.setBounds(15,295,110,50);//文本框位置addressTextField.setBounds(120,300,150,40);//添加按钮addButton.setBounds(300,280,170,60);addButton.setText("添加数据");addButton.setFont(new Font("宋体",Font.BOLD,30));}//绑定按钮(还要单选框的)public void buttonAction() {addButton.addActionListener(this);manRadioButton.addItemListener(this);womanRadioButton.addItemListener(this);}@Overridepublic void actionPerformed(ActionEvent e) {JButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本if(buttonName.equals("添加数据")){//System.out.println("我添加了数据");verify();}}/*//输出警告弹窗public void warning(String str) {//添加一个弹窗的警告JDialog jDialog=new JDialog();//创建弹窗对象jDialog.setTitle("警告");//设置弹窗标题,和Frame差不多,可能还要通过标签来提示jDialog.setSize(500,400);//设置弹窗的大小jDialog.setAlwaysOnTop(true);//让弹窗置顶jDialog.setLocationRelativeTo(null);//让弹窗居中jDialog.setModal(true);//弹窗不关闭则无法操作下面的界面//警告标签,放在弹窗里面final JLabel warningLabel=new JLabel(str,JLabel.CENTER);//设置字体的类型,加粗,和大小warningLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));//标签的位置和大小warningLabel.setBounds(0,100,500,100);//这个也要取消布局管理器才行//jDialog.getContentPane().setLayout(null);//往弹窗中添加标签(垂直加居中放置标签)jDialog.getContentPane().add(warningLabel,BorderLayout.CENTER);jDialog.setVisible(true);//让弹窗显示出来}*///添加学生信息验证public void verify(){//等一下要判断是否规范,所以需要用trim去除字符串前面的空白字符name=nameTextField.getText().trim().toString();age=ageTextField.getText().trim().toString();sno=snoTextField.getText().trim().toString();id=idTextField.getText().trim().toString();number=phoneNumbeTextField.getText().trim().toString();address=addressTextField.getText().trim().toString();try {//System.out.println(name+" "+age+" "+sex+" "+sno+" "+id+" "+number+" "+address);//if(judegeSno(sno)){}//if(judgeName(name)){}//性别用到是单选框也不需要判断//if(judgeSex(sex)){}//if(judgeAge(age)){}//if(judgeId(id)){}//if(judgeNumber(number)){}//依次判断选项是否合法规范if(judegeSno(sno)){if(judgeName(name)){if (judgeAge(age)){if (judgeId(id)){if (judgeNumber(number)){if (judgeAddress(address)){//插入数据insert();//数据库的数据插入MainFrame.list.add(new Student(sno,name,sex,age,id,number,address));System.out.println("添加成功");this.setVisible(false);//窗口不显示new MainFrame();//回到主窗口}}}}}}}catch (Exception e){MainFrame.warning("您没有输入数据,或者输入违法");e.printStackTrace();}}//获取单选按钮中对应的值@Overridepublic void itemStateChanged(ItemEvent e) {//虽然只有男女两个选项,但是我还是加上了else if的判断if(e.getSource()==manRadioButton){sex="男";}else if(e.getSource()==womanRadioButton) {sex="女";}}//判断学号是否符合规范以及是否存在public boolean judegeSno(String sno){if(!MainFrame.exisit(sno)){if(sno.matches("2[0-9]{11}")){return true;}else{MainFrame.warning("学号不符合规范");return false;}}else{MainFrame.warning("学号已经存在");return false;}}//判断姓名是否符合规范public boolean judgeName(String name){if (name.matches("^(?:[\u4e00-\u9fa5·]{2,16})$")){return true;}else{MainFrame.warning("姓名不符合规范");return false;}}//判断年龄是否符合规范public boolean judgeAge(String age){if(age.matches("[0-9]*")){int digit=Integer.valueOf(age);if(digit>=0){return true;}else{MainFrame.warning("年龄不能为负");return false;}}else{MainFrame.warning("年龄不符合规范");return false;}}//判断身份证号码是否规范public boolean judgeId(String id){if(id.matches("^[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0\\d|10|11|12)(?:0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]$")){return true;}else{MainFrame.warning("身份证号码不符合规范");return false;}}//判断手机号码是否符合规范public boolean judgeNumber(String number){if(number.matches("^(?:(?:\\+|00)86)?1[3-9]\\d{9}$")){return true;}else {MainFrame.warning("手机号码不符合规范");return false;}}//判断是否有住址,这个不太好判断,我这里是有就行public boolean judgeAddress(String address){if(address.length()!=0){return true;}return false;}//这里判断是否存在,在自己这里不知道为什么判断不成功/*//返回学生账号的索引(学号是主键)public int getIndex(String sno){//查找是否存在学号相同的人for (int i = 0; i < MainFrame.list.size(); i++) {if(MainFrame.list.get(i).getSno().equals(sno)){return i;}}//查看集合有没有数据System.out.println(MainFrame.list.size());return -1;}//判断学生账号是否已经存在public boolean exisit(String sno){//存在的话返回的索引为大于0的数return getIndex(sno)>=0;}*///准备好数据之后执行插入操作public void insert() {//获取数据库连接,不然会报空指针异常conn=connection.getCon();try{//sno,name,sex,age,id,number,address//定义插入数据预处理的SQL语句String sql="insert into Student values(?,?,?,?,?,?,?)";//实例化PreparedStatement对象PreparedStatement ps=conn.prepareStatement(sql);//设置预处理语句参数ps.setString(1, sno);ps.setString(2, name);ps.setString(3, sex);ps.setString(4, age);ps.setString(5, id);ps.setString(6, number);ps.setString(7, address);//执行插入操作ps.executeUpdate();}catch(SQLException e) {MainFrame.warning("该用户已经已经添加");e.printStackTrace();}}
}

删:

 

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class DeleteFrame extends JFrame implements ActionListener {//主方法public static void main(String[] args) {new DeleteFrame();}//面板final JPanel panel=new JPanel();//创建学生管理系统标签final JLabel system=new JLabel();//创建学号标签final JLabel snoLabel=new JLabel();//创建学号文本框final JTextField snoTextField=new JTextField();//添加删除按钮final JButton deleteButton=new JButton();//保存文本框中的数据String sno="";//准备连接的对象GetConnection connection=new GetConnection();Connection conn=null;public DeleteFrame(){//初始化窗体initFrame();//初始化面板initPanel();//绑定监听事件buttonAction();//窗体可见,放最后吧,不然里面的东西不会显示呢this.setVisible(true);}public void initFrame() {//设置窗体的标题this.setTitle("删除学生信息");//设置窗体大小不可改变this.setResizable(false);//设置界面置顶(就是页面不会别其他页面覆盖,界面始终在最上面)this.setAlwaysOnTop(true);//那还是改成setSize吧,设置窗体的大小就行了this.setSize(500,400);//居中this.setLocationRelativeTo(null);//设置窗体关闭按钮的动作作为退出this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//初始化面板public void initPanel() {initModule();//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了panel.setLayout(null);//添加相关的组件panel.add(system);panel.add(snoLabel);panel.add(snoTextField);panel.add(deleteButton);this.setContentPane(panel);}//初始化组件public void initModule() {//初始化管理系统相关组件system.setText("学生管理系统");//设置字体的类型,加粗,和大小system.setFont(new Font("Microsoft YaHei",Font.BOLD,35));//标签的位置和大小system.setBounds(150,0,250,50);//初始化学号相关的组件snoLabel.setText("学号:");//设置字体的类型,加粗,和大小snoLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,50));//标签的位置和大小snoLabel.setBounds(30,135,130,60);//文本框位置snoTextField.setBounds(170,135,240,70);snoTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,30));//删除按钮deleteButton.setBounds(300,280,170,60);deleteButton.setText("删除数据");deleteButton.setFont(new Font("宋体",Font.BOLD,30));}//绑定按钮public void buttonAction() {deleteButton.addActionListener(this);}@Overridepublic void actionPerformed(ActionEvent e) {JButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本if(buttonName.equals("删除数据")){//System.out.println("我删除了数据");verify();}}//删除学生信息验证public void verify() {sno=snoTextField.getText().trim().toString();try {if(judegeSno(sno)){//1.获取到已经存在的学号学生的信息int index=MainFrame.getIndex(sno);//2.删除指定索引的对象//删除数据库中的数据delete();MainFrame.list.remove(index);System.out.println("删除成功");this.setVisible(false);//窗口不显示new MainFrame();//回到主窗口}}catch (Exception e){e.printStackTrace();}}//判断学号是否符合规范以及是否存在public boolean judegeSno(String sno){if(sno.matches("2[0-9]{11}")){//存在才能删除if(MainFrame.exisit(sno)){return true;}else {MainFrame.warning("该学号未录入系统");return false;}}else{MainFrame.warning("学号不符合规范");return false;}}//删除已经存在的用户public void delete() {//获取数据库连接,不然会报空指针异常conn=connection.getCon();try{//sno,name,sex,age,id,number,address//定义插入数据预处理的SQL语句String sql="delete from Student where sno=?";//实例化PreparedStatement对象PreparedStatement ps=conn.prepareStatement(sql);//设置预处理语句参数ps.setString(1, sno);//执行删除操作ps.executeUpdate();}catch(SQLException e) {//warning("该用户已经删除,请勿重复注册");e.printStackTrace();}}
}

改:

 

import com.sun.tools.javac.Main;import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class AlterFrame extends JFrame implements ActionListener, ItemListener {//主方法public static void main(String[] args) {new AlterFrame();}//面板final JPanel panel=new JPanel();//创建学生管理系统标签final JLabel system=new JLabel();//创建学号标签final JLabel snoLabel=new JLabel();//创建学号文本框final JTextField snoTextField=new JTextField();//创建学生姓名标签final JLabel nameLabel=new JLabel();//创建学生姓名文本框final JTextField nameTextField=new JTextField();//创建性别标签final JLabel sexLabel=new JLabel();//创建性别文本框//final JTextField sexTextField=new JTextField();//性别文本框改成单选按钮//创建按钮组对象final ButtonGroup buttonGroup=new ButtonGroup();//创建单选按钮对象final JRadioButton manRadioButton=new JRadioButton();final JRadioButton womanRadioButton=new JRadioButton();//创建年龄标签final JLabel ageLabel=new JLabel();//创建年龄文本框final JTextField ageTextField=new JTextField();//创建身份证号码标签final JLabel idLabel=new JLabel();//创建身份证号码文本框final JTextField idTextField=new JTextField();//创建手机号码标签final JLabel phoneNumberLabel=new JLabel();//创建手机号码文本框final JTextField phoneNumbeTextField=new JTextField();//创建家庭住址标签final JLabel addressLabel=new JLabel();//创建家庭住址文本框final JTextField addressTextField=new JTextField();//修改按钮final JButton alterButton=new JButton();//保存文本框中的相关数据String name="";String age="";//真的麻烦了不是一点,要按下单选按钮才会有值,所以就先给他赋一个初值吧String sex="男";String sno="";String id="";String number="";String address="";//准备连接的对象GetConnection connection=new GetConnection();Connection conn=null;public AlterFrame(){//初始化窗体initFrame();//初始化面板initPanel();//绑定监听事件buttonAction();//窗体可见,放最后吧,不然里面的东西不会显示呢this.setVisible(true);}public void initFrame() {//设置窗体的标题this.setTitle("修改学生信息");//设置窗体大小不可改变this.setResizable(false);//设置界面置顶(就是页面不会别其他页面覆盖,界面始终在最上面)this.setAlwaysOnTop(true);//那还是改成setSize吧,设置窗体的大小就行了this.setSize(500,400);//居中this.setLocationRelativeTo(null);//设置窗体关闭按钮的动作作为退出this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//初始化面板public void initPanel() {initModule();//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了panel.setLayout(null);//添加相关的组件panel.add(system);panel.add(snoLabel);panel.add(snoTextField);panel.add(nameLabel);panel.add(nameTextField);panel.add(sexLabel);panel.add(manRadioButton);panel.add(womanRadioButton);panel.add(ageLabel);panel.add(ageTextField);panel.add(idLabel);panel.add(idTextField);panel.add(phoneNumberLabel);panel.add(phoneNumbeTextField);panel.add(addressLabel);panel.add(addressTextField);panel.add(alterButton);this.setContentPane(panel);}//初始化组件public void initModule() {//初始化管理系统相关组件system.setText("学生管理系统");//设置字体的类型,加粗,和大小system.setFont(new Font("Microsoft YaHei",Font.BOLD,35));//标签的位置和大小system.setBounds(150,0,250,50);//初始化学号相关的组件snoLabel.setText("学号:");//设置字体的类型,加粗,和大小snoLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小snoLabel.setBounds(30,150,100,50);//文本框位置snoTextField.setBounds(120,155,150,40);//文本框字体大小snoTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,15));//初始化姓名相关的组件nameLabel.setText("姓名:");//设置字体的类型,加粗,和大小nameLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小nameLabel.setBounds(30,50,100,50);//文本框位置nameTextField.setBounds(120,55,150,40);//文本框字体大小nameTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,15));//初始化性别相关的组件sexLabel.setText("性别:");//设置字体的类型,加粗,和大小sexLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小sexLabel.setBounds(280,50,100,50);//性别按钮组buttonGroup.add(manRadioButton);//将单选按钮添加到按钮组中buttonGroup.add(womanRadioButton);//将单选按钮添加到按钮组中manRadioButton.setText("男");//设置单选按钮的文本womanRadioButton.setText("女");//设置单选按钮的文本manRadioButton.setSelected(true);//将单选按钮默认认为被选中manRadioButton.setBounds(340,50,50,50);//设置单选按钮的位置womanRadioButton.setBounds(390,50,50,50);//设置单选按钮的位置//初始化年龄相关的组件ageLabel.setText("年龄:");//设置字体的类型,加粗,和大小ageLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小ageLabel.setBounds(30,100,100,50);//文本框位置ageTextField.setBounds(120,105,150,40);//文本框字体大小ageTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,15));//初始化身份证号码相关的组件idLabel.setText("身份证号码:");//设置字体的类型,加粗,和大小idLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小idLabel.setBounds(5,200,110,50);//文本框位置idTextField.setBounds(120,205,150,40);//初始化手机号码相关的组件phoneNumberLabel.setText("手机号码:");//设置字体的类型,加粗,和大小phoneNumberLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小phoneNumberLabel.setBounds(15,250,110,50);//文本框位置phoneNumbeTextField.setBounds(120,255,150,40);//文本框字体大小phoneNumbeTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,15));//初始化家庭住址相关的组件addressLabel.setText("家庭住址:");//设置字体的类型,加粗,和大小addressLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,20));//标签的位置和大小addressLabel.setBounds(15,295,110,50);//文本框位置addressTextField.setBounds(120,300,150,40);//添加按钮alterButton.setBounds(300,280,170,60);alterButton.setText("修改数据");alterButton.setFont(new Font("宋体",Font.BOLD,30));}//绑定按钮public void buttonAction() {alterButton.addActionListener(this); //没绑定的话性别就修改不了了manRadioButton.addItemListener(this);womanRadioButton.addItemListener(this);}@Overridepublic void actionPerformed(ActionEvent e) {JButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本if(buttonName.equals("修改数据")){//System.out.println("我添加了数据");verify();}}//修改学生信息判断public void verify(){//等一下要判断是否规范,所以需要用trim去除字符串前面的空白字符name=nameTextField.getText().trim().toString();age=ageTextField.getText().trim().toString();sno=snoTextField.getText().trim().toString();id=idTextField.getText().trim().toString();number=phoneNumbeTextField.getText().trim().toString();address=addressTextField.getText().trim().toString();try {if(judegeSno(sno)){if(judgeName(name)){if (judgeAge(age)){if (judgeId(id)){if (judgeNumber(number)){if (judgeAddress(address)){//修改数据//修改数据库update();//1.获取到已经存在的学号学生的信息int index=MainFrame.getIndex(sno);Student student=MainFrame.list.get(index);//2.修改信息student.setName(name);//更新姓名student.setAge(age);//更新年龄student.setSex(sex);//更新性别student.setId(id);//更新身份证号码student.setId(number);//更新手机号码student.setAddress(address);//更新家庭住址//3.填入集合中MainFrame.list.set(index,student);System.out.println("修改成功");this.setVisible(false);//窗口不显示new MainFrame();//回到主窗口}}}}}}}catch (Exception e){MainFrame.warning("您没有输入数据,或者输入违法");e.printStackTrace();}}//获取单选按钮中对应的值@Overridepublic void itemStateChanged(ItemEvent e) {//虽然只有男女两个选项,但是我还是加上了else if的判断if(e.getSource()==manRadioButton){sex="男";}else if(e.getSource()==womanRadioButton) {sex="女";}}//判断学号是否符合规范以及是否存在public boolean judegeSno(String sno){if(sno.matches("2[0-9]{11}")){//存在才能修改if(MainFrame.exisit(sno)){return true;}else {MainFrame.warning("该学号未录入系统");return false;}}else{MainFrame.warning("学号不符合规范");return false;}}//判断姓名是否符合规范public boolean judgeName(String name){if (name.matches("^(?:[\u4e00-\u9fa5·]{2,16})$")){return true;}else{MainFrame.warning("姓名不符合规范");return false;}}//判断年龄是否符合规范public boolean judgeAge(String age){if(age.matches("[0-9]*")){int digit=Integer.valueOf(age);if(digit>=0){return true;}else{MainFrame.warning("年龄不能为负");return false;}}else{MainFrame.warning("年龄不符合规范");return false;}}//判断身份证号码是否规范public boolean judgeId(String id){if(id.matches("^[1-9]\\d{5}(?:18|19|20)\\d{2}(?:0\\d|10|11|12)(?:0[1-9]|[1-2]\\d|30|31)\\d{3}[\\dXx]$")){return true;}else{MainFrame.warning("身份证号码不符合规范");return false;}}//判断手机号码是否符合规范public boolean judgeNumber(String number){if(number.matches("^(?:(?:\\+|00)86)?1[3-9]\\d{9}$")){return true;}else {MainFrame.warning("手机号码不符合规范");return false;}}//判断是否有住址,这个不太好判断,我这里是有就行public boolean judgeAddress(String address){if(address.length()!=0){return true;}return false;}//准备好数据之后执行修改操作public void update() {//获取数据库连接,不然会报空指针异常conn=connection.getCon();try{//sno,name,sex,age,id,number,address//定义修改数据预处理的SQL语句String sql="update Student set name=?,sex=?,age=?,id=?,phoneNumber=?,address=? where sno=?";//实例化PreparedStatement对象PreparedStatement ps=conn.prepareStatement(sql);//设置预处理语句参数ps.setString(1, name);ps.setString(2, sex);ps.setString(3, age);ps.setString(4, id);ps.setString(5, number);ps.setString(6, address);ps.setString(7, sno);//执行修改操作ps.executeUpdate();}catch(SQLException e) {MainFrame.warning("该用户已经已经添加");e.printStackTrace();}}
}

查:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class SelectFrame extends JFrame implements ActionListener {//主方法public static void main(String[] args) {new SelectFrame();}//面板final JPanel panel=new JPanel();//创建学生管理系统标签final JLabel system=new JLabel();//创建学号标签final JLabel snoLabel=new JLabel();//创建学号文本框final JTextField snoTextField=new JTextField();//添加查询按钮final JButton selectButton=new JButton();//添加查询所有按钮final JButton selectAllButton=new JButton();//保存文本框中的数据String sno="";//准备连接的对象GetConnection connection=new GetConnection();Connection conn=null;//定义表格列名数组(表头)final String[] columnNames={"学号","姓名","性别","年龄","身份证号码","电话号码","家庭住址"};//创建显示表格的滚动面板//单项查询的结果static String [][]tableValue=new String[1][7];public SelectFrame(){//初始化窗体initFrame();//初始化面板initPanel();//绑定监听事件buttonAction();//窗体可见,放最后吧,不然里面的东西不会显示呢this.setVisible(true);}public void initFrame() {//设置窗体的标题this.setTitle("查询学生信息");//设置窗体大小不可改变this.setResizable(false);//设置界面置顶(就是页面不会别其他页面覆盖,界面始终在最上面)this.setAlwaysOnTop(true);//那还是改成setSize吧,设置窗体的大小就行了this.setSize(500,400);//居中this.setLocationRelativeTo(null);//设置窗体关闭按钮的动作作为退出this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}//初始化面板public void initPanel() {initModule();//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了panel.setLayout(null);//添加相关的组件panel.add(system);panel.add(snoLabel);panel.add(snoTextField);panel.add(selectButton);panel.add(selectAllButton);this.setContentPane(panel);}//初始化组件public void initModule() {//初始化管理系统相关组件system.setText("学生管理系统");//设置字体的类型,加粗,和大小system.setFont(new Font("Microsoft YaHei",Font.BOLD,35));//标签的位置和大小system.setBounds(150,0,250,50);//初始化学号相关的组件snoLabel.setText("学号:");//设置字体的类型,加粗,和大小snoLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,50));//标签的位置和大小snoLabel.setBounds(30,135,130,60);//文本框位置snoTextField.setBounds(170,135,240,70);snoTextField.setFont(new Font("Microsoft YaHei",Font.BOLD,30));//查询按钮selectButton.setBounds(30,280,170,60);selectButton.setText("查询数据");selectButton.setFont(new Font("宋体",Font.BOLD,30));selectAllButton.setBounds(300,280,170,60);selectAllButton.setText("查询所有");selectAllButton.setFont(new Font("宋体",Font.BOLD,30));}//绑定按钮public void buttonAction() {selectButton.addActionListener(this);selectAllButton.addActionListener(this);}@Overridepublic void actionPerformed(ActionEvent e) {JButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本if(buttonName.equals("查询数据")){//System.out.println("我查询了数据");verify();}else if(buttonName.equals("查询所有")){//重新打印即可this.setVisible(false);//窗口不显示new MainFrame();//回到主窗口}}//查询学生信息验证public void verify() {sno=snoTextField.getText().trim().toString();try {if(judegeSno(sno)){//1.获取到已经存在的学号学生的信息int index=MainFrame.getIndex(sno);//执行查询数据库的语句select();System.out.println("查询成功");this.setVisible(false);//窗口不显示//new MainFrame();//回到主窗口new TmpFrame();//回到一个类似主窗口的东西}}catch (Exception e){e.printStackTrace();}}public boolean judegeSno(String sno){if(sno.matches("2[0-9]{11}")){//存在才能查询if(MainFrame.exisit(sno)){return true;}else {MainFrame.warning("该学号未录入系统");return false;}}else{MainFrame.warning("学号不符合规范");return false;}}//查询已经存在的用户,避免重复插入,在程序初始化的时候调用public void select() {//获取数据库连接,不然会报空指针异常conn=connection.getCon();try{//sno,name,sex,age,id,number,address//定义查询数据预处理的SQL语句String sql="select * from student where sno=?";//实例化PreparedStatement对象PreparedStatement ps=conn.prepareStatement(sql);//设置预处理语句参数ps.setString(1, sno);//执行查询操作ResultSet rs=ps.executeQuery();//获取数据while(rs.next()) {tableValue[0][0]=rs.getString(1);tableValue[0][1]=rs.getString(2);tableValue[0][2]=rs.getString(3);tableValue[0][3]=rs.getString(4);tableValue[0][4]=rs.getString(5);tableValue[0][5]=rs.getString(6);tableValue[0][6]=rs.getString(7);//System.out.println(name+" "+password+" "+sno+" "+phone+" ");}	}catch(SQLException e) {e.printStackTrace();}}
}

 主界面:

Java创建表格_无名氏*的博客-CSDN博客icon-default.png?t=N5F7https://blog.csdn.net/qq_44848423/article/details/103539286

 

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;public class MainFrame extends JFrame implements ActionListener {//主方法public static void main(String[] args) {new MainFrame();}//面板final JPanel panel=new JPanel();//创建学生管理系统标签final JLabel system=new JLabel();//定义表格列名数组final String[] columnNames={"学号","姓名","性别","年龄","身份证号码","电话号码","家庭住址"};//创建显示表格的滚动面板JScrollPane scrollPane=new JScrollPane();//创建表格类型JTable table=new JTable();//添加按钮final JButton addButton=new JButton();//添加删除按钮final JButton deleteButton=new JButton();//修改按钮final JButton alterButton=new JButton();//添加删除按钮final JButton selectButton=new JButton();//创建学生对象Student s=new Student();//储存学生的信息,所以我把他设置成静态的了,这样在其他类里面也可以用static ArrayList<Student>list=new ArrayList<>();//准备连接的对象GetConnection connection=new GetConnection();Connection conn=null;public MainFrame(){//初始化窗体initFrame();//初始化面板initPanel();//绑定监听事件buttonAction();//窗体可见,放最后吧,不然里面的东西不会显示呢this.setVisible(true);}public void initFrame() {//设置窗体的标题this.setTitle("主界面");//设置窗体大小不可改变this.setResizable(false);//设置界面置顶(就是页面不会别其他页面覆盖,界面始终在最上面)this.setAlwaysOnTop(true);//那还是改成setSize吧,设置窗体的大小就行了this.setSize(1000,800);//居中this.setLocationRelativeTo(null);//设置窗体关闭按钮的动作作为退出this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//显示滚动条}//初始化面板public void initPanel() {initModule();//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了panel.setLayout(null);//添加相关的组件panel.add(system);//添加增删改查按钮panel.add(addButton);panel.add(deleteButton);panel.add(alterButton);panel.add(selectButton);//将滚动面板添加到布局的中间panel.add(scrollPane);this.setContentPane(panel);}//初始化组件public void initModule() {//每一次打印都需要清除之前的信息list.clear();//获取数据库中的数据select();//1.创建表格this.table=new JTable();//2.获取表格的数据模型DefaultTableModel model=(DefaultTableModel)this.table.getModel();//3.对表格的数据模型操作model.setColumnIdentifiers(columnNames);//设置表头//表格信息String [][]tableValues=new String[list.size()][columnNames.length];//表表格里面的数据存到数组里面for (int i = 0; i < list.size(); i++) {tableValues[i][0]=list.get(i).getSno();tableValues[i][1]=list.get(i).getName();tableValues[i][2]=list.get(i).getSex();tableValues[i][3]=list.get(i).getAge();tableValues[i][4]=list.get(i).getId();tableValues[i][5]=list.get(i).getPhoneNumber();tableValues[i][6]=list.get(i).getAddress();model.addRow(tableValues[i]);//增加行,不要写成addColumn,我就说怎么不一样}//按照比例调整表格所以列的宽度(书本245页)完全没效果//this.table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);//用这个可以,调节每一列this.table.getColumnModel().getColumn(0).setPreferredWidth(50);//学号this.table.getColumnModel().getColumn(1).setPreferredWidth(10);//姓名this.table.getColumnModel().getColumn(2).setPreferredWidth(5);//性别this.table.getColumnModel().getColumn(3).setPreferredWidth(5);//年龄this.table.getColumnModel().getColumn(4).setPreferredWidth(80);//身份证号码this.table.getColumnModel().getColumn(5).setPreferredWidth(50);//电话号码this.table.getColumnModel().getColumn(6).setPreferredWidth(100);//家庭住址//4.更新表格模型this.table.setModel(model);//5.为JScrollPane面板设置一个可视化图表scrollPane.setViewportView(this.table);//6.将表格组件添加到JScrollPane面板上//设置滚动条的大小(不然太大了,滚动条不会显示)scrollPane.setBounds(100,100,800,400);//初始化管理系统相关组件system.setText("学生管理系统");//设置字体的类型,加粗,和大小system.setFont(new Font("Microsoft YaHei",Font.BOLD,35));//标签的大小和高度system.setBounds(400,0,400,100);//添加按钮addButton.setBounds(50,600,150,60);addButton.setText("添加");addButton.setFont(new Font("宋体",Font.BOLD,30));//删除按钮deleteButton.setText("删除");deleteButton.setBounds(285,600,150,60);deleteButton.setFont(new Font("宋体",Font.BOLD,30));//修改按钮alterButton.setText("修改");alterButton.setBounds(550,600,150,60);alterButton.setFont(new Font("宋体",Font.BOLD,30));//查找按钮selectButton.setText("查找");selectButton.setBounds(800,600,150,60);selectButton.setFont(new Font("宋体",Font.BOLD,30));}//绑定按钮public void buttonAction() {addButton.addActionListener(this);deleteButton.addActionListener(this);alterButton.addActionListener(this);selectButton.addActionListener(this);}@Overridepublic void actionPerformed(ActionEvent e) {JButton button =(JButton)e.getSource();//获得触发此次动作事件的按钮对象String buttonName =e.getActionCommand();//获得触发此次动作事件的按钮的标签文本if(buttonName.equals("添加")){this.setVisible(false);new AddFrame();System.out.println("我被添加了");}else if(buttonName.equals("删除")){this.setVisible(false);new DeleteFrame();System.out.println("我被删除了");}else if(buttonName.equals("修改")){this.setVisible(false);new AlterFrame();System.out.println("我被修改了");}else if (buttonName.equals("查找")){this.setVisible(false);new SelectFrame();System.out.println("我被查找了");}}//输出警告弹窗static public void warning(String str) {//添加一个弹窗的警告JDialog jDialog=new JDialog();//创建弹窗对象jDialog.setTitle("警告");//设置弹窗标题,和Frame差不多,可能还要通过标签来提示jDialog.setSize(500,400);//设置弹窗的大小jDialog.setAlwaysOnTop(true);//让弹窗置顶jDialog.setLocationRelativeTo(null);//让弹窗居中jDialog.setModal(true);//弹窗不关闭则无法操作下面的界面//警告标签,放在弹窗里面final JLabel warningLabel=new JLabel(str,JLabel.CENTER);//设置字体的类型,加粗,和大小warningLabel.setFont(new Font("Microsoft YaHei",Font.BOLD,30));//标签的位置和大小warningLabel.setBounds(0,100,500,100);//这个也要取消布局管理器才行//jDialog.getContentPane().setLayout(null);//往弹窗中添加标签(垂直加居中放置标签)jDialog.getContentPane().add(warningLabel,BorderLayout.CENTER);jDialog.setVisible(true);//让弹窗显示出来}//返回学生账号集合的索引(学号是主键)static public int getIndex(String sno){//查找是否存在学号相同的人for (int i = 0; i < list.size(); i++) {if(list.get(i).getSno().equals(sno)){return i;}}//查看集合有没有数据//System.out.println(list.size());return -1;}//判断学生账号是否已经存在static public boolean exisit(String sno){//存在的话返回的索引为大于0的数return getIndex(sno)>=0;}//查询已经存在的用户,避免重复插入,在程序初始化的时候调用public void select() {//获取数据库连接,不然会报空指针异常conn=connection.getCon();try{//sno,name,sex,age,id,number,address//定义静态select语句String sql="select * from student";//实例化Statement对象(静态),这里不知道为什么需要//java.sql这个东西,不然就没有executeQuery这个方法java.sql.Statement s=conn.createStatement();//执行静态select语句ResultSet rs=s.executeQuery(sql);//添加到集合中while(rs.next()) {//获取数据String sno=rs.getString(1);String name=rs.getString(2);String sex=rs.getString(3);String age=rs.getString(4);String id=rs.getString(5);String number=rs.getString(6);String address=rs.getString(7);//System.out.println(name+" "+password+" "+sno+" "+phone+" ");//插入到集合中MainFrame.list.add(new Student(sno, name, sex, age,id,number,address));}}catch(SQLException e) {e.printStackTrace();}}
}

类主界面:

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.sql.ResultSet;
import java.sql.SQLException;import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;//类似主窗口,用于单个的查询public class TmpFrame extends JFrame  {//主方法public static void main(String[] args) {new TmpFrame();}//面板final JPanel panel=new JPanel();//创建学生管理系统标签final JLabel system=new JLabel();//定义表格列名数组final String[] columnNames={"学号","姓名","性别","年龄","身份证号码","电话号码","家庭住址"};//创建显示表格的滚动面板JScrollPane scrollPane=new JScrollPane();//创建表格类型JTable table=new JTable();public TmpFrame(){//初始化窗体initFrame();//初始化面板initPanel();//窗体可见,放最后吧,不然里面的东西不会显示呢this.setVisible(true);}public void initFrame() {//设置窗体的标题this.setTitle("主界面");//设置窗体大小不可改变this.setResizable(false);//设置界面置顶(就是页面不会别其他页面覆盖,界面始终在最上面)this.setAlwaysOnTop(true);//那还是改成setSize吧,设置窗体的大小就行了this.setSize(1000,800);//居中this.setLocationRelativeTo(null);//设置窗体关闭按钮的动作作为退出this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//显示滚动条}//初始化面板public void initPanel() {initModule();//设置为不采用任何布局管理器,在Frame中设置没有效果,结果还是会被panel替代了panel.setLayout(null);//添加相关的组件panel.add(system);//将滚动面板添加到布局的中间panel.add(scrollPane);this.setContentPane(panel);}//初始化组件public void initModule() {//1.创建表格this.table=new JTable();//2.获取表格的数据模型DefaultTableModel model=(DefaultTableModel)this.table.getModel();//3.对表格的数据模型操作//第用第一行,不是整个数组model.setColumnIdentifiers(SelectFrame.tableValue[0]);//设置表头//按照比例调整表格所以列的宽度(书本245页)完全没效果//this.table.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);//用这个可以,调节每一列this.table.getColumnModel().getColumn(0).setPreferredWidth(50);//学号this.table.getColumnModel().getColumn(1).setPreferredWidth(10);//姓名this.table.getColumnModel().getColumn(2).setPreferredWidth(5);//性别this.table.getColumnModel().getColumn(3).setPreferredWidth(5);//年龄this.table.getColumnModel().getColumn(4).setPreferredWidth(80);//身份证号码this.table.getColumnModel().getColumn(5).setPreferredWidth(50);//电话号码this.table.getColumnModel().getColumn(6).setPreferredWidth(100);//家庭住址//4.更新表格模型this.table.setModel(model);//5.为JScrollPane面板设置一个可视化图表scrollPane.setViewportView(this.table);//6.将表格组件添加到JScrollPane面板上//设置滚动条的大小(不然太大了,滚动条不会显示)scrollPane.setBounds(100,100,800,400);//初始化管理系统相关组件system.setText("学生管理系统");//设置字体的类型,加粗,和大小system.setFont(new Font("Microsoft YaHei",Font.BOLD,35));//标签的大小和高度system.setBounds(400,0,400,100);}
}

主程序:


//程序的入口
public class App {public static void main(String[] args) {new Enter();}
}

程序说明与体会:

这个代码放这里也不知道会有多少人看,我自己也快忘记写了什么,但是记得是写了很久,整个可以分成两个阶段,用户登录注册那里就是看来视频,是没有图形界面的程序就没有重新运行之后数据就还原了,这个用数据库保存数据就挺好的,因为上学期是学了SQLserver就用这个来装数据了。

原本打算是写了三个表,就常见的S,C,SC,但是感觉把这设置界面要实现增删改查的界面实现那不考虑他们的连接就要设计4*3=12个界面,虽然有些界面大体相同,但是也太难弄了吧,就和老师商量能不能简化一下,登录注册那个是之前就写了有不想删掉,而且那个随机生成验证码那个还挺好玩的就保留了,整个就是不同界面之间到处穿来穿去,因为是先写的代码就一点冗余了,虽然后面学生管理那个代码同样也有点冗余,但是太难删了,我尽量把有个人信息的地方删除。

--S(Sno,Sname,Ssex,Sage)
--C(Cno,Cname,Teacher)
--SC(Sno,Cno,Grade)

因为要输入数据,难免会有很多错误的输入,我就用报错来处理,因为报错比较多,就干脆把warning那个方法修改成传递参数的方法,登录那些的程序先写警告是用空格占格让整个字体能够居中输出,后面发现可以通调用方法实现居中放置。后面又发现有必要每个程序的写一个警告的方法吗,只要写一个其他的直接调用不就行了,C语言他们使用extern来声明,Java的话通过设置成静态的方法通过类名就可以调用了。

java 中JLabel中的内容垂直居中和水平居中问题_jlabel剧中_独孤战天斗神的博客-CSDN博客icon-default.png?t=N5F7https://blog.csdn.net/ygl19920119/article/details/79707547

jDialog.getContentPane().add(warningLabel,BorderLayout.CENTER);

很多代码都冗余了,但是我也确定哪些可以删除,看着有点难修改,不过是能够跑的,为了调试方便,我给有界面的类里面都有main方法。主要就是繁琐的感觉,取消布局之后要自己通过坐标来调整,花费了很长的时间。原本为了简单可以统一用文本框的,我改用了单选按钮,对于事件的响应花费了很长时间以及列表的布局。这比之前的计算器就还要写的久了,-_-

总之,经历难忘,希望未来越来越好。


http://www.ppmy.cn/news/428273.html

相关文章

海盗王封WPE的方法

在游戏中&#xff0c;合当地使用WPE可以减轻玩家的重复操作&#xff0c;但是利用WPE刷bug作弊&#xff0c;会影响游戏平衡&#xff0c;故意大量发包还会导致全服集体卡顿。因此&#xff0c;很多开服的GM对此深恶痛绝。 以海盗王游戏为例&#xff0c;怎么封WPE呢&#xff1f; 首…

加勒比海盗船——最优装载问题(趣学算法C++代码和python代码)

C代码&#xff1a; #include<iostream> #include<algorithm> #include<conio.h> const int N1000005; using namespace std; double w[N];//古董的重量数组 int main() {double c;//载重量cint n;//古董个数ncout<<"请输入载重量c及古董个数n&am…

atlas单机模式代码_单机模式对海盗游戏《ATLAS》的重要作用,为调整多人模式做准备...

最近&#xff0c;海盗冒险生存游戏《ATLAS》上线了它的单机模式&#xff0c;这使得很多小白玩家都很兴奋&#xff0c;因为在这个模式里就只有自己一个人&#xff0c;无论是进行探险、寻宝还是挑战BOSS玩家都不用担心来自其他玩家给予的压力。但是大神玩家却对此感到不满&#x…

HTML小游戏10 —— 休闲类游戏《解救海盗船长》(附完整源码)

💂 网站推荐:【神级源码资源网】【摸鱼小游戏】🤟 风趣幽默的前端学习课程:👉28个案例趣学前端💅 想寻找共同学习交流、摸鱼划水的小伙伴,请点击【摸鱼学习交流群】💬 免费且实用的计算机相关知识题库:👉进来逛逛给大家安利一个免费且实用的前端刷题(面经大全)…

趣学算法NYOJ加勒比海盗船

题目描述: 在北美洲东南部&#xff0c;有一片神秘的海域&#xff0c;那里碧海蓝天、阳光明媚&#xff0c;这正是传说中海盗最活跃的加勒比海&#xff08;Caribbean Sea&#xff09;。17世纪时&#xff0c;这里更是欧洲大陆的商旅舰队到达美洲的必经之地&#xff0c;所以当时的海…

【贪心】加勒比海盗船-最优装载问题

题目 在北美洲东南部&#xff0c;有一片神秘的海域&#xff0c;那里碧海蓝天、阳光明媚&#xff0c;这正是传说中海盗最活跃的加勒比海。17 世纪时&#xff0c;这里更是欧洲大陆的商旅舰队到达美洲的必经之地&#xff0c;所以当时的海盗活动非常猖獗&#xff0c;海盗不仅攻击过…

贪心算法-加勒比海盗船——最优装载问题

实际问题&#xff1a;一群海盗截获了一艘装满各种金银珠宝和古董的货船&#xff0c;每一件宝物都价值连城一旦打碎就失去了价值。海盗船的载重量为C&#xff0c;每件宝物的重量为Wi&#xff0c;海盗们应该如何把尽可能多的宝物装上船&#xff1f; 问题分析&#xff1a;这是一个…

加勒比海盗船(最优装载问题)

问题描述&#xff1a; 在北美洲东南部,有一片神秘的海域,那里碧海蓝天、阳光明媚,这正是传说中海盗最活跃的加勒比海,这里更是欧洲大陆的商旅舰队到达美洲的必经之地,所以当时的海盗活皇家舰......动非常猖獗,海盗不仅攻击过往商人,甚至攻击英国有一天,海盗们截获了一艘装满各…