简单学生管理系统
简单学生管理系统(Java)_封奚泽优的博客-CSDN博客https://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博客https://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博客https://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博客https://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博客https://blog.csdn.net/ygl19920119/article/details/79707547
jDialog.getContentPane().add(warningLabel,BorderLayout.CENTER);
很多代码都冗余了,但是我也确定哪些可以删除,看着有点难修改,不过是能够跑的,为了调试方便,我给有界面的类里面都有main方法。主要就是繁琐的感觉,取消布局之后要自己通过坐标来调整,花费了很长的时间。原本为了简单可以统一用文本框的,我改用了单选按钮,对于事件的响应花费了很长时间以及列表的布局。这比之前的计算器就还要写的久了,-_-
我这里的实现过程就是把每次的数据从数据库中提取到集合中,运行的时候是对集合进行操作,增删改查需要同步到数据库中。有疑问的再更新,暂时想不到有什么其他要注意的地方。
总之,经历难忘,希望未来越来越好。
相关文章:
简单学生管理系统
简单学生管理系统(Java)_封奚泽优的博客-CSDN博客https://blog.csdn.net/weixin_64066303/article/details/130667107?spm1001.2014.3001.5501 转载请注明出处,尊重作者劳动成果。 目录 前期准备: 数据库的连接: 用户账号类:…...
图像金字塔
图像金字塔是由一幅图像的多个不同分辨率的子图构成的图像集合。是通过一个图像不断的降低采样率产生的,最小的图像可能仅仅有一个像素点。下图是一个图像金子塔的示例。从图中可以看到,图像金字塔是一系列以金字塔形状排列的、自底向上分辨率逐渐降低…...
Springboot整合Camunda工作流引擎实现审批流程实例
环境:Spingboot2.6.14 camunda-spring-boot-starter7.18.0 环境配置 依赖配置 <camunda.version>7.18.0</camunda.version> <dependency><groupId>org.camunda.bpm.springboot</groupId><artifactId>camunda-bpm-spring-boo…...
PHP设计模式21-工厂模式的讲解及应用
文章目录 前言基础知识简单工厂模式工厂方法模式抽象工厂模式 详解工厂模式普通的实现更加优雅的实现 总结 前言 本文已收录于PHP全栈系列专栏:PHP快速入门与实战 学会好设计模式,能够对我们的技术水平得到非常大的提升。同时也会让我们的代码写的非常…...
【玩转Docker小鲸鱼叭】理解Docker的核心概念
Docker核心概念 Docker有三大核心概念:镜像(Image)、容器(Container)、仓库(Repository) 1、镜像(Image) Docker镜像 是我们创建和运行Docker容器的基础,它…...
Eureka 心跳和服务续约源码探秘——图解、源码级解析
🍊 Java学习:社区快速通道 🍊 深入浅出RocketMQ设计思想:深入浅出RocketMQ设计思想 🍊 绝对不一样的职场干货:大厂最佳实践经验指南 📆 最近更新:2023年5月25日 🍊 点赞 👍 收藏 ⭐留言 📝 都是我最大的动力! 文章目录 分布式系统的心跳机制心跳机制的实…...
代码随想录二刷 530 二叉搜索树的最小绝对差 98. 验证二叉搜索树 700. 二叉搜索树中的搜索
530 二叉搜索树的最小绝对差 代码如下 func getMinimumDifference(root *TreeNode) int { var pre *TreeNode res : math.MaxInt var traverse func(root * TreeNode) traverse func(root * TreeNode) { if root nil { return } traverse(root.Left) …...
Docker安装——CentOS7.6(详细版)
ps:docker官网 在 CentOS 上安装 Docker 引擎 |官方文档 () 一、确定版本(必须是7以上版本) cat /etc/redhat-release 二、卸载旧版本(或者之前装过,没有安装过就不用管了) (root用…...
论信息系统项目的整体管理(范文)
论信息系统项目的整体管理(范文) 【摘要】 2016年10月,XX省卫生健康委启动了XX省分级转诊服务平台建设项目,我在项目中担任项目经理,负责项目的全面管理工作。该平台作为全省上下级医院转诊的信息化通道,…...
【音视频处理】音频编码AAC详解,低码率提高音质?
大家好,欢迎来到停止重构的频道。 本期我们介绍音频编码格式AAC。 AAC是音频最常用的编码格式之一,几乎所有的播放器都支持这个编码格式。 其他音频编码格式都是类似的,只是某些细节存在差别,如压缩算法、某些音频参数存在限制…...
逆函数学习
逆函数 给定关系 R ⊆ X Y R\subseteq X\times Y R⊆XY,颠倒 R R R的所有有序偶可以得到 R R R的逆关系 R ~ ⊆ Y X \tilde{R}\subseteq Y\times X R~⊆YX 但是对于函数 f : X → Y f:X\to Y f:X→Y而言,其逆关系 f ~ \tilde{f} f~可能不是 Y Y Y到…...
代码审计——SSRF详解
为方便您的阅读,可点击下方蓝色字体,进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 服务端请求伪造攻击(SSRF)也成为跨站点端口攻击,是由于一些应用在向第三方主机请求资源时提…...
搭建Scala开发环境
一、Windows上安装Scala 1、到Scala官网下载Scala Scala2.13.10下载网址:https://www.scala-lang.org/download/2.13.10.html 单击【scala-2.13.10.msi】超链接,将scala安装程序下载到本地 2、安装Scala 双击安装程序图标,进入安装向导&…...
BLIP和BLIP2
文章主要是对BLIP2 (使用冻结图像编码器和大型语言模型的Bootstrapping语言图像预训练)论文的阅读笔记,也对BLIP(用于统一视觉语言理解和生成的Bootstrapping语言图像预训练)算法进行了简单的介绍。 文章:…...
微信小程序开发实战 ⑨(TabBar)
作者 : SYFStrive 博客首页 : HomePage 📜: 微信小程序 📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗 📌:觉得文章不错可以点点关注 Ǵ…...
微前端探秘:初始微前端、现有方案和未来趋势
初识微前端 微前端是什么 概念: 微前端是指存在于浏览器中的微服务。 微前端是一种类似于微服务的架构,它将微服务的理念应用于浏览器端,即将单页面前端应用由单一的单体应用转变为把多个小型前端应用聚合为一体的应用。这就意味着前端应用…...
运维(SRE)成长之路-第2天 文本编辑工具之神VIM
vi和vim简介 在Linux中我们经常编辑修改文本文件,即由ASCII, Unicode 或其它编码的纯文字的文件。之前介绍过nano,实际工作中我们会使用更为专业,功能强大的工具 文本编辑种类: 全屏编辑器:nano(字符工具…...
45从零开始学Java之详解static修饰符、静态变量和静态方法
作者:孙玉昌,昵称【一一哥】,另外【壹壹哥】也是我哦 千锋教育高级教研员、CSDN博客专家、万粉博主、阿里云专家博主、掘金优质作者 前言 在前一篇文章中,壹哥给大家讲解了abstract关键字,从而我们掌握了抽象类与抽象…...
电商超卖,从业务到设计
编辑导语:超卖这一概念的定义可以从不同层面进行阐述,比如平台层面、渠道层面、仓库层面等。而假设因超卖导致订单难以履行,则容易让用户体验“打折”。为什么有时电商超卖的现象会发生?可以从哪些角度来降低超卖导致的风险&#…...
【MySQL】表的约束
表的约束 表的约束1. 空属性2. 默认值3. 列描述4. zerofill(自动补零)5. 主键—primary key5.1 复合主键 6. 自增长—auto_increment7.唯一键 --- unique8. 外键 --- foreign key…reference9. 综合案例 表的约束 真正约束字段的是数据类型,…...
【计算机网络】第一章 概述(下)
文章目录 第一章 概述1.5 计算机网络的性能指标1.5.1 速率1.5.2 带宽1.5.3 吞吐量1.5.4 时延 1.6 计算机网络体系结构1.6.1 常见的体系结构1.6.2 分层的必要性1.6.4 体系结构中的专用术语 1.8 习题 第一章 概述 1.5 计算机网络的性能指标 常用的 计算机网络 的性能指标有以下 …...
化工园区人员全过程轨迹化安全解决方案
1、项目背景 化工园区化工厂是生产安全重点单位,对人员定位管理需求强烈。对人员定位主要需求是:一般区域人数统计、人员轨迹、重点区域人员实时精准定位。 华安联大安全化工园区人员全过程轨迹化安全解决方案通过人员实时定位管理、移动轨迹追溯、险情…...
Java泛型中的T、E、K、V、?通配符,你确定都了解吗?
目录 前言 泛型带来的好处 泛型中通配符 小结 前言 Java 泛型(generics)是 JDK 5 中引入的一个新特性, 泛型提供了编译时类型安全检测机制,该机制允许开发者在编译时检测到非法的类型。 泛型的本质是参数化类型,也就是说所操…...
Jenkins部署及使用
Jenkins 1.定义 1.Jenkins是一款开源CI/CD软件,用于自动化各种任务,包括构建、测试和部署软件 1.CI/CD 1.CI:持续集成(Continuous Integration) 1.协同开发是目前主流的开发方式,一般由多位开发人员同时处理同一个应用的不同模块…...
UML类图(二)
相信希望,相信自己 上一章简单介绍了 设计模式的原则(一), 如果没有看过,请观看上一章 本文参考文章: 常见UML符号详解 UML (Unified modeling language) 统一建模语言,是一种用于软件系统分析和设计的语言工具, 它用于帮助软件开发人员进行…...
【IoU全总结】GIoU, DIoU, CIoU, EIoUFocal, αIoU, SIoU,WIoU【基础收藏】
🥑 Welcome to Aedream同学 s blog! 🥑 并不存在效果一定优秀的IoU,需要结合自己的网络、数据集试验。 不想深究原理可直接跳转总结。文内公式均为手打,非图片,方便查看 文章目录 L1 Loss,L2Loss࿰…...
docker 安装 mysql
第一步,安装docker ,确保centos环境符合要求,有网 yum install docker -y 第二步:拉取mysql 首先可以先查询支持的mysql: search # 拉取镜像 docker pull mysql # 或者 docker pull mysql:latest # 以上两个命令是一致的&…...
Java 流程控制之 for 循环
Java语言中的for循环是一种常用的循环结构,用于重复执行一段代码,直到指定的条件不再成立。在本篇博客中,我们将深入探讨Java中的for循环,包括其语法、用法和示例。 一、for循环的基本语法 for循环的基本语法如下: …...
Kubernetes那点事儿——暴露服务之Ingress
Kubernetes那点事儿——暴露服务之Ingress 前言一、ingress负载均衡器Ingress Controller路由规则Ingress 二、Ingress Controller三、案例 前言 在 k8s 集群中,如果我们将服务暴露出来,提供访问,可以使用Nodeport方式,但是Nodepo…...
八股文总结
文章目录 项目介绍1.不动产项目项目难点机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 系统流程图 2.图书项目技术栈ShiroMybatisMyBatis:Mybatis Plus: 面试问题 Java基础基本数据类型反射接口和抽象类异常代理模式1. 静态代理2. 动…...
做美甲批发的都上什么网站/关键词批量调词软件
标记说明Ag形语素 形容词性语素。形容词代码为a,语素代码g前面置以A。a形容词 取英语形容词adjective的第1个字母。ad副形词 直接作状语的形容词。形容词代码a和副词代码d并在一起。an名形词 具有名词功能的形容词。形容词代码a和名词代码n并在一起。b区…...
介绍自己做衣服的网站/不用流量的地图导航软件
选自 :新华网新华网合肥12月28日电 (记者 代群) 30秒内为驾驶员提供实时路况和最优出行路线信息;8分钟完成单幅机载合成雷达数据成像,准实时精确提供灾情评估和经济损失分析信息。记者日前从中国科技大学获悉,国产KD-50-I-E增强型…...
青岛app网站开发/还有哪些平台能免费营销产品
近年来,国内经济持续保持高速增长,受消费升级以及中产阶级人群扩大的影响,整体消费环境由生存性消费转变至服务型消费。与此同时,商务部“消费升级行动计划”2018年将全面启动。在行业发展和政策利好的背景下,那些向大…...
广州做网站哪里好/重庆seo网络推广优化
内容:软件项目与过程管理课程内容总结 经过八周时间的学习,软件项目与过程管理课程已经逐渐接近了尾声。通过这八周的学习,我对软件项目与过程管理课程有了更深的理解。 一、关于团队项目。 团队项目是本次软件项目与过程管理课程中最重要的一…...
网站建设在微信里打广告内容/哪些平台可以做推广
为什么是Python? 不做程序的工作好久了,当创业成为工作后越发发现时间的宝贵。时间那么少,需求确实多样的,软件的,web的,还得跨平台,以前熟悉的.Net明显每一项满足的。选来选去还是Python适合现…...
wordpress css样式/百度首页优化排名
功能介绍 【后台管理员功能】 会员列表:查看所有注册会员信息,支持删除 录入资讯:录入资讯标题、内容等信息 管理资讯:查看已录入资讯列表,支持删除和修改 广告设置:上传图片和设置小程序首页轮播图广告地…...