基于Java编程的学生选课系统

Java的学生选课系统
摘 要:本文较为详细的介绍了基于Java编程语言和SQL Server 2000数据库所编的学校学生选课系统。给出了开发此系统的软硬件平台以及开发环境,较为详尽介绍了需求分析过程,系统的界面构思以及搭建,软件代码的开发模式,分层搭建,以及部分代码实现。讨论了SQL Server 2000数据库的规定,存储过程,开发java程序的习惯,以及系统的用处和特点。本系统为增强Java程序的可移植性,代码的的复用性,功能界面的可观性,系统的可维护性而对Java源代码进行了抽象封装,对以后可能需要修改的变量放进了配置文件,同时具有操作简单,界面美观等特点。
关键词:Java,SQL Server 2000,界面搭建,可移植性,需求分析,存储过程
1 引言
随着时间的推移,Java编程语言凭借其跨平台性,安全性,程序健壮等特点,越来越流行,尤其是2007年以后,跟随着在移动领域安卓系统的风行,Java已然成为世界上最受欢迎的编程语言之一。同时由于互联网时代的全面到来,世界上个各个领域都需要一种工具来存储数据和调用数据,于是数据库营运而生,可以说我们周围的世界到处都是数据。因此编程语言和数据库的紧密结合给我们的生活带来了翻天覆地的变化,使我们生活的世界真正实现了全民互联,可以说在硬件的高度发达的基础之上,软件的作用已经渗透到当今社会的各个方面。伴随着Java语言和各个数据库的更新和发展,编程的周期变短了,系统的安全性,可维护性等多方面得到了很大提升。如在生活购物领域:像众所周知的淘宝网其实就是用Java编程语言开发的。当然其他的一些较为大型的管理系统,网页前端开发,以及服务器的功能扩展也是完全可以用Java编写。



2 设计思想
2.1 需求分析
本系统是一个单机版的小型的学生选课管理系统。在本系统中,开发了一个面向管理员、学生和教师这三个对象的教务平台。
对学生提供的服务有:登录、选课、选择课程、和查询成绩这几个服务。
对教师提供的服务有:登录、查看个人信息和录入学生成绩。
对管理员提供的服务有:登录、增加、删除、修改、查看学生和教师信息。
2.2 开发环境
2.2.1 系统架构设计
(1)架构:单机
(2)运行软件环境: windows7 、jdk1.6
(3)开发环境:
硬件平台:
CPU:I3 2.2GHz
内存:512MB以上
软件平台:windows 7、jdk1.6
操作系统:Windows7
数据库:SQL Server 2000、SQLServer SP4补丁
开发工具:MyEclipse2014
分辨率:1024*768
2.

3 功能块
2.3.1 功能框架模块设计

图-1 功能框架模块

各模块功能简介:
登录界面:登录界面是有帐号,密码,管理员帐号一字母A开头,教师帐号一字母T开头,学生帐号以字母S开头,登录帐号或密码输入错误会弹出相应的提示对话框。
学生信息管理模块:管理员用于添加和删除学生信息的模块。
教师信息管理模块:管理员用于添加和删除教师信息的模块。
教师个人信息模块和学生个人信息模块:展示当前登录的教师或者学生的个人信息
教师录入成绩模块:教师可以浏览选修自己课程的学生的信息并且录入该学生的成绩。
学生选择选修课模块:该模块通过表格的形式将所有课程列出来,学生可以根据个人兴趣选择不同的课程,不能重复选课,否则会弹出对话框,提示用户查看已经选择了的课程。
学生查询成绩模块:通过表格的形式将该学生选择了的课程列出来,如果教师有录入成绩,则可以看到自己的课程成绩。
2.3.2 角色功能图

图-2 角色功能图

2.4 数据库设计 (概要设计...)
2.4.1 E-R图



图-3 E-R图

2.4.2 关系模式
学生(学生学号,学生姓名,教师性别,教师生日,所在班级)
教师(教师编号,教师姓名,教师性别,教师生日,教师职称,所在院系)
课程(课程号,课程名,学分,选课人数)
选课(课程号,学生学号,成绩)
授课(课程号,教师编号,上课地点)
2.4.3 数据库管理系统:Microsoft SQL Server 2000
2.4.4 数据库命名
StudentManager
2.4.5 数据库表
Logon(登录帐号密码)
主要用来保存用户登录信息
表-1 登录帐号密码
字段名 数据类型 长度 是否为空 是否主键 UserID char 10 不为空 主键 Password charr 10
StudentTable1(学生信息表)
主要用来保存学生信息。
表- 2 学生信息表
字段名 数据类型 长度 主键否 是否为空 描述 StudentID Char 10 主键 不为空 学生学号 StudentName Char 10 不为空 学生姓名 StudentSex Char 2 不为空 学生性别 StudentBirthday Datetime 8 学生生日 Class char 16 所在班级

TeacherTable1(教师信息表)
用来储存教师的基本信息
表-3 教师信息表
字段名 数据类型 长度 主键否 是否为空 描述 TeacherID Char 10 主键 不为空 教师编号 TeacherName Char 10 不为空 教师姓名 TeacherSex Char 2 不为空 教师性别 TeacherBirthday Datetime 8 教师生日 Post char 10 教师职称 Department char 20 所在院系
CourseTable(课程信息表)
表-4 课程信息表
字段名 数据类型 长度 主键否 是否为空 描述 CourseID Char 16 主键 不为空 课

程编号 CourseName Char 16 不为空 课程名 Point Char 8 不为空 学分 StuNumber Datetime 4 不为空 选课人数
ScoreTable(学生成绩表)
用于存储学生成绩
表-5 学生成绩表
字段名 数据类型 长度 是否为空 是否主键 CourseID char 16 不为空 主键 StudentID char 10 不为空 主键 Score int 4
TeachTable(教师授课表)
表-6 教师授课表
字段名 数据类型 长度 是否为空 是否主键 CourseID char 16 不为空 主键 TeacherID char 10 不为空 主键 Location int 10 2.4.6 数据库账户及权限 (截图)
学生账户表

图-4学生账户

教师账户表

图-5 教师账户

用户登录表:

图-6 用户登录
2.4.7 数据库存储过程:
AllCourse:
create proc AllCourse
as
begin
select x.CourseID,x.CourseName,x.Point ,y.TeacherName,y.Post,z.Location,x.StuNumber
from Course x,TeacherTable1 y,TeachTable z
where x.CourseID=z.CourseID and y.TeacherID=z.TeacherID
end
DeleteLogon :
create proc DeleteLogon(@id char(10))
as
begin
delete from Logon
where UserID=@id
end
DeleteStudent:
create proc DeleteStudent(@id char(10))
as
begin
delete from StudentTable1
where StudentID=@id
end

DeleteTeacher :
create proc DeleteTeacher(@id char(10))
as
begin
delete from TeacherTable1
where TeacherID=@id
end

InsertLogon :
create proc InsertLogon(@id char(10))
as
begin
insert into Logon
values(@id,@id)
end

InsertStudent :
create proc InsertStudent(@userid char(10),@username char(10),@sex char(2),@birth datetime,@class char(10))
as
begin
insert into StudentTable1 values(@userid ,@username,@sex,@birth,@class)
end
return

InsertTeacher:
create proc InsertTeacher(@userid char(10),@username char(10),@sex char(2),@birth datetime,@post char(10),@department char(10))
as
begin
insert into TeacherTable1 values(@userid ,@username,@sex,@birth,@post,@department)
end
return

IsExistsStu :
create proc IsExistsStu(@id char(10))
as
begin
select * from StudentTable1
where StudentID=@id
end

IsExistsTea:
create proc IsExistsTea(@id char(10))
as
begin
select * from Teachertable1
where TeacherID=@id
end

ProcAllStu :
create proc ProcAllStu
as
begin
select * from StudentTable1
end

ProcAllTea
create proc ProcAllTea
as
begin
select * from TeacherTable1
end

ProcLogon:
create proc ProcLogon(@userid char(16),@password char(10))
as
begin
select *
from Logon
where UserID=@userid and Password=@password
end
return

ProcModify:
create proc ProcModify(@id char(10),@password char(16))
as
begin
update Logon
set Password=@password
where UserID=@id
end

ProcStudent :
create proc ProcStudent(@id char(10))
as
begin
select * from StudentTable1
where StudentID=@id
end

SelectCourse :
create proc SelectCourse(@id char(10),@courseid char(16))
as
b

egin
insert into ScoreTable
values(@courseid,@id,null)
end

SelectedCourse:
create proc SelectedCourse(@id char(10))
as
begin
select * from ScoreTable
where @id=StudentID
end

SelectedCourseNum:
create proc SelectedCourseNum(@id char(10))
as
begin
select COUNT(*)
from Scoretable
where StudentID=@id
end

SelectedDetail :
create proc SelectedDetail(@id char(10))
as
begin
select x.CourseID,x.CourseName,x.Point ,y.TeacherName,y.Post,z.Location,s.Score
from Course x,TeacherTable1 y,TeachTable z,ScoreTable s
where @id=s.StudentID and x.CourseID=z.CourseID and z.TeacherID=y.TeacherID
and x.CourseID=s.CourseID
end

3 系统界面截图及功能说明
3.1 闪屏界面

图-7 闪屏界面
说明:在进入系统时候,会先出现这个闪屏界面,图片区域开始闪现文字(文字字体颜色随时改变),同时加载条区域加载条开始向右移动,当系统加载条加载到头时候,界面上的文字同时加载完成,然后在等数秒以后,此界面消失,而后进入系统登录界面。
3.2 登录界面

图-8 登录界面
说明:闪屏界面消失以后,系统进入这个界面,供用户输入登录信息,在用户输入用户名和密码以后,点击登录按钮,如果用户名和密码都正确,不同类型的用户会进入不同界面,如果输入有误,会弹出一个对话框,提醒用户输入有误,如果用户点击取消按钮,就会退出登录界面。
如下图所示:

图-9 提示
3.3 管理员界面
3.3.1 管理员功能选择界面

图-10 功能选择界面
说明:在管理员输入正确的用户名和密码以后,进入这这界面,此界面提供了两个按钮,代表管理员的两个功能,点击不同按钮会弹出不同界面,此界面不会消失。
3.3.2 学生信息管理界面

图-11 学生信息管理界面
说明:在管理员点击了“学生信息管理”按钮以后,进入这个界面(展示学生的一些基本信息),在这个界面里面,管理员可以录入学生的信息和删除学生的信息。
当管理员准备录入学生的信息时候,需要在不同的文本输入框里面,输入该学生对应的信息,然后点击输入按钮,学生信息就会录入进去。在界面的列表里就会出现该学生的信息。但当学生编号和学生姓名为空时候,会弹出一个对话框,提醒管理员学生编号和学生姓名为空。
如下图所示:

图-11 错误提示
当管理员准备删除某个学生的信息时候,需要先点击选中某个学生的信息,然后点击删除按钮,这样在学生信息列表中就不见了这个学生的信息,同时在数据库中也更新数据。但当管理员没有选中一行学生信息时候,就会弹出一个对话框,提醒管理员,先选中一行数据。
如下图所示:

图-12


3.3.3 教师信息管理界面

图-13 教师信息管理界面
说明:在管理员点击了“教师信息管理”按钮以后进入这个界面(此界面和“学生信息管理”并列),在这个界面里面,管理员可以录入教师的信息和删除教师的信息。
当管理员准备录入教师的信息时候,需要在不同的文本输入框里面,输入该教师对应的信息,然后点击输入按钮,教师信息就会录入进去。在界面的列表里就会出现该教师的信息。但当教师编号和教师姓名为空时候,会弹出一个对话框,提醒管理员教师编号和教师姓名为空。
如下图所示:

图-14 错误报错
当管理员准备删除某个教师的信息时候,需要先点击选中某个教师的信息,然后点击删除按钮,这样在教师信息列表中就不见了这个教师的信息,同时在数据库中也更新数据。但当管理员没有选中一行教师信息时候,就会弹出一个对话框,提醒管理员,先选中一行数据。
如下图所示:

图-16 提示
3.4 学生界面
3.4.1 学生功能选择界面

图-17 学生功能选择界面
说明:在学生输入正确的用户名和密码以后,进入这这界面,此界面提供了三个按钮,代表可供学生选择的三个功能,点击不同按钮会弹出不同界面,此界面不会消失。
3.4.2 学生个人信息界面

图-18 学生个人信息界面
说明:在学生点击“个人信息”按钮以后,进入这个界面,此界面展示了该学生的个人信息。
3.4.3 学生课程信息界面

图-19 学生课程信息界面
说明:在学生点击了“课程信息”按钮以后,进入这个界面,此界面展示了该校提供的供学生选择的一些课程信息(学生不能修改这些信息)。当学生需要选择修的课程时候,需要先在列表中选择一行课程的信息,然后在点击确认按钮,该学生选择的课程就会保存到已选课程列表中。但当该学生一行数据都没有选择时候,会弹出一个对话框,提醒该学生先选择一门课程
如下图所示:

图-10 提示

3.4.4 学生已选课程界面

图-21 学生已选课程界面
说明:在学生点击“已选课程”按钮以后,进入这个界面(展示该学生已选的课程信息),此界面中列表中的课程信息只能查看,不能修改。
3.5 教师界面
3.5.1 教师功能选择界面

图-22 教师功能选择界面
说明:在教师输入正确的用户名和密码以后,进入这这界面,此界面提供了两个按钮,代表可供教师选择的两个功能,点击不同按钮会弹出不同界面,此界面不会消失。
3.5.2 教师个人信息界面

图-23 教师个人信息界面

说明:在教师点击“个人信息”按钮以后,进入这个界面,此界面展示了该教师的

个人信息。
3.5.3 教师录入成绩界面

图-24 教师录入成绩界面

说明:在教师点击“录入成绩”按钮以后,进入这个界面,此界面展示了选择该教师所受课程的学生信息以及课程信息,教师可以在这个界面对学生的成绩进行录入。当教师需要对列表中某个学生的某个课程录入成绩时候,需要先选中一行数据,不然就会弹回一个对话框提醒教师先选中一行数据。
如下图所示:

图-25 提示
当教师选择了一行数据以后,还要保证录入成绩的文本框里面必须有分数,不然也会弹出一个对话框,提醒教师录入成绩时候必须输入该学生该课程的分数。
如下图所示:

图-26 提示
3.6 系统框架图

图-27 系统框架图

3.7 系统源代码结构图

图-28 系统源代码结构图

4 系统实现(部分源代码)
4.1 界面类代码实现
4.1.1 闪屏类
//开发一个闪屏类
class paint extends JPanel implements Runnable{//可以自动刷新Pane
Thread t; int x=10;int i=0,j=40,u=10; int k=0,tt=0;
String gg[]={"系","统","正","在","加","载","请","稍","侯"};
String shi[]={"安","农","大","容","海","内","良","师", "纳","天","下","桃"," 李","藏","万","卷","书",
"香","育","百","花","千","木","|","|","郭","营","工","作","室"};
Font f=new Font("隶书",Font.PLAIN,18);
boolean ifok=true; int width=180;int height=0;int dian=0;
paint(){ t=new Thread(this); t.start(); }
public void run(){
while(true){
if(x<=380)
repaint();
try{
Thread.sleep(70);
i++;//i=0
j=j-6;//j=40
u=u+10;//u=10
if(tt==3) width=width-20; //tt=0,width=180
if(i==4){
tt++;
if(ifok&&x>120+k*20) k++;//k=0
if(k>=gg.length-1) ifok=false;
x=x+10;
i=0;
j=40;
u=10;
dian++;
if(dian>3) dian=0;
}
}catch(InterruptedException e){
System.out.println("线程中断"); } } }
public void paintComponent(Graphics g){
Image image;
image=Toolkit.getDefaultToolkit().getImage("images\\shanping.jpg");//获得背景图片
g.drawImage(image, 0, 0, this.getWidth(), 200, this);
int r=(int)(Math.random()*255);
int b=(int)(Math.random()*255);
int y=(int)(Math.random()*255);
g.setColor(new Color(253,250,250));//White
g.fillRect(x, 210, 380-x, 30);
g.setColor(new Color(253,250,250));//white
//领头的长方块儿
if(i>1) g.fillRect(x, 235-(j+20)/2, 10, j+10);
if(j>25) g.setColor(new Color(r,b,y));
else g.setColor(new Color(123,194,252));//light blue
//后面跟着的短方块儿,10代表闪动条的宽度,j代表闪动条的高度
g.fillRect(x, 235-(j+20)/2, 10, j);
g.setColor(new Color(123,194,252));//light blue
g.drawRect(10, 210, 380, 30);
if(x<120){
for(int l=0;lg.setColor(new Color(0,0,0));
g.drawString(gg[l], 120+l*20, 230); }}
Else{
//当加

载条加载到文字位置处文字的颜色改变
//画被进度条覆盖的文字,颜色改变
g.setColor(new Color(23,23,230));
g.drawString(gg[k],120+k*20,230);
//画进度条没有覆盖的文字,颜色还是不变
for(int l=k+1;lg.setColor(new Color(0,0,0));
g.drawString(gg[l],120+l*20,230); }}
for(int l=0;l<=dian;l++){
if(x>=300){
//当进度条覆盖到星点处改变画笔颜色
g.setColor(new Color(23,23,230));}
else{
//当进度条覆没有盖到星点处画笔颜色为原来颜色
g.setColor(new Color(0,0,0));}
//画点点“ **** ”
g.drawString("*",300+l*10,235); }
//画图片上的文字,逐字写诗
if(tt<3){
for(int rr=0;rr<=tt;rr++){
g.setColor(new Color(250,0,0));
g.drawString(shi[rr],180,60+rr*20);}
g.drawString(shi[tt],180,60+tt*20); }
if(tt>=3&&tt<8){
g.setColor(new Color(230,0,0));
for(int rr=0;rr<3;rr++) g.drawString(shi[rr],180,60+rr*20);
g.setColor(new Color(r,b,y));
if(tt<8)for(int rr=3;rr<=tt;rr++)g.drawString(shi[rr],150,rr*20);
if(tt>=7)for(int rr=3;rr<8;rr++)g.drawString(shi[rr],150,rr*20);
}
if(tt>=8&&tt<13){
g.setColor(new Color(230,0,0));
for(int rr=0;rr<3;rr++)g.drawString(shi[rr],180,60+rr*20);
for(int rr=3;rr<=7;rr++)g.drawString(shi[rr],150,rr*20);
g.setColor(new Color(r,b,y));
if(tt<13)for(int rr=8;rr<=tt;rr++)g.drawString(shi[rr],120,rr*20-100);
if(tt>=13)for(int rr=8;rr<13;rr++)g.drawString(shi[rr],120,rr*20-100);}
if(tt>=13&&tt<18){
g.setColor(new Color(230,0,0));
for(int rr=0;rr<3;rr++)g.drawString(shi[rr],180,60+rr*20);
for(int rr=3;rr<=7;rr++)g.drawString(shi[rr],150,rr*20);
for(int rr=8;rr<13;rr++)g.drawString(shi[rr],120,rr*20-100);
g.setColor(new Color(r,b,y));
if(tt<18)for(int rr=13;rr<=tt;rr++)g.drawString(shi[rr],90,rr*20-200);
if(tt>=18)for(int rr=13;rr<13;rr++)g.drawString(shi[rr],90,rr*20-200); }
if(tt>=18&&tt<23){
g.setColor(new Color(230,0,0));
for(int rr=0;rr<3;rr++)g.drawString(shi[rr],180,60+rr*20);
for(int rr=3;rr<=7;rr++)g.drawString(shi[rr],150,rr*20);
for(int rr=8;rr<13;rr++)g.drawString(shi[rr],120,rr*20-100);
for(int rr=13;rr<18;rr++)g.drawString(shi[rr],90,rr*20-200);
g.setColor(new Color(r,b,y));
if(tt<23)for(int rr=18;rr<=tt;rr++)g.drawString(shi[rr],60,rr*20-300);
if(tt>=23)for(int rr=18;rr<23;rr++)g.drawString(shi[rr],60,rr*20-300);}
if(tt>=23&&tt<30){
g.setColor(new Color(230,0,0));
for(int rr=0;rr<3;rr++)g.drawString(shi[rr],180,60+rr*20);
for(int rr=3;rr<=7;rr++)g.drawString(shi[rr],150,rr*20);
for(int rr=8;rr<13;rr++)g.drawString(shi[rr],120,rr*20-100);
for(int rr=13;rr<18;rr++)g.drawString(shi[rr],90,rr*20-200);
for(int rr=18;rr<23;rr++)g.drawString(shi[rr],60,rr*20-300);
g.setColor(new Color(r,b,y));
if(tt<30)for(int rr=23;rr<=tt;rr++)g.drawString(shi[rr],30,rr*20-400);
if(tt>=30){tt=0;for(int rr=18;rr<23;rr

++)g.drawString(shi[rr],30,rr*20-300);} }
if(tt>30){
g.setColor(new Color(230,0,0));
for(int rr=0;rr<3;rr++)g.drawString(shi[rr],180,60+rr*20);
for(int rr=3;rr<=7;rr++)g.drawString(shi[rr],150,rr*20);
for(int rr=8;rr<13;rr++)g.drawString(shi[rr],120,rr*20-100);
for(int rr=13;rr<18;rr++)g.drawString(shi[rr],90,rr*20-200);
for(int rr=18;rr<23;rr++)g.drawString(shi[rr],60,rr*20-300);
for(int rr=23;rr<30;rr++)g.drawString(shi[rr],30,rr*20-400); }} }
4.1.2 登录类
package View;
/**
*用户登录界面
*/
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class UserLogin extends JDialog implements ActionListener{
// 定义需要的组件
JTextField jtf;
JPasswordField jpw;
JPanel jp;
JButton jb1, jb2;
public static String username;

public static void main(String[] args) {
UserLogin ul = new UserLogin();
}

//构造函数
public UserLogin(){
//从JDialog中获取一个容器
Container ct = this.getContentPane();
//设置布局管理器
this.setLayout(null);

//创建组件
//用户名框
jtf = new JTextField();
jtf.setBounds(115,90,100,20);//位置
//设置下凹的框
jtf.setBorder(BorderFactory.createLoweredBevelBorder());

//密码框
jpw = new JPasswordField();
jpw.setBounds(115,115,100,20);//位置
jp = new JPanel();
jp.setSize(300,200);

//按钮
//登录按钮
jb1 = new JButton(new ImageIcon("images/denglu.jpg"));
jb1.setBounds(70,150,70,30);//位置
jb1.addActionListener(this);//监听
//取消按钮
jb2 = new JButton(new ImageIcon("images/quxiao.jpg"));
jb2.setBounds(160,150,70,30);//位置
jb2.addActionListener(this);//监听
//添加组件

this.add(jtf);
this.add(jpw);
this.add(jb1);
this.add(jb2);
//创建一个BackImage对象
BackImage bi=new BackImage();
//设定图片的位置
bi.setBounds(0,0,300,200);
//把图片添加到JDialog
this.add(bi);
//设置窗体属性
//this.setUndecorated(true);
this.setSize(315,236);//大小
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
this.setLocation(width/2-200,height/2-150);//设置位置
this.setVisible(true);
}
//创建一个内部类,并继承JPanle,用于画背景图片
class BackImage extends JPanel
{Image image;
// image=Toolkit.getDefaultToolkit().getImage("images\\userlogin.jpg");//获得背景图片
//要把图片画到JPanle,需要重写一个Paint方法
public void paint(Graphics g) //此处的paint中的p是小写,
{
image=Toolkit.getDefaultToolkit().getImage("images\\userlogin.jpg");//获得背景图片
g.drawImage(image,0,0,300,200,this);}}
4.1.3 管理员功能界面(教师界面类和学生界面类与此类似)

package View;
/**
* 管理员登陆进去以后的界面
* 选择“学生信息管理”还是“教师信

息管理”
*/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import Model.StuModel;
public class AdmChoose extends JFrame implements ActionListener{
//定义需要的组件
JButton jb1,jb2;
public AdmChoose(){
/*
* 创建组件
*/
//设置空布局
this.setLayout(null);
//创建按钮,设置位置,注册监听
jb1 = new JButton(new ImageIcon("images/stuInfo.png"));
jb1.setBounds(60,60,145,37);
jb1.addActionListener(this);
jb2 = new JButton(new ImageIcon("images/teaInfo.png"));
jb2.setBounds(60,110,145,37);
jb2.addActionListener(this);
this.add(jb1);
this.add(jb2);
//背景面板
BackImage bi = new BackImage();
bi.setBounds(0,0,320,220);
this.add(bi);
//设置窗体属性
this.setTitle("管理员功能界面");
this.setSize(335,260);
this.setLocation(0,0);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}
//创建一个内部类,并继承JPanle,用于画背景图片
class BackImage extends JPanel{
Image image;
//要把图片画到JPanle,需要重写一个Paint方法
public void paint(Graphics g) {//获得背景图片
image=Toolkit.getDefaultToolkit().getImage("images/Achoose.jpg");

g.drawImage(image,0,0,320,220,this);}
//实现监听机制
public void actionPerformed(ActionEvent e) {
//判断是哪个按钮被点击
if(e.getSource()==jb1){
//如果是“学生信息管理”按钮被点击
//创建学生信息管理界面的实例
StuInfoMan s = new StuInfoMan(this,"学生信息管理",true);
}
else if(e.getSource()==jb2){
//如果是“教师信息管理”按钮被点击
//创建教师信息管理界面的实例
TeaInfoMan s = new TeaInfoMan(this,"教师信息管理",true);}}}
4.1.4 学生选课界面实现
package View;
/**
* 学生在点击课程信息表以后进入这个界面
* 显示的为学院提供的课程信息
*/
import java.awt.*;

import javax.swing.*;

import Db.StuSqlHelper;
import Model.ClassModel;
import View.StuInfo.BackImage;

import java.awt.color.CMMException;
import java.awt.event.*;
import java.sql.ResultSet;
import java.sql.SQLException;

public class ClassInfo extends JDialog implements ActionListener{
//定义组件
JButton jb;//确认按钮
JTable jt;//表
ClassModel cm;//课程信息表模型
JScrollPane jsp;//滚动面板

public ClassInfo(Frame owner, String title, boolean modal){
super(owner, title, modal);
//设置布局管理器为空
this.setLayout(null);
//背景面板
BackImage bi = new BackImage();
bi.setBounds(0,0,800,400);
this.add(bi);

//创建表,课程信息模型,设置位置
cm = new ClassModel();
jt = new JTable(cm);
jsp = new JScrollPane(jt);
jsp.setBounds(46,98,565,210);
this.add(jsp);

//创建确认按钮,设置位置注册监听
jb = new JButton(new ImageIcon("images/ClassInfoqueren.jpg"));
jb.setB

ounds(664,130,100,40);
jb.addActionListener(this);
this.add(jb);


//设置窗体属性
this.setSize(816,438);
this.setLocation(335,0);
this.setVisible(true);
}

//创建一个内部类,并继承JPanle,用于画背景图片
class BackImage extends JPanel
{
Image image;
//要把图片画到JPanle,需要重写一个Paint方法
public void paint(Graphics g) {
//获得背景图片
image=Toolkit.getDefaultToolkit()
.getImage("images/ClassInfo.jpg");
g.drawImage(image,0,0,800,400,this);
}
}



@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource()==jb){
//获取表中被点击选中的一行
int row = jt.getSelectedRow();
//如果一行没有选中,弹出提醒框
if(row==-1){
JOptionPane.showMessageDialog(this, "请先选中你要选修的课程!");
}
else {
//获取被选中的那行的第一列数据(学生编号)
String classno = jt.getValueAt(row, 0).toString();

//编写一个Sql语句查询课程信息表的一行数据
String sql1 = "select * from class where classno=?";
String sql2 = "select * from stu where stuno=?";
ResultSet rs1= StuSqlHelper.getsingleInfo(sql1, classno);
ResultSet rs2= StuSqlHelper.getsingleInfo(sql2, https://www.360docs.net/doc/6210895489.html,ername);
try {
rs1.next();
rs2.next();
String sql3 = "insert into score values"
+ "(?,?,?,?,?,?,?,?,?,?);";
String[] info = {
rs1.getString(1),rs1.getString(2),
rs1.getString(3),rs1.getString(4),
rs1.getString(5),rs1.getString(6),
rs1.getString(7),rs2.getString(1),
rs2.getString(2),""
};
StuSqlHelper.UpStuInfo(sql3, info);
} catch (Exception e2) {
}
}
}
}
}

4.1.5 教师录入成绩代码实现
package View;
/**
* 教师在点击录入成绩按钮以后进入这个界面
* 此界面提供教师为选择该教师的学生录入成绩信息
*/
import javax.swing.*;

import Db.StuSqlHelper;
import Model.CheckedModel;

import java.awt.*;
import java.awt.event.*;
import java.sql.*;

public class InsertInfo extends JDialog implements ActionListener{
//定义组件
JButton jb;//录入按钮
JTable jt;//表
CheckedModel cm;//课程信息表模型
JScrollPane jsp;//滚动面板
JTextField jtf;

public InsertInfo(Frame owner, String title, boolean modal){
super(owner, title, modal);
//设置布局管理器为空
this.setLayout(null);
//背景面板
BackImage bi = new BackImage();
bi.setBounds(0,0,800,400);
this.add(bi);

//创建表,课程信息模型,设置位置
cm = new CheckedModel(https://www.360docs.net/doc/6210895489.html,ername);
jt = new JTable(cm);
jsp = new JScrollPane(jt);
jsp.setBounds(86,95,630,210);
this.add(jsp);

//创建输入框,设置位置,添加
jtf = new JTextField();
jtf.setBounds(190,362,168,30);
this.

add(jtf);

//创建确认按钮,设置位置注册监听
jb = new JButton(new ImageIcon("images/InsertInfoqueren.jpg"));
jb.setBounds(380,362,168,30);
jb.addActionListener(this);
this.add(jb);


//设置窗体属性
this.setSize(816,438);
this.setLocation(335,0);
this.setVisible(true);
}



//创建一个内部类,并继承JPanle,用于画背景图片
class BackImage extends JPanel
{
Image image;
//要把图片画到JPanle,需要重写一个Paint方法
public void paint(Graphics g) {
//获得背景图片
image=Toolkit.getDefaultToolkit()
.getImage("images/InsertInfo.jpg");
g.drawImage(image,0,0,800,400,this);
}
}


//实现监听机制
public void actionPerformed(ActionEvent e) {
if(e.getSource()==jb){
//获取表中被点击选中的一行
int row = jt.getSelectedRow();
//如果一行没有选中,弹出提醒框
if(row==-1){
JOptionPane.showMessageDialog(this, "请先选中你要录入成绩的课程!");
}
else {
if(jtf.getText().equals("")){
JOptionPane.showMessageDialog(this, "请先填入你要录入成绩!");

}
else if(!jtf.getText().equals("")){
//获取被选中的那行的第一列数据(学生编号)
String stuno = jt.getValueAt(row,0).toString();
String classno = jt.getValueAt(row,3).toString();
String score = jtf.getText();
//编写一个Sql语句查询课程信息表的一行数据
String sql = "update score set scorenum=?"
+ " where classno=? and stuno=?";
try {
String[] info = {score,classno,stuno};
StuSqlHelper.UpStuInfo(sql, info);
} catch (Exception e2) {}
//更新数据
cm = new CheckedModel(https://www.360docs.net/doc/6210895489.html,ername);
jt.setModel(cm);
jtf.setText("");
}
}
}

}
}
4.2 模型层
4.2.1 学生模型
package Model;
/**
* 学生表模型
*
*/
import java.awt.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import Db.MDB;

public class StuModel extends AbstractTableModel{

Vector row;
Vector col;

//定义操作数据库的东西
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;


//创建一个方法,用于构造方法中获取数据,避免代码冗余
public void init(String sql){
//判断传过来的SQL语句
if(sql.equals("")){
sql = "select * from stu";
}

try {
con = MDB.getConnection();
//创建一个Statement
ps = con.prepareStatement(sql);
//执行sql语句,加过用ResultSet接收
rs = ps.executeQuery();
} catch (Exception e) {}

//列名
col = new Vector();
col.add("学生学号");
col.add("学生姓名");
col.add("学生性别");
col.add("学生生日");
col.add("所在班级");
//行数据
row = new Vector();

//循环

遍历每个值
try {
while(rs.next()){
Vector hang = new Vector();
hang.add(rs.getString(1));
hang.add(rs.getString(2));
hang.add( rs.getString(3));
hang.add(rs.getString(4));
hang.add(rs.getString(5));
row.add(hang);
}
} catch (SQLException e) {
e.printStackTrace();
}
}

//通过传递SQL语句来获得数据模型
public StuModel(String sql){
this.init(sql);
}

//构造函数:用来初始化数据模型
public StuModel(){
this.init("");
}


@Override
public String getColumnName(int column) {
return (String)this.col.get(column);
}

//得到共有多少行
public int getRowCount() {
// TODO Auto-generated method stub
return this.row.size();
}

//得到共有多少列
public int getColumnCount() {
return this.col.size();
}

//得到某行某列的数据
public Object getValueAt(int rowIndex, int columnIndex) {
return ((Vector)this.row.get(rowIndex)).get(columnIndex);
}

}

4.2.2 教师模型
package Model;
/**
* 这是一个教师信息表模型
*
*/
import java.awt.*;
import java.sql.*;
import java.util.*;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import Db.MDB;

public class TeaModel extends AbstractTableModel{

Vector row;
Vector col;

//定义操作数据库的东西
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;


//创建一个方法,用于构造方法中获取数据,避免代码冗余
public void init(String sql){
//判断传过来的SQL语句
if(sql.equals("")){
sql = "select * from tea";
}

try {
con = MDB.getConnection();
//创建一个Statement
ps = con.prepareStatement(sql);
//执行sql语句,加过用ResultSet接收
rs = ps.executeQuery();
} catch (Exception e) {}

//列名
col = new Vector();
col.add("教师编号");
col.add("教师姓名");
col.add("教师性别");
col.add("教师生日");
col.add("教师职称");
col.add("所在院系");
//行数据
row = new Vector();

//循环遍历每个值
try {
while(rs.next()){
Vector hang = new Vector();
hang.add(rs.getString(1));
hang.add(rs.getString(2));
hang.add( rs.getString(3));
hang.add(rs.getString(4));
hang.add(rs.getString(5));
hang.add(rs.getString(6));
row.add(hang);
}
} catch (SQLException e) {
e.printStackTrace();
}
}

//通过传递SQL语句来获得数据模型
public TeaModel(String sql){
this.init(sql);
}

//构造函数:用来初始化数据模型
public TeaModel(){
this.init("");
}


@Override
public String getColumnName(int column) {
return (String)this.col.get(column);
}

//得到共有多少行
public int getRowCount() {
// TODO Auto-generated method stub
return this.row.size();
}

//得到共有多少列
public int getColumnCount() {


return this.col.size();
}

//得到某行某列的数据
public Object getValueAt(int rowIndex, int columnIndex) {
return ((Vector)this.row.get(rowIndex)).get(columnIndex);
}

}


4.2.3 课程模型
package Model;
/**
* 课程表模型
*/

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import javax.swing.table.AbstractTableModel;

import Db.MDB;

public class ClassModel extends AbstractTableModel{

Vector row;
Vector col;

//定义操作数据库的东西
Connection con = null;
PreparedStatement ps = null;
ResultSet rs = null;

//构造函数:用来初始化数据模型
public ClassModel(){
String sql = "select * from class";
try {
con = MDB.getConnection();
//创建一个Statement
ps = con.prepareStatement(sql);
//执行sql语句,加过用ResultSet接收
rs = ps.executeQuery();
} catch (Exception e) {}

//列名
col = new Vector();
col.add("课程编号");
col.add("课程名称");
col.add("课程学分");
col.add("授课教师");
col.add("教师编号");
col.add("教师职称");
col.add("上课地点");
//行数据
row = new Vector();

//循环遍历每个值
try {
while(rs.next()){
Vector hang = new Vector();
hang.add(rs.getString(1));
hang.add(rs.getString(2));
hang.add( rs.getString(3));
hang.add(rs.getString(4));
hang.add(rs.getString(5));
hang.add(rs.getString(6));
hang.add(rs.getString(7));
row.add(hang);
}
} catch (SQLException e) {
e.printStackTrace();
}
}


//获取列名
public String getColumnName(int column) {
return (String)this.col.get(column);
}

//得到共有多少行
public int getRowCount() {
// TODO Auto-generated method stub
return this.row.size();
}

//得到共有多少列
public int getColumnCount() {
return this.col.size();
}

//得到某行某列的数据
public Object getValueAt(int rowIndex, int columnIndex) {
return ((Vector)this.row.get(rowIndex)).get(columnIndex);
}

4.3 连接操作数据库工具层
4.3.1 连接数据库类
package Db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

/**
*创建一个连接数据库的类
*连接的是SQLServer2000
*/
public class MDB {

//定义一个方法获取Connection
public static Connection getConnection(){
Connection con = null;
try {
//1.加载驱动
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//编写字符串表示地址,用户名,密码
String url = "jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=master";
String user = "sa";
String password = "";
//2.获取一个连接Connection
con = DriverManager.getConnection(url, user

, password);
} catch (Exception e) {
e.printStackTrace();
}
return con;
}

//定义一个方法关闭Connection
public static void closeConnection(Connection con){
try {
if(con!=null)
con.close();
} catch (SQLException e) {
e.printStackTrace();
}

}

//定义一个方法关闭Statement
public static void closeStatement(Statement sta){
try {
if(sta!=null)
sta.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

//定义一个方法关闭ResultSet
public static void closeResultSet(ResultSet rst){
try {
if(rst!=null)
rst.close();
} catch (SQLException e) {
e.printStackTrace();
}
}

//定义一个方法关闭Connection,Statement,ResultSet
public static void close(Connection con,Statement sta,ResultSet rst){
closeResultSet(rst);
closeStatement(sta);
closeConnection(con);
}

//定义一个方法关闭Connection,Statement
public static void close(Connection con,Statement sta){
closeStatement(sta);
closeConnection(con);
}






}

4.3.2 操作数据库类
package Db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

/**
*模型操作数据的类
*
*/
public class StuSqlHelper {
//定义一个方法对学生表进行添加操作
//定义操作数据库的东西
static Connection con = null;
static PreparedStatement ps = null;
static ResultSet rs = null;
public static void UpStuInfo(String sql,String[] info){
try {
con = MDB.getConnection();
//创建一个Statement
ps = con.prepareStatement(sql);
for(int i=0;i//循环添加参数
ps.setString(i+1, info[i]);
}
//执行sql语句
ps.executeUpdate();
} catch (Exception e) {}
}
//定义一个方法用来查询只有一个注入参数的
public static ResultSet getsingleInfo(String sql,String id){
try {
con = MDB.getConnection();
//创建一个Statement
ps =con.prepareStatement(sql);
ps.setString(1, id);
//执行sql语句,结果用ResultSet接收
rs =ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}

//查询所有信息
public static ResultSet getsingleInfo(String sql){
try {
con = MDB.getConnection();
//创建一个Statement
ps =con.prepareStatement(sql);
//执行sql语句,结果用ResultSet接收
rs =ps.executeQuery();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}



}


5 课程设计体会
该系统主要实现了学生选课的功能,这个系统是我独立完成,从需求分析,界面的搭建,到数据库的连接,表格,存储过程和存储过程等的建立,在这段时间的摸索中,我确实学到了很多东西,特别是对以前不太了解的Jav

a Swing组件有了更深刻的了解。比如JTable,对于它的用法我在网上找了很多资料,JTable的建立有各种不同的方法,可以使用DefaultTableModel类来实现,如DefaultTableModel dtm=new DefaultTableModel(new Object [] {"","课程编号","课程名称","学分","任课教师","教师职称","上课地点","以选人数"},0));然后再table.setModel(dtm); 或者继承AbstractTableModel类,还有对于如何在JTable中添加Swing组件,原本我是直接新建一个JcheckBox对象直接添加到表格的 单元格里,结果发现只能显示出一串字符串,上网查找后才知道,要用DefaultCellEditor来添加Swing组件,再设置setCellRenderer(new MyTableRenderer()) 这是一个实现了TableCellRenderer接口的JCheckBox。TableCellRenderer可以看做是Swing组件的呈现器,这样Table就会把内容显示绘制交给JCheckBox了。对于数据库,我尽量将对数据库的操作放在存储过程中,这样的抽象和封装使得源程序代码更加容易理解,而且在web应用系统中也可以避免发生不安全的状况,我想这是一个号的程序员应当要养成的习惯,在这次的课程设计中,层次化,模块化,抽象化也是我学到的一个重要的经验,参考一些资料后发现模块化能使程序设计更加简单,设计代码时目标更加明确,效率更高,以前虽然也知道这些道理,但自己真正实施起来却感到无从下手,比如前面的数据库操作和数据库资源配置文件,就是我从书中看来的,这样做的好处是,在程序中操作数据库的时候避免了使用很多try和catch语句,是代码更加简洁,更容易理解,此外需要连接不同的数据库时只要修改数据库的资源配置文件sysConfig.properties就可以了。原本我是想用jsp 做一个web应用程序的,因为对于学生选课系统做成单版的确实没什么实用性,但是我对jsp还不太熟悉,所以这次先做个单机版的,以后我会尝试用jsp来做这个系统。








参考文献
[1] 赵洛育.Java从入门到精通[M]. 北京: 清华大学出版社,2012: 19-54.
[2] 赵洛育.SQL Server从入门到精通[M]. 北京: 清华大学出版社,2012: 19-54.
[3] Bruce Eckel. JAVA编程思想第四版 [M]. 北京:机械工业出版社,2006.
[4] 洪维恩,何嘉. Java2面向对象程序设计[M].北京:中国铁道出版社,2005.
[5] 郝玉龙.JavaEE 编程技术[M].北京:清华大学出版社,2008.
[6] 尉哲明,李慧哲等. Java技术教程[M].北京:清华大学出版社,2002.
[7] 萨师煊,王珊.数据库系统概论[M].北京:高等教育出版社,2000.
[8] 孙一林,彭波. Java数据库编程实例[M] .北京:清华大学出版社,2002..
[9] 清宏计算机工作室. JAVA编程技巧[M].北京:机械工业出版社,2004.




英文摘要
Research and Design of the Intelligent Monitoring System of Temperature

(Times New Roman三号、居中)
×××(Times New Roman小四号、居中)
(School of Information & Computer, Anhui Agricultural University, Hefei 230036) (Times New Roman小四号、居中)
Abstract(Times New Roman小四号、加粗、顶格): This thesis introduces intelligent monitoring system of temperature on the basis of the AT89C51. This system provides the design of the systematic hardware circuit. It elaborates the designs of communication protocol, MCU procedure, and PC communication procedure. It realized that controlling automatically and restricting warning function, etc. This system goes to three kinds of control modes of operating, keystroke control, PC remote control and infrared control. It has strengthened the practicability of this system. (Times New Roman小四号、1.5倍行距、两端对齐)
Key words: Java,SQL Server 2000,界面搭建,可移植性,需求分析,存储过程
致 谢
在这四年的学习生活中,学校严谨的治学作风、良好的学习氛围、老师们认真的工作态度,都给我留下了非常深刻的印象。在这里我真诚地向那些曾经帮助过我、关心过我的老师、同学和朋友们说一声:谢谢!祝愿他们一生平安!


1


相关文档
最新文档