目录
用户类型,我们创建一个枚举类
在 org.xingyun.model 包下创建 UserType 枚举类
快速生成 get set 方法
修改代码,下拉框的内容,用我们的枚举类型
给登录按钮绑定事件
我们在 org.xingyun.utils 包下创建一个工具类
Eclipse 智能提示
可以运行测试下
根据不同的身份进行不同的判断
导入我们的SQL脚本,把表建出来
在org.xingyun.utils包下创建一个工具类
创建 Admin 实体类
在 org.xingyun.dao 包下创建 AdminDao 编写登录操作
回到 LoginFrm.java 编写管理员登录逻辑
主界面的制作
添加 JMenuBar
在JMenuBar里面添加 JMenu
在JMenu 下面添加 两个 JMenuItem
添加学生管理的 JMenu
添加班级管理的JMenu
添加帮助的Jemun
关于我们的功能实现
给关于我们按钮添加事件
管理员登录成功跳转页面
修改 MainFrm 提供两个成员变量,注意提供成静态的,以后其他页面要用,直接调用
修改登录页面代码,登录成功后跳转到主页面
可以运行测试一下
修改密码的实现
给修改密码按钮,绑定事件
修改密码的页面制作
在 org.xingyun.view 包下 创建 EditPwdFrm 注意创建成 JInternalFrame
添加面板的关闭,最小化,最大化按钮
页面的制作,参照登录页面的制作
bug 处理,如果点击 关闭按钮不起作用,注释一行代码
注释掉 EditPwdFrm 的main方法
回到 MainFrm.java 点击修改密码,打开修改密码页面
先修改一下MainFrm.java 的布局 添加一个JDesktopPane 拖拽过来后点击居中位置
把 JDesktopPane 提升为成员变量
打开修改密码页面
可以运行测试下
在修改密码页面,取一下用户名
给确认修改按钮添加事件
编写确认修改的方法
编写 AdminDao 提供 修改的方法
退出系统
给退出系统按钮添加事件
用户类型,我们创建一个枚举类
在 org.xingyun.model 包下创建 UserType 枚举类
package org.xingyun.model; public enum UserType { ADMIN("管理员",0),TEACHER("教师",1),STUDENT("学生",2); private String name; private int index; private UserType(String name,int index){ this.name = name; this.index = index; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getIndex() { return index; } public void setIndex(int index) { this.index = index; } @Override public String toString(){ return this.name; } }
快速生成 get set 方法
修改代码,下拉框的内容,用我们的枚举类型
userTypeComboBox.setModel(new DefaultComboBoxModel(new UserType[] {UserType.ADMIN, UserType.TEACHER, UserType.STUDENT}));
给登录按钮绑定事件
//给登录按钮,绑定事件 loginButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //抽取个方法,把事件对象传递过去 userLogin(e); } });
// 给登录按钮,绑定事件 loginButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { // 抽取个方法,把事件对象传递过去 userLogin(e); } });
// 点击登录按钮进行处理 protected void userLogin(ActionEvent e) { // 获取用户输入的用户名和密码,以及登录类型 按快捷键 ctrl+1 会补全返回值 String username = usernameTextField.getText().toString().trim(); String password = passwordTextField.getText().toString().trim(); //获取用户的下拉选择 UserType selectedItem = (UserType)userTypeComboBox.getSelectedItem(); //判断用户名和密码是否为空,这里的 StringUtil 是我们自己编写的一个工具类 if(StringUtil.isEmpty(username)){ //弹出一个提示框进行提示 JOptionPane.showMessageDialog(this, "用户名不能为空!"); return; //注意return掉 } if(StringUtil.isEmpty(password)){ JOptionPane.showMessageDialog(this, "密码不能为空!"); return; //注意return掉 } }
我们在 org.xingyun.utils 包下创建一个工具类
public class StringUtil { public static boolean isEmpty(String str){ if("".equals(str)|| str == null){ return true; } return false; } }
Eclipse 智能提示
依次点击Window --> Perferences(选项设置) --> Java --> Editor(编辑) --> Content Assist(内容辅助/代码提示)
==注意:按快捷键 ctrl+1 会补全返回值==
==ctrl+shift+F 格式化代码==
可以运行测试下
根据不同的身份进行不同的判断
// 点击登录按钮进行处理 protected void userLogin(ActionEvent e) { // 获取用户输入的用户名和密码,以及登录类型 按快捷键 ctrl+1 会补全返回值 String username = usernameTextField.getText().toString().trim(); String password = passwordTextField.getText().toString().trim(); // 获取用户的下拉选择 UserType selectedItem = (UserType) userTypeComboBox.getSelectedItem(); // 判断用户名和密码是否为空 if (StringUtil.isEmpty(username)) { // 弹出一个提示框进行提示 JOptionPane.showMessageDialog(this, "用户名不能为空!"); return; // 注意return掉 } if (StringUtil.isEmpty(password)) { JOptionPane.showMessageDialog(this, "密码不能为空!"); return; // 注意return掉 } // 根据不同的身份进行不同的登录操作 if ("管理员".equals(selectedItem.getName())) { } else if ("教师".equals(selectedItem.getName())) { } else { } }
导入我们的SQL脚本,把表建出来
从我们的资料中导入SQL脚本即可
在org.xingyun.utils包下创建一个工具类
package org.xingyun.utils; import java.sql.*; public class JDBCUtils{ private static String url; private static String username; private static String password; private JDBCUtils() { } static { try { //这些连接数据库的基本参数,写在代码里写死了,不好。 //要配合配置文件,把这些参数写到配置文件里,代码里面读取配置文件中的内容 Class.forName("com.mysql.jdbc.Driver"); url = "jdbc:mysql://localhost:3306/db_student"; username = "root"; password = "123456"; } catch (ClassNotFoundException e) { e.printStackTrace(); } } //获取连接对象 public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url, username, password); } //释放资源 public static void close(Connection conn, Statement statement, ResultSet resultSet) throws SQLException { if (conn != null) { conn.close(); } if (statement != null) { statement.close(); } if (resultSet != null) { resultSet.close(); } } public static void close(Connection conn, Statement statement) throws SQLException { if (conn != null) { conn.close(); } if (statement != null) { statement.close(); } } }
创建 Admin 实体类
public class Admin { private int id; private String name; private String password; private String createDate; //get set 方法自己补上 }
在 org.xingyun.dao 包下创建 AdminDao 编写登录操作
package org.xingyun.dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.xingyun.model.Admin; import org.xingyun.utils.JDBCUtils; public class AdminDao { /** * 管理员登陆 * @throws SQLException */ public Admin login(Admin admin) throws SQLException { //获取连接对象 Connection con = JDBCUtils.getConnection(); String sql = "select * from s_admin where name=? and password=?"; Admin adminRst = null; try { PreparedStatement prst = con.prepareStatement(sql);// 把sql语句传给数据库操作对象 prst.setString(1, admin.getName()); prst.setString(2, admin.getPassword()); ResultSet executeQuery = prst.executeQuery(); if (executeQuery.next()) { adminRst = new Admin(); adminRst.setId(executeQuery.getInt("id")); adminRst.setName(executeQuery.getString("name")); adminRst.setPassword(executeQuery.getString("password")); adminRst.setCreateDate(executeQuery.getString("createDate")); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return adminRst; } }
回到 LoginFrm.java 编写管理员登录逻辑
// 点击登录按钮进行处理 protected void userLogin(ActionEvent e) { // 获取用户输入的用户名和密码,以及登录类型 按快捷键 ctrl+1 会补全返回值 String username = usernameTextField.getText().toString().trim(); String password = passwordTextField.getText().toString().trim(); // 获取用户的下拉选择 UserType selectedItem = (UserType) userTypeComboBox.getSelectedItem(); // 判断用户名和密码是否为空 if (StringUtil.isEmpty(username)) { // 弹出一个提示框进行提示 JOptionPane.showMessageDialog(this, "用户名不能为空!"); return; // 注意return掉 } if (StringUtil.isEmpty(password)) { JOptionPane.showMessageDialog(this, "密码不能为空!"); return; // 注意return掉 } // 根据不同的身份进行不同的登录操作 Admin admin = null; if ("管理员".equals(selectedItem.getName())) { //创建Dao AdminDao adminDao = new AdminDao(); //创建管理员对象 Admin adminTmp = new Admin(); adminTmp.setName(username); adminTmp.setPassword(password); //调用登录方法 admin = adminDao.login(adminTmp); //如果登录失败 if(admin == null){ JOptionPane.showMessageDialog(this, "用户名或密码错误!"); return; } //登录成功,弹出给提示 JOptionPane.showMessageDialog(this, "欢迎【"+selectedItem.getName()+"】:"+admin.getName()+"登录本系统!"); this.dispose();//关闭登录框 //创建主页面 new MainFrm(selectedItem, admin).setVisible(true); } else if ("教师".equals(selectedItem.getName())) { } else { } }
主界面的制作
在 org.xingyun.view 包下创建 MainFrm
添加 JMenuBar
在JMenuBar里面添加 JMenu
在JMenu 下面添加 两个 JMenuItem
图标自己设置一下
添加学生管理的 JMenu
添加班级管理的JMenu
添加帮助的Jemun
关于我们的功能实现
给关于我们按钮添加事件
//点击关于我们的按键 menuItem_6.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //抽取一个方法,把事件对象传过去 aboutMe(e); } });
//关于我们 protected void aboutMe(ActionEvent e) { // TODO Auto-generated method stub // TODO Auto-generated method stub String info = "【西安星云科技教育】出品\n"; info += "网址:http://www.xingyun.org \n"; info += "认真做IT教育,不辜负每一位莘莘学子!"; String[] buttons = {"迫不及待去看看!","心情不好以后再说!"}; //返回的是 buttons 两个按钮的索引 int ret = JOptionPane.showOptionDialog(this, info, "关于我们", JOptionPane.YES_NO_CANCEL_OPTION, JOptionPane.DEFAULT_OPTION, new ImageIcon(LoginFrm.class.getResource("/images/学生.png")), buttons, null); if(ret == 0){ //采用Java 调用系统浏览器打开制定 try { URI uri = new URI("http://www.baidu.com"); Desktop.getDesktop().browse(uri); //Runtime.getRuntime().exec("explorer http://www.163.com"); //这个也能打开浏览器 } catch (Exception e1) { // TODO Auto-generated catch block e1.printStackTrace(); } }else{ JOptionPane.showMessageDialog(this, "你真是狠心,坏淫!"); } }
管理员登录成功跳转页面
修改 MainFrm 提供两个成员变量,注意提供成静态的,以后其他页面要用,直接调用
public static UserType userType; public static Object userObject;
代码如下: ==注意:注释掉main方法,可以屏蔽直接运行打开,修改构造方法,为增加的两个成员变量赋值==
public class MainFrm extends JFrame { private JPanel contentPane; //用户类型 public static UserType userType; // 用户对象 public static Object userObject; /** * Launch the application. */ //注释掉main方法,不要直接运行打开 /* public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { MainFrm frame = new MainFrm(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } */ /** * Create the frame. */ public MainFrm(UserType userType,Object userObject) { //给成员变量赋值 this.userType = userType; this.userObject = userObject; setTitle("学生信息系统主界面"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 1082, 663); //.....其他代码略 }
修改登录页面代码,登录成功后跳转到主页面
// 点击登录按钮进行处理 protected void userLogin(ActionEvent e) throws SQLException { // 获取用户输入的用户名和密码,以及登录类型 按快捷键 ctrl+1 会补全返回值 String username = usernameTextField.getText().toString().trim(); String password = passwordTextField.getText().toString().trim(); // 获取用户的下拉选择 UserType selectedItem = (UserType) userTypeComboBox.getSelectedItem(); // 判断用户名和密码是否为空 if (StringUtil.isEmpty(username)) { // 弹出一个提示框进行提示 JOptionPane.showMessageDialog(this, "用户名不能为空!"); return; // 注意return掉 } if (StringUtil.isEmpty(password)) { JOptionPane.showMessageDialog(this, "密码不能为空!"); return; // 注意return掉 } // 根据不同的身份进行不同的登录操作 Admin admin = null; if ("管理员".equals(selectedItem.getName())) { //创建Dao AdminDao adminDao = new AdminDao(); //创建管理员对象 Admin adminTmp = new Admin(); adminTmp.setName(username); adminTmp.setPassword(password); //调用登录方法 admin = adminDao.login(adminTmp); //如果登录失败 if(admin == null){ JOptionPane.showMessageDialog(this, "用户名或密码错误!"); return; } //登录成功,弹出给提示 JOptionPane.showMessageDialog(this, "欢迎【"+selectedItem.getName()+"】:"+admin.getName()+"登录本系统!"); this.dispose();//关闭登录框 //创建主页面 new MainFrm(selectedItem, admin).setVisible(true); } else if ("教师".equals(selectedItem.getName())) { } else { } }
可以运行测试一下
修改密码的实现
给修改密码按钮,绑定事件
//点击修改密码的事件处理 menuItem.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //抽取一个方法,把事件对象传过去 updatePassword(e); } });
//修改密码 protected void updatePassword(ActionEvent e) { //打开一个修改密码的页面 }
修改密码的页面制作
在 org.xingyun.view 包下 创建 EditPwdFrm 注意创建成 JInternalFrame
添加面板的关闭,最小化,最大化按钮
页面的制作,参照登录页面的制作
bug 处理,如果点击 关闭按钮不起作用,注释一行代码
//setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
你可以修改一下几个组件的名称
private JTextField cureentUser; 当前用户 private JTextField oldPwdTextField; 旧密码 private JTextField newPwdTextField; 新密码 private JTextField okNewPwdTextField; 确认新密码
JButton ok_updatePwdButton 确认修改按钮
注释掉 EditPwdFrm 的main方法
代码如下: ==注意:注释掉main方法,可以屏蔽直接运行打开==
可以加一行代码,设置窗口居中 //设置窗口位置居中打开 setLocation(null);
public class EditPwdFrm extends JFrame { private JPanel contentPane; private JTextField cureentUser; private JTextField oldPwdTextField; private JTextField newPwdTextField; private JTextField okNewPwdTextField; /** * Launch the application. 注释掉main方法 */ /*public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { public void run() { try { EditPwdFrm frame = new EditPwdFrm(); frame.setVisible(true); } catch (Exception e) { e.printStackTrace(); } } }); } */ /** * Create the frame. */ public EditPwdFrm() { setTitle("修改密码"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setBounds(100, 100, 566, 410); contentPane = new JPanel(); contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); setContentPane(contentPane); //设置窗口位置居中打开 setLocation(null); // .... 其他代码略 }
回到 MainFrm.java 点击修改密码,打开修改密码页面
先修改一下MainFrm.java 的布局 添加一个JDesktopPane 拖拽过来后点击居中位置
把 JDesktopPane 提升为成员变量
public class MainFrm extends JFrame { private JPanel contentPane; //用户类型 public static UserType userType; // 用户对象 public static Object userObject; private JDesktopPane desktopPane; public MainFrm(UserType userType,Object userObject) { //给成员变量赋值 this.userType = userType; this.userObject = userObject; //......其余代码略 //把他提升为成员变量 desktopPane = new JDesktopPane(); contentPane.add(desktopPane, BorderLayout.CENTER); } }
打开修改密码页面
//打开修改密码面板 protected void updatePassword(ActionEvent e) { // 打开一个修改密码的页面 // TODO Auto-generated method stub EditPwdFrm editPasswordFrm = new EditPwdFrm(); editPasswordFrm.setVisible(true); // 添加子面板 desktopPane.add(editPasswordFrm); }
可以运行测试下
在修改密码页面,取一下用户名
//根据不同的身份在,修改密码页面展示用户名 if("管理员".equals(MainFrm.userType.getName())){ Admin admin = (Admin)MainFrm.userObject; cureentUser.setText("【系统管理员】" + admin.getName()); }
测试一下
给确认修改按钮添加事件
//确认修改按钮的点击事件 ok_updatePwdButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { //抽取一个方法 submitEdit(e); } });
编写确认修改的方法
//确认修改 protected void submitEdit(ActionEvent e) { //获取输入框的输入内容 String oldPassword = oldPwdTextField.getText().toString().trim(); String newPassword = newPwdTextField.getText().toString().trim(); String conformPassword = okNewPwdTextField.getText().toString().trim(); if (StringUtil.isEmpty(oldPassword)) { JOptionPane.showMessageDialog(this, "请填写旧密码!"); return; } if (StringUtil.isEmpty(newPassword)) { JOptionPane.showMessageDialog(this, "请填写新密码!"); return; } if (StringUtil.isEmpty(conformPassword)) { JOptionPane.showMessageDialog(this, "请确认新密码!"); return; } if (!newPassword.equals(conformPassword)) { JOptionPane.showMessageDialog(this, "两次密码输入不一致!"); return; } if ("管理员".equals(MainFrm.userType.getName())) { AdminDao adminDao = new AdminDao(); Admin adminTmp = new Admin(); Admin admin = (Admin) MainFrm.userObject; adminTmp.setName(admin.getName()); adminTmp.setId(admin.getId()); adminTmp.setPassword(oldPassword); try { //调用修改密码的方法 JOptionPane.showMessageDialog(this,adminDao.editPassword(adminTmp, newPassword)); } catch (HeadlessException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } return; } } }
编写 AdminDao 提供 修改的方法
public class AdminDao { //登录方法略... public String editPassword(Admin admin, String newPassword) throws SQLException { //获取连接对象 Connection con = JDBCUtils.getConnection(); String sql = "select * from s_admin where id=? and password=?"; PreparedStatement prst = null; int id = 0; try { prst = con.prepareStatement(sql); prst.setInt(1, admin.getId()); prst.setString(2, admin.getPassword()); ResultSet executeQuery = prst.executeQuery(); if (!executeQuery.next()) { String retString = "旧密码错误!"; return retString; } id = executeQuery.getInt("id"); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } // 把sql语句传给数据库操作对象 String retString = "修改失败"; String sqlString = "update s_admin set password = ? where id = ?"; try { prst = con.prepareStatement(sqlString); prst.setString(1, newPassword); prst.setInt(2, id); int rst = prst.executeUpdate(); if (rst > 0) { retString = "密码修改成功!"; } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } // 把sql语句传给数据库操作对象 return retString; } }
退出系统
给退出系统按钮添加事件
//退出系统按钮事件 menuItem_1.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { if(JOptionPane.showConfirmDialog(MainFrm.this, "确定退出么?") == JOptionPane.OK_OPTION){ System.exit(0); } } });