图形用户界面(Graphics User Interface,GUI)是用户与程序交互的窗口,比命令行的界面更加直观并且更好操作。
这是本人在学习java图形界面开发阶段一步一步实现的超级简易的学生管理系统。虽然说不入大神法眼,但这确实是费了自己不少心血。对于我这样的菜鸟来说,考虑不周到,一不小心就Exception,然后就是自己调呀调。在此分享出来希望对和我一样的菜鸟有帮助。
程序完整代码下载地址见:
https://github.com/chaohuangtianjie994/The-System-of-Student-Manager
步骤一:静态登录界面的实现。
代码如下:
/** * 功能:学生成绩管理系统 * 步骤1、登录界面的静态实现 * author:ywq */ import java.awt.*; import javax.swing.*; public class Login extends JFrame{ //定义组件 JPanel jp1,jp2,jp3;//面板 JLabel jlb1,jlb2;//标签 JButton jb1,jb2;//按钮 JTextField jtf;//文本 JPasswordField jpf;//密码 public static void main(String[] args) { Login win=new Login(); } //构造函数 public Login(){ //创建面板 jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); //创建标签 jlb1=new JLabel("用户名"); jlb2=new JLabel("密 码"); //创建按钮 jb1=new JButton("登录"); jb2=new JButton("重置"); //创建文本框 jtf=new JTextField(10); //创建密码框 jpf=new JPasswordField(10); //设置布局管理 this.setLayout(new GridLayout(3, 1));//网格式布局 //加入各个组件 jp1.add(jlb1); jp1.add(jtf); jp2.add(jlb2); jp2.add(jpf); jp3.add(jb1); jp3.add(jb2); //加入到JFrame this.add(jp1); this.add(jp2); this.add(jp3); //设置窗体 this.setTitle("用户登录");//窗体标签 this.setSize(300, 150);//窗体大小 this.setLocationRelativeTo(null);//在屏幕中间显示(居中显示) this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//退出关闭JFrame this.setVisible(true);//显示窗体 //锁定窗体 this.setResizable(false); } }
本静态界面的实现,使用了网格布局,3行1列,在每一行中放入了一个JPanel面板,每个面板上又分别放入所需的组件,整体构成了一个静态的登录界面。
步骤二:添加监听,并且进行验证用户名和密码。
代码如下:
/* * 功能:学生成绩管理系统 * 步骤1:登录界面的静态实现 * 步骤2:添加对各个组件的监听。 * 步骤3:对用户名和密码进行验证。 * author:ywq */ package com.package_1; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; public class Login extends JFrame implements ActionListener { //定义组件 JButton jb1,jb2=null; JRadioButton jrb1,jrb2=null; JPanel jp1,jp2,jp3,jp4=null; JTextField jtf=null; JLabel jlb1,jlb2,jlb3=null; JPasswordField jpf=null; ButtonGroup bg=null; //设定用户名和密码 final String stu_name="6"; final String stu_pwd="1"; final String tea_name="5"; final String tea_pwd="1"; public static void main(String[] args) { // TODO Auto-generated method stub Login ms=new Login(); } public Login() { //创建组件 jb1=new JButton("登录"); jb2=new JButton("重置"); //设置监听 jb1.addActionListener(this); jb2.addActionListener(this); jrb1=new JRadioButton("教师"); jrb2=new JRadioButton("学生"); bg=new ButtonGroup(); bg.add(jrb1); bg.add(jrb2); jrb2.setSelected(true); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jp4=new JPanel(); jlb1=new JLabel("用户名:"); jlb2=new JLabel("密 码:"); jlb3=new JLabel("权 限:"); jtf=new JTextField(10); jpf=new JPasswordField(10); //加入到JPanel中 jp1.add(jlb1); jp1.add(jtf); jp2.add(jlb2); jp2.add(jpf); jp3.add(jlb3); jp3.add(jrb1); jp3.add(jrb2); jp4.add(jb1); jp4.add(jb2); //加入JFrame中 this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); //设置布局管理器 this.setLayout(new GridLayout(4,1)); //给窗口设置标题 this.setTitle("学生成绩管理系统"); //设置窗体大小 this.setSize(300,200); //设置窗体初始位置 this.setLocation(200, 150); //设置当关闭窗口时,保证JVM也退出 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //显示窗体 this.setVisible(true); this.setResizable(true); } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand()=="登录") { //如果选中教师登录 if(jrb1.isSelected()) { tealogin(); }else if(jrb2.isSelected()) //学生在登录系统 { stulogin(); } }else if(e.getActionCommand()=="重置") { clear(); } } //学生登录判断方法 public void stulogin() { if(stu_name.equals(jtf.getText())&&stu_pwd.equals(jpf.getText())) { // System.out.println("登录成功"); JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE); clear(); }else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jtf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else { JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE); //清空输入框 clear(); } } //教师登录判断方法 public void tealogin() { if(tea_name.equals(jtf.getText())&&tea_pwd.equals(jpf.getText())) { // System.out.println("登录成功"); JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE); clear(); }else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jtf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else { JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE); //清空输入框 clear(); } } //清空文本框和密码框 public void clear() { jtf.setText(""); jpf.setText(""); } }
本程序加入了对各个组件的监听,首先implements ActionListener接口,然后注册监听。在ActionPerformance方法中进行相应的处理事件。
当点击登录按钮时,首先判断是哪个权限的用户在进行登录,分别调用taelogin()和stulogin()方法来进行验证。在验证方法中,对文本框和密码框的内容进行一个判断,分别弹出不同的提示信息。
步骤三:(1)程序连接数据库来进行用户名和密码的验证!!!
(2)验证成功后进行界面的切换!!!
代码如下:
/* * 功能:学生成绩管理系统 * 步骤1、登录界面的静态实现 * 步骤2:实现界面的切换 * 步骤3:使用数据库来验证用户名和密码 * author:ywq */ package com.package_2; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; public class login extends JFrame implements ActionListener { //定义登录界面的组件 JButton jb1,jb2,jb3=null; JRadioButton jrb1,jrb2=null; JPanel jp1,jp2,jp3,jp4=null; JTextField jtf=null; JLabel jlb1,jlb2,jlb3=null; JPasswordField jpf=null; ButtonGroup bg=null; //设定用户名和密码 static String userword; static String pwd; static Connection ct=null; PreparedStatement ps=null; ResultSet rs=null; public static void main(String[] args) { // TODO Auto-generated method stub login ms=new login(); try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ct=DriverManager.getConnection("jdbc:odbc:ywq"); } catch (Exception e) { e.printStackTrace(); } } //构造函数 public login() { //创建组件 jb1=new JButton("登录"); jb2=new JButton("重置"); jb3=new JButton("退出"); //设置监听 jb1.addActionListener(this); jb2.addActionListener(this); jb3.addActionListener(this); //以上三个按钮的监听统一放在了actionPerformance()中 //监听也可以是下边这种方式 // jb3.addActionListener(new ActionListener() // { // // @Override // public void actionPerformed(ActionEvent e) { // // TODO Auto-generated method stub // System.exit(0); // } // // }); jrb1=new JRadioButton("教师"); jrb2=new JRadioButton("学生"); bg=new ButtonGroup(); bg.add(jrb1); bg.add(jrb2); jrb2.setSelected(true); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jp4=new JPanel(); jlb1=new JLabel("用户名:"); jlb2=new JLabel("密 码:"); jlb3=new JLabel("权 限:"); jtf=new JTextField(10); jpf=new JPasswordField(10); //加入到JPanel中 jp1.add(jlb1); jp1.add(jtf); jp2.add(jlb2); jp2.add(jpf); jp3.add(jlb3); jp3.add(jrb1); jp3.add(jrb2); jp4.add(jb1); jp4.add(jb2); jp4.add(jb3); //加入JFrame中 this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); //设置布局管理器 this.setLayout(new GridLayout(4,1)); //给窗口设置标题 this.setTitle("学生成绩管理系统"); //设置窗体大小 this.setSize(300,200); //设置窗体初始位置 this.setLocation(200, 150); //设置当关闭窗口时,保证JVM也退出 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //显示窗体 this.setVisible(true); this.setResizable(true); } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand()=="退出") { System.exit(0); }else if(e.getActionCommand()=="登录") { //如果选中教师登录 if(jrb1.isSelected()) { //创建火箭车 try { ps=ct.prepareStatement("select * from info where 权限=? "); //给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式 ps.setString(1, "教师"); //ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集 rs=ps.executeQuery(); //循环取出 while(rs.next()){ //将教师的用户名和密码取出 userword=rs.getString(2); pwd=rs.getString(3); System.out.println("成功获取到密码和用户名from数据库"); System.out.println(userword+"\t"+pwd+"\t"); } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //从数据库得到用户名和密码后调用登录方法,与输入的用户名和密码作比较 tealogin(); }else if(jrb2.isSelected()) //学生在登录系统 { //创建火箭车 try { ps=ct.prepareStatement("select * from info where 权限=? "); //给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式 ps.setString(1, "学生"); //ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集 rs=ps.executeQuery(); //循环取出 while(rs.next()){ //将学生的用户名和密码取出 userword=rs.getString(2); pwd=rs.getString(3); System.out.println("成功获取到密码和用户名from数据库"); System.out.println(userword+"\t"+pwd+"\t"); } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } //从数据库得到用户名和密码后调用登录方法,与输入的用户名和密码作比较 stulogin(); } }else if(e.getActionCommand()=="重置") { clear(); } } //清空文本框和密码框 public void clear() { jtf.setText(""); jpf.setText(""); } //学生登录判断方法 public void stulogin() { if(userword.equals(jtf.getText())&&pwd.equals(jpf.getText())) { // System.out.println("登录成功"); JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE); clear(); //关闭当前界面 dispose(); //创建一个新界面 UI ui=new UI(); }else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jtf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else { JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE); //清空输入框 clear(); } } //教师登录判断方法 public void tealogin() { if(userword.equals(jtf.getText())&&pwd.equals(jpf.getText())) { // System.out.println("登录成功"); JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE); clear(); //关闭当前界面 dispose(); //创建一个新界面,适用于教师来管理学生 UI ui=new UI(); }else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jtf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else { JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE); //清空输入框 clear(); } } }
首先建立相应的数据库,如图所示:
在程序中,首先是在主函数中(1)加载数据库驱动 。(2)建立连接
此处有问题,可参考博客 http://blog.csdn.net/qq_25827845/article/details/50836362
在进行验证时,通过建立“火箭车”将所需的SQL语句发送到数据库,并且查询得到相应的数据。利用此数据和用户输入的用户名和密码进行验证。当验证成功时,即进行界面的跳转。
页面跳转关键部分:
(1)调用dispose()方法关闭当前界面
(2)重新new一个新界面,比如本例中的new UI();其中,UI是另一个完整的界面。
如此实现了界面的切换。
UI界面的代码如下:
package com.package_2; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class UI extends JFrame implements ActionListener { //定义组件 JButton jb1,jb2=null; JPanel jp1,jp2,jp3=null; JLabel jlb1,jlb2,jlb3,jlb4=null; public static void main(String[] args) { // TODO Auto-generated method stub // UI ui=new UI(); } //构造函数 public UI() //不能申明为void!!!!!否则弹不出新界面 { //创建组件 jb1=new JButton("课程管理"); jb2=new JButton("成绩查询"); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jlb1=new JLabel("姓名"); jlb2=new JLabel("学号"); jlb3=new JLabel("最新公告:"); jlb4=new JLabel("我校举行六十周年校庆的通知"); jp1.add(jlb1); jp1.add(jlb2); jp2.add(jb1); jp2.add(jlb3); jp3.add(jb2); jp3.add(jlb4); this.add(jp1); this.add(jp2); this.add(jp3); //设置布局管理器 this.setLayout(new GridLayout(3,3,50,50)); this.setTitle("学生成绩管理系统"); this.setSize(400,300); this.setLocation(200, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } }
步骤4:(1)程序连接数据库来进行用户名和密码的验证!!!
(2)验证成功后进行界面的切换!!!【对步骤三的代码进行一定的优化】
代码如下:Login.java
/* * 功能:学生成绩管理系统 * 步骤1、登录界面的静态实现 * 步骤2:实现界面的切换 * 步骤3:使用数据库来验证用户名和密码 * 步骤4:对代码进行优化。增加专门用来与数据库进行连接的类 * author:ywq */ package com.package_5; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; public class Login extends JFrame implements ActionListener { //定义登录界面的组件 JButton jb1,jb2,jb3=null; JRadioButton jrb1,jrb2=null; JPanel jp1,jp2,jp3,jp4=null; JTextField jtf=null; JLabel jlb1,jlb2,jlb3=null; JPasswordField jpf=null; ButtonGroup bg=null; //菜单项 JMenuBar jmb=null; JMenu jm=null; JMenuItem jmi1,jmi2=null; public static void main(String[] args) { // TODO Auto-generated method stub Login ms=new Login(); } //构造函数 public Login() { //创建组件 jb1=new JButton("登录"); jb2=new JButton("重置"); jb3=new JButton("退出"); //设置监听 jb1.addActionListener(this); jb2.addActionListener(this); jb3.addActionListener(this); jmb=new JMenuBar(); //JMenuBar指菜单栏 jm=new JMenu("选项"); //JMenu是菜单栏中的选项栏 jmi1=new JMenuItem("开始"); //JMenuItem指选项栏中的选项 jmi2=new JMenuItem("退出系统"); jm.add(jmi1); jm.add(jmi2); jmb.add(jm); jrb1=new JRadioButton("教师",true); jrb2=new JRadioButton("学生"); bg=new ButtonGroup(); bg.add(jrb1); bg.add(jrb2); // jrb2.setSelected(true); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jp4=new JPanel(); jlb1=new JLabel("用户名:"); jlb2=new JLabel("密 码:"); jlb3=new JLabel("权 限:"); jtf=new JTextField(10); jpf=new JPasswordField(10); //加入到JPanel中 jp1.add(jlb1); jp1.add(jtf); jp2.add(jlb2); jp2.add(jpf); jp3.add(jlb3); jp3.add(jrb1); jp3.add(jrb2); jp4.add(jb1); jp4.add(jb2); jp4.add(jb3); //加入JFrame中 this.setJMenuBar(jmb); this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); //设置布局管理器 this.setLayout(new GridLayout(4,1)); //给窗口设置标题 this.setTitle("学生成绩管理系统"); //设置窗体大小 this.setSize(300,250); //设置窗体初始位置 this.setLocation(200, 150); //设置当关闭窗口时,保证JVM也退出 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //显示窗体 this.setVisible(true); this.setResizable(true); } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand()=="退出") { System.exit(0); }else if(e.getActionCommand()=="登录") { //当点击登录按钮时,首先与数据库建立连接 GetSQL.ConnectSQL(); //如果选中教师登录 if(jrb1.isSelected()) { GetSQL.sqlquery("教师"); //从数据库得到用户名和密码后调用登录方法,与输入的用户名和密码作比较 this.tealogin(); }else if(jrb2.isSelected()) //学生在登录系统 { GetSQL.sqlquery("学生"); //从数据库得到用户名和密码后调用登录方法,与输入的用户名和密码作比较 this.stulogin(); } }else if(e.getActionCommand()=="重置") { this.clear(); } } //清空文本框和密码框 public void clear() { jtf.setText(""); jpf.setText(""); } //学生登录判断方法 public void stulogin() { if(GetSQL.userword.equals(jtf.getText())&&GetSQL.pwd.equals(jpf.getText())) { // System.out.println("登录成功"); JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE); this.clear(); //关闭当前界面 dispose(); //创建一个新界面 Stu_UI ui=new Stu_UI(); }else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jtf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else { JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE); //清空输入框 this.clear(); } } //教师登录判断方法 public void tealogin() { if(GetSQL.userword.equals(jtf.getText())&&GetSQL.pwd.equals(jpf.getText())) { // System.out.println("登录成功"); JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE); this.clear(); //关闭当前界面 dispose(); //创建一个新界面,适用于教师来管理学生 Teacher t=new Teacher(); }else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jtf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else { JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE); //清空输入框 this.clear(); } } }
SQL.java 负责与数据库建立连接,包括俩方法。一个是连接数据库方法,一个是查询方法。可进一步扩展。
package com.package_5; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; //写一个类,用来与数据库建立连接,并且查询数据 class GetSQL { //设定用户名和密码 static String userword; static String pwd; static Connection ct=null; static PreparedStatement ps=null; static ResultSet rs=null; //用于连接数据库的方法,可用于子类的继承 public static void ConnectSQL() { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ct=DriverManager.getConnection("jdbc:odbc:ywq"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } //用于向数据库进行查询的方法 public static void sqlquery(String s) { //创建火箭车 try { ps=ct.prepareStatement("select * from info where 权限=? "); //给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式 ps.setString(1, s); //ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集 rs=ps.executeQuery(); //循环取出 while(rs.next()){ //将教师的用户名和密码取出 userword=rs.getString(2); pwd=rs.getString(3); System.out.println("成功获取到密码和用户名from数据库"); System.out.println(userword+"\t"+pwd+"\t"); } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }
Stu_UI.java 学生登录成功后跳转的界面
package com.package_5; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Stu_UI extends JFrame implements ActionListener { //定义组件 JButton jb1,jb2=null; JPanel jp1,jp2,jp3=null; JLabel jlb1,jlb2,jlb3,jlb4=null; // public static void main(String[] args) { // // TODO Auto-generated method stub // Stu_UI ui=new Stu_UI(); // } //构造函数 public Stu_UI() //不能申明为void!!!!!否则弹不出新界面 { //创建组件 jb1=new JButton("课程管理"); jb2=new JButton("成绩查询"); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jlb1=new JLabel("姓名"); jlb2=new JLabel("学号"); jlb3=new JLabel("最新公告:"); jlb4=new JLabel("我校举行六十周年校庆的通知"); jp1.add(jlb1); jp1.add(jlb2); jp2.add(jb1); jp2.add(jlb3); jp3.add(jb2); jp3.add(jlb4); this.add(jp1); this.add(jp2); this.add(jp3); //设置布局管理器 this.setLayout(new GridLayout(3,3,50,50)); this.setTitle("学生成绩管理系统"); this.setSize(400,300); this.setLocation(200, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } }
package com.package_5; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class Teacher extends JFrame implements ActionListener{ //定义组件 JLabel jl2=null; JTextField jtf=null; JButton jb=null; JPanel jp1,jp2=null; JTable jtable=null; String name=null; String num=null; static Connection ct=null; PreparedStatement ps=null; ResultSet rs=null; // public static void main(String[] args) { // // TODO Auto-generated method stub // Teacher t=new Teacher(); // // try { // Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // ct=DriverManager.getConnection("jdbc:odbc:ywq"); // } catch (Exception e) { // // e.printStackTrace(); // } // // } //构造函数 public Teacher() { //创建组件 jl2=new JLabel("请输入学号:"); jtf=new JTextField(10); jb=new JButton("查询"); //设置监听 jb.addActionListener(this); //设置表格 final Object[] columnNames = {"姓名","学号"}; Object[][] rowData = { {"小明","2015110512"}, {"小","2015110"}, {"小红","2015110511"} }; jtable=new JTable(rowData, columnNames); jp1=new JPanel(); jp2=new JPanel(); jp1.add(jl2); jp1.add(jtf); jp1.add(jb); jp2.add(jtable); this.add(jp1); this.add(jp2); this.setLayout(new GridLayout(2,3)); this.setTitle("学生成绩管理系统—教师"); this.setSize(500,400); this.setLocation(200, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand()=="查询") { //JOptionPane.showMessageDialog(null,"查询成功!","提示消息",JOptionPane.WARNING_MESSAGE); //创建火箭车 try { ps=ct.prepareStatement("select * from info where xuehao=? "); //给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式 ps.setString(1, jtf.getText()); //ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集 rs=ps.executeQuery(); //循环取出 if(rs.next()) { name=rs.getString(5); System.out.println("查询成功from数据库"); System.out.println(name+"\t"); JOptionPane.showMessageDialog(null,"查询成功!","提示消息",JOptionPane.WARNING_MESSAGE); }else { System.out.println("查询失败"); JOptionPane.showMessageDialog(null,"查询失败!","提示消息",JOptionPane.WARNING_MESSAGE); } // while(rs.next()){ // //将教师的用户名和密码取出 //// num=rs.getString(4); // name=rs.getString(5); // System.out.println("查询成功from数据库"); // System.out.println(name+"\t"); // } } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } } }
步骤5:优化数据库验证条件,使用不同的表来进行查询。
教师界面增加查询功能。
代码如下:Login6.java
/* * 功能:学生成绩管理系统 * 步骤1、登录界面的静态实现 * 步骤2:实现界面的切换 * 步骤3:使用数据库来验证用户名和密码 * 步骤4:对代码进行优化。增加专门用来与数据库进行连接的类 * 步骤5:优化代码,增加判断条件。 * 步骤6:使用数据库进行查询时,优化查询方法和判断条件。数据库的表中可有多个数据。引入不同的表来查询。 * 步骤7:教师界面实现了查询某个学生信息和某教师信息的功能。 * author:ywq */ package com.package_7; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.sql.*; public class Login6 extends JFrame implements ActionListener { //定义登录界面的组件 JButton jb1,jb2,jb3=null; JRadioButton jrb1,jrb2=null; JPanel jp1,jp2,jp3,jp4=null; JTextField jtf=null; JLabel jlb1,jlb2,jlb3=null; JPasswordField jpf=null; ButtonGroup bg=null; //菜单项 JMenuBar jmb=null; JMenu jm=null; JMenuItem jmi1,jmi2=null; public static void main(String[] args) { // TODO Auto-generated method stub Login6 ms=new Login6(); } //构造函数 public Login6() { //创建组件 jb1=new JButton("登录"); jb2=new JButton("重置"); jb3=new JButton("退出"); //设置监听 jb1.addActionListener(this); jb2.addActionListener(this); jb3.addActionListener(this); jmb=new JMenuBar(); //JMenuBar指菜单栏 jm=new JMenu("选项"); //JMenu是菜单栏中的选项栏 jmi1=new JMenuItem("开始"); //JMenuItem指选项栏中的选项 jmi2=new JMenuItem("退出系统"); jm.add(jmi1); jm.add(jmi2); jmb.add(jm); jrb1=new JRadioButton("教师",true); jrb2=new JRadioButton("学生"); bg=new ButtonGroup(); bg.add(jrb1); bg.add(jrb2); // jrb2.setSelected(true); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jp4=new JPanel(); jlb1=new JLabel("用户名:"); jlb2=new JLabel("密 码:"); jlb3=new JLabel("权 限:"); jtf=new JTextField(10); jpf=new JPasswordField(10); //加入到JPanel中 jp1.add(jlb1); jp1.add(jtf); jp2.add(jlb2); jp2.add(jpf); jp3.add(jlb3); jp3.add(jrb1); jp3.add(jrb2); jp4.add(jb1); jp4.add(jb2); jp4.add(jb3); //加入JFrame中 this.setJMenuBar(jmb); this.add(jp1); this.add(jp2); this.add(jp3); this.add(jp4); //设置布局管理器 this.setLayout(new GridLayout(4,1)); //给窗口设置标题 this.setTitle("学生成绩管理系统"); //设置窗体大小 this.setSize(300,250); //设置窗体初始位置 this.setLocation(200, 150); //设置当关闭窗口时,保证JVM也退出 this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //显示窗体 this.setVisible(true); this.setResizable(true); } @Override public void actionPerformed(ActionEvent e) { if(e.getActionCommand()=="退出") { System.exit(0); }else if(e.getActionCommand()=="登录") { if(!jtf.getText().isEmpty() && !jpf.getText().isEmpty()) { //当点击登录按钮时,首先与数据库建立连接 GetSQL.ConnectSQL(); //如果选中教师登录 if(jrb1.isSelected()) { GetSQL.querytea("教师",jtf.getText()); //首先判断是否存在该用户,即是否得到了密码 if(GetSQL.pwd ==null) { this.clear(); }else { //调用登录方法 this.tealogin(); } }else if(jrb2.isSelected()) //学生在登录系统 { GetSQL.querystu("学生",jtf.getText()); //首先判断是否存在该用户,即是否得到了密码 if(GetSQL.pwd ==null) { this.clear(); }else { //调用登录方法 this.stulogin(); } } }else if(jtf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名","提示消息",JOptionPane.WARNING_MESSAGE); this.clear(); }else if(jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入密码","提示消息",JOptionPane.WARNING_MESSAGE); this.clear(); } }else if(e.getActionCommand()=="重置") { this.clear(); } } //清空文本框和密码框 public void clear() { jtf.setText(""); jpf.setText(""); } //学生登录判断方法 public void stulogin() { if(GetSQL.pwd.equals(jpf.getText())) { // System.out.println("登录成功"); JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE); this.clear(); //关闭当前界面 dispose(); //创建一个新界面 Stu_UI6 ui=new Stu_UI6(); }else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jtf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else { JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE); //清空输入框 this.clear(); } } //教师登录判断方法 public void tealogin() { if(GetSQL.pwd.equals(jpf.getText())) { // System.out.println("登录成功"); JOptionPane.showMessageDialog(null,"登录成功!","提示消息",JOptionPane.WARNING_MESSAGE); this.clear(); //关闭当前界面 dispose(); //创建一个新界面,适用于教师来管理学生 Teacher6 t=new Teacher6(); }else if(jtf.getText().isEmpty()&&jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名和密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jtf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入用户名!","提示消息",JOptionPane.WARNING_MESSAGE); }else if(jpf.getText().isEmpty()) { JOptionPane.showMessageDialog(null,"请输入密码!","提示消息",JOptionPane.WARNING_MESSAGE); }else { JOptionPane.showMessageDialog(null,"用户名或者密码错误!\n请重新输入","提示消息",JOptionPane.ERROR_MESSAGE); //清空输入框 this.clear(); } } }
SQL.java
/* * 功能:用来和数据库SQLserver进行连接,以及相应的查询方法。 */ package com.package_7; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import javax.swing.JOptionPane; //写一个类,用来与数据库建立连接,并且查询数据 class GetSQL { // 设定用户名和密码 static String userword; static String pwd; static String english; static String num; static String name; static String chinese; static String zhengzhi; static String math; static String age; static String salary; static String sex; static String zhicheng; static String teanum; static String teaname; static Connection ct = null; static PreparedStatement ps = null; static ResultSet rs = null; // 用于连接数据库的方法,可用于子类的继承 public static void ConnectSQL() { try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); ct = DriverManager.getConnection("jdbc:odbc:ywq"); System.out.println("The SQL is connected"); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } // 用于向数据库进行查询的方法 public static void querystu(String s,String username) { // 创建火箭车 try { ps = ct.prepareStatement("select * from info where 权限=? and 用户名=? "); // 给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式 ps.setString(1, s); ps.setString(2, username); // ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集 rs = ps.executeQuery(); // 循环取出 if (rs.next()) { // 将教师的用户名和密码取出 userword = rs.getString(2); pwd = rs.getString(3); System.out.println("成功获取到密码和用户名from数据库"); System.out.println(userword + "\t" + pwd + "\t"); }else { JOptionPane.showMessageDialog(null, "没有此用户,请重新输入!", "提示消息", JOptionPane.WARNING_MESSAGE); } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } //在教师表中进行查询 public static void querytea(String s,String name ) { // 创建火箭车 try { ps = ct.prepareStatement("select * from info_tea where 权限=? and 用户名=? "); // 给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式 ps.setString(1, s); ps.setString(2, name); // ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集 rs = ps.executeQuery(); // 循环取出 if (rs.next()) { // 将教师的用户名和密码取出 userword = rs.getString(2); pwd = rs.getString(3); System.out.println("成功获取到密码和用户名from数据库"); System.out.println(userword + "\t" + pwd + "\t"); }else { JOptionPane.showMessageDialog(null, "没有此用户,请重新输入!", "提示消息", JOptionPane.WARNING_MESSAGE); } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } //从数据库中根据学号或者教工号来查询数据,并且填入表格。 public static void getdatastu(String s) { // 创建火箭车 try { ps = ct.prepareStatement("select * from info where 学号 =? "); // 给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式 ps.setString(1, s); // ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集 rs = ps.executeQuery(); if(rs.next()) { // 将教师的用户名和密码取出 num = rs.getString(4); name = rs.getString(5); math = rs.getString(6); chinese = rs.getString(7); english = rs.getString(8); zhengzhi = rs.getString(9); }else { JOptionPane.showMessageDialog(null, "沒有此学生,请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE); } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } public static void getdatatea(String s) { // 创建火箭车 try { ps = ct.prepareStatement("select * from info_tea where 教师编号号 =? "); // 给?赋值(可防止SQL注入漏洞问题),不要直接使用拼接的方式 ps.setString(1, s); // ResultSet结果集,大家可以把ResultSet理解成返回一张表行的结果集 rs = ps.executeQuery(); if(rs.next()) { // 将教师的用户名和密码取出 teanum = rs.getString(4); teaname = rs.getString(5); sex = rs.getString(6); salary = rs.getString(7); zhicheng = rs.getString(8); age = rs.getString(9); }else { JOptionPane.showMessageDialog(null, "沒有此教师,请重新输入", "提示消息", JOptionPane.WARNING_MESSAGE); } } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }
/* * 功能:学生登录成功界面。 * */ package com.package_7; import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Stu_UI6 extends JFrame implements ActionListener { //定义组件 JButton jb1,jb2=null; JPanel jp1,jp2,jp3=null; JLabel jlb1,jlb2,jlb3,jlb4=null; // public static void main(String[] args) { // // TODO Auto-generated method stub // Stu_UI6 ui=new Stu_UI6(); // } //构造函数 public Stu_UI6() //不能申明为void!!!!!否则弹不出新界面 { //创建组件 jb1=new JButton("课程管理"); jb2=new JButton("成绩查询"); jp1=new JPanel(); jp2=new JPanel(); jp3=new JPanel(); jlb1=new JLabel("姓名"); jlb2=new JLabel("学号"); jlb3=new JLabel("最新公告:"); jlb4=new JLabel("我校举行六十周年校庆的通知"); jp1.add(jlb1); jp1.add(jlb2); jp2.add(jb1); jp2.add(jlb3); jp3.add(jb2); jp3.add(jlb4); this.add(jp1); this.add(jp2); this.add(jp3); //设置布局管理器 this.setLayout(new GridLayout(3,3,50,50)); this.setTitle("学生成绩管理系统"); this.setSize(400,300); this.setLocation(200, 200); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); } @Override public void actionPerformed(ActionEvent e) { // TODO Auto-generated method stub } }
/* * 功能:实现了查询学生和老师的信息,并且显示在表格中的功能。 */ package com.package_7; 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.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class Teacher6 extends JFrame implements ActionListener { // 定义组件 JLabel jl2,jl,jl3,jl4 = null; JTextField jtf,jtf2 = null; JButton jb,jb2 = null; JPanel jp1, jp2,jp3,jp4,jp5,jp6 = null; DefaultTableModel model,model2 = null; JTable table,table2 = null; JScrollPane jsp,jsp2 = null; // public static void main(String[] args) { // TODO Auto-generated method stub // Teacher6 t = new Teacher6(); // } // 构造函数 public Teacher6() { // 创建组件 jl = new JLabel("请输入学号:"); jl2=new JLabel("请输入教工号:"); jl3=new JLabel("学生信息表:"); jl4=new JLabel("教师信息表:"); jtf = new JTextField(10); jtf2 = new JTextField(10); jb = new JButton("查询1"); jb2 = new JButton("查询2"); // 设置监听 jb.addActionListener(this); jb2.addActionListener(this); // 设置表格1 String[] colnames = { "姓名", "学号", "数学", "语文", "英语", "政治" }; model = new DefaultTableModel(colnames, 3); table = new JTable(model); jsp = new JScrollPane(table); //设置表格2 String[] col = { "姓名", "教工号", "性别", "工资", "职称", "年龄" }; model2 = new DefaultTableModel(col, 3); table2 = new JTable(model2); jsp2 = new JScrollPane(table2); jp1 = new JPanel(); jp2 = new JPanel(); jp3 = new JPanel(); jp4 = new JPanel(); jp5 = new JPanel(); jp6 = new JPanel(); jp5.setLayout(new BorderLayout()); jp6.setLayout(new BorderLayout()); jp1.add(jl); jp1.add(jtf); jp1.add(jb); jp1.setLayout(new FlowLayout(FlowLayout.LEFT)); jp1.setPreferredSize(new Dimension(20,20)); jp3.add(jl2); jp3.add(jtf2); jp3.add(jb2); jp3.setLayout(new FlowLayout(FlowLayout.LEFT)); jp2.add(jsp); jp4.add(jsp2); jp5.add(jl3,BorderLayout.SOUTH); jp6.add(jl4,BorderLayout.SOUTH); this.add(jp1); this.add(jp5); this.add(jp2); this.add(jp3); this.add(jp6); this.add(jp4); this.setLayout(new GridLayout(6, 1)); this.setTitle("学生成绩管理系统—教师"); this.setSize(500, 500); this.setLocation(150, 150); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setVisible(true); this.setResizable(false); } @Override public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals("查询1") &&!jtf.getText().isEmpty()) { // 当点击查询按钮1时,首先与数据库建立连接 GetSQL.ConnectSQL(); GetSQL.getdatastu(jtf.getText()); jtf.setText(""); // System.out.println(GetSQL.english); // System.out.println(GetSQL.chinese); // 将数据填入表格 table.setValueAt(GetSQL.name, 0, 0); table.setValueAt(GetSQL.num, 0, 1); table.setValueAt(GetSQL.math, 0, 2); table.setValueAt(GetSQL.chinese, 0, 3); table.setValueAt(GetSQL.english, 0, 4); table.setValueAt(GetSQL.zhengzhi, 0, 5); }else if (e.getActionCommand().equals("查询2") &&!jtf2.getText().isEmpty()) { // 当点击查询按钮1时,首先与数据库建立连接 GetSQL.ConnectSQL(); GetSQL.getdatatea(jtf2.getText()); jtf2.setText(""); // 将数据填入表格 table2.setValueAt(GetSQL.teaname, 0, 0); table2.setValueAt(GetSQL.teanum, 0, 1); table2.setValueAt(GetSQL.sex, 0, 2); table2.setValueAt(GetSQL.salary, 0, 3); table2.setValueAt(GetSQL.zhicheng, 0, 4); table2.setValueAt(GetSQL.age, 0, 5); }else { JOptionPane.showMessageDialog(null , "请输入要查询的编号","提示消息",JOptionPane.WARNING_MESSAGE); } } }
其中,数据库数据如图所示:
在前面的数据库查询中,使用了
ps=ct.prepareStatement("select * from info where 权限=? ");
改进方法:
ps = ct.prepareStatement("select * from info where 权限=? and 用户名=? ");
此条语句按照jtf.getText()来进行查询,如果查到此用户名则判断密码是否正确。否则将弹出“用户名不存在的提示”,较好的解决了查询问题。
如图所示:
教师登录成功界面,如图:
在此系统中,可以对数据库中学生表和教师表中的信息进行查询,按照提示,可输入学号和教工号来实现。
如图所示:
说说经验之谈,在构建表格的时候,列名怎么也不出现。
查阅资料后发现,只有将JTable加入到JScrollPane中才会显示列名。代码如下:
// 设置表格1
String[] colnames = { "姓名", "学号", "数学", "语文", "英语", "政治" };
model = new DefaultTableModel(colnames, 3);
table = new JTable(model);
jsp = new JScrollPane(table);
然后将JScrollPane添加进一个JPanel中,实现了表格的设置。
至于点击查询按钮所进行的查询工作就和前面大同小异了。当输入的学号或者教工号不存在时,会给出一个提示。如图所示:
简易信息管理系统适合新手学Java图形界面开发。
1、登录界面可以进行登录操作。有俩种权限选择。分别跳转到不同的界面。
2、使用了事件监听、Java操作SQLserver数据库等知识。
3、图形化界面中使用了JTable等组件,将查询结果显示在表格中。
其实,在这个简单的程序中,至少我可以看出可以使用单例模式和门面模式。
见:Java设计模式—门面模式(带案例分析)
Java图形界面开发—简易登录注册小程序
经过好久的努力,在图形化界面开发上,希望能够帮助更多正在学习图形界面开发的小伙伴~