简单学生管理系统(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 )
GO
use education
go
create 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 users
select * 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,不然程序会报错
//连接数据库的url
private 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);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JButton 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);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JButton 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);
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
JButton 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);
}
@Override
public 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();
}
}
//获取单选按钮中对应的值
@Override
public 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);
}
@Override
public 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);
}
@Override
public 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();
}
}
//获取单选按钮中对应的值
@Override
public 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);
}
@Override
public 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);
}
@Override
public 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方法。主要就是繁琐的感觉,取消布局之后要自己通过坐标来调整,花费了很长的时间。原本为了简单可以统一用文本框的,我改用了单选按钮,对于事件的响应花费了很长时间以及列表的布局。这比之前的计算器就还要写的久了,-_-
我这里的实现过程就是把每次的数据从数据库中提取到集合中,运行的时候是对集合进行操作,增删改查需要同步到数据库中。有疑问的再更新,暂时想不到有什么其他要注意的地方。
总之,经历难忘,希望未来越来越好。