记录一个咸鱼大学生三个月的奋进生活016
复习Java(学生信息管理系统04权限管理和动态挂菜单功能)
今天改写之前在第一天写过的view中登录和主页面代码实现权限管理和动态挂菜单功能,还不知道怎么写静态登录和出页面代码的可以在复习Java第一个项目学生信息管理系统 01(界面部分) &Java面试题抽象类和接口&生活【记录一个咸鱼大学生三个月的奋进生活】013回顾一下
改写MainFrame的构造方法
改写MainFrame的构造方法使他能接收到登录页面传进来的登录用户的对象
// 写构造方法,记住当你写了一个带参的构造方法就要把隐式构造方法也写出来,这个在之前的帖子中也提到过
public MainFrame() {
// TODO Auto-generated constructor stub
}
public MainFrame(MisUser misUser) { // 将刚登录页面的loginUser传进来,给到等会窗体方法会用到的misUser,然后调用窗体方法
this.misUser = misUser;
this.init();
}
}
新增LoginFrame的验证登录是否成功的代码
新增LoginFrame的验证登录checkUser方法使其验证用户登录的账号密码是否正确
这里的思路是在登录时先将用户在登录界面输入的用户名以及密码封装成一个misUser后再调用checkUser方法将misUser对象当参数传入,所以checkUser方法有着misUser参数,然后调用MisUserDAO中的queryMisUser用传入的misUser对象的Id值进行查找的方法返回一个找到的对象,然后通过getUserPass方法将找到的对象密码和传入的misUser对象的密码进行比对,如果找到了并且俩密码一样就发挥flag为true,并将该用户对象给程序开头声明的loginUser之后在调用时会把该对象实例化给MainFrame作为参数传入MainFrame的构造方法。
// checkUser方法,传入一个MisUser实例,用来检测用户输入的用户名是否在数据库中还有是否正确,之后的登录事件中用到了
private boolean checkUser(MisUser misUser) {
boolean flag = false;
MisUserDAO userDAO = new MisUserDAOImpl(); // 使用MisUser接口
MisUser tempUser = userDAO.queryMisUser(misUser.getUserId()); // 使用里面的queryMisUser(String Id)的查找方式,获取之后用户输入的信息,通过getUserId获得其用户名,然后将用户名传入方法,将返回的对象获取给tempUser
if(tempUser != null && tempUser.getUserPass().equals(misUser.getUserPass())) { // 如果tempUser不为空也就是在数据库中找到了并且根据misUser的id找到的tempUser的密码和misUser密码相同即为登陆成功
flag = true;
this.loginUser = tempUser; // 当前登录的loginUser就为找到的tempUser
}
return flag;
}
新增LoginFrame的点击重置按钮的清空输入框内容方法的代码
新增LoginFrame的点击重置按钮的清空输入框内容的clear方法
// clear方法是点击重置按钮之后进行的步骤,将填写的信息清空,之后的重置事件中用到了
private void clear() {
this.fieldName.setText("");
this.fieldPassword.setText("");
}
新增LoginFrame的点击按钮的监听方法重写代码
因为该窗体实现了ActionListener(事件监听)接口,所以需要重写该接口中的actionPerformed方法
该事件监听实现思路为:
① 当用户点击了登录按钮也就是ActionCommand为“login”的按钮(切记,进行getActionCommand判断时一定提前对按钮或者事件进行setActionCommand方法设置关键词),先进行输入框内容的判空操作,然后获取用户在输入框输入的内容赋值给user对象后调用checkUser传入参数进行用户名密码的判对错操作,如果正确了也就是返回的flag为true时就代表登录成功然后实例化mainFrame并将登录的用户对象传入,并设置窗体大小以及窗体弹出的位置;如果错误了也就是返回的flag为false时就代表登录错误了。
② 当用户点击了重置按钮也就是ActionCommand为“Reset”的按钮就调用clear()方法清空输入框的内容。
@Override
public void actionPerformed(ActionEvent e) {
if("login".equals(e.getActionCommand())) { // 这就是通过ActionCommand判断事件,当用这种方法判断事件时,一定要给按钮或者事件提前进行setActionCommand方法设置关键词,然后再之后通过e.getActionCommand()进行判断,记住"常量".equals(变量)
String id = this.fieldName.getText(); // 获取用户输入的用户名
String password = new String(this.fieldPassword.getPassword()); // 获取用户输入的密码,别忘了强转成字符串
if(id == null || id.length() <= 0 || password == null || password.length() <= 0) { // 如果用户名或者密码有一项输入的是空的就不能再进行
JOptionPane.showMessageDialog(this, "用户名口令不能为空!");
return;
}
// 判断输入的用户名是否存在以及正确
MisUser user = new MisUser(); // 实例化一个user以便存入刚输入的用户名和密码
user.setUserId(id);
user.setUserPass(password);
// 调用本类开头声明的checkUser方法,将刚存好的user实例传进方法
if(this.checkUser(user)) {
JOptionPane.showMessageDialog(this, "登录成功!"); // 如果返回的flag为true则弹出主页面mainFrame
MainFrame mainFrame = new MainFrame(this.loginUser); // 并且弹出的主页面mainFrame实例化时同时传入刚登录的checkUser所获取的loginUser
mainFrame.setBounds(410, 120, 1100, 800);
mainFrame.setVisible(true);
this.dispose(); // 使用dispose方法将当前的登录页面关闭
} else {
JOptionPane.showMessageDialog(this, "用户名或密码错误!"); // 如果checkUser方法返回的flag为false时则弹出用户名口令错误!
}
} else if("Reset".equals(e.getActionCommand())) {
this.clear();
}
}
改造后的LoginFrame全部代码
package com.sm.framework.view;
// 这是供有权限的管理员登录的页面,根据MisUser数据库中存的对象进行登录
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import com.sm.framework.model.dao.impl.MisUserDAO;
import com.sm.framework.model.dao.impl.MisUserDAOImpl;
import com.sm.framework.model.entity.MisUser;
public class LoginFrame extends JFrame implements ActionListener { // 这个页面继承JFrame写页面,实现ActionListener接口添加方法
private MisUser loginUser = null; // 这个loginUser是获取用户输入的用户名以及密码看是否在权限数据库中存在
private JPanel panelBody = null; // 总的bodypanel块
private JLabel labelTitle = null; // 标题panel
private JLabel labelName = null; // 用户名
private JTextField fieldName = null; // 填写用户名文字域
private JLabel labelPassword = null; // 密码
private JPasswordField fieldPassword = null; // 填写密码文字域
private JPanel panelButton = null; // 底部按钮的panel
private JButton buttonLogin = null; // 登录按钮
private JButton buttonReset = null; // 重置按钮
// checkUser方法,传入一个MisUser实例,用来检测用户输入的用户名是否在数据库中还有是否正确,之后的登录事件中用到了
private boolean checkUser(MisUser misUser) {
boolean flag = false;
MisUserDAO userDAO = new MisUserDAOImpl(); // 使用MisUser接口
MisUser tempUser = userDAO.queryMisUser(misUser.getUserId()); // 使用里面的queryMisUser(String Id)的查找方式,获取之后用户输入的信息,通过getUserId获得其用户名,然后将用户名传入方法,将返回的对象获取给tempUser
if(tempUser != null && tempUser.getUserPass().equals(misUser.getUserPass())) { // 如果tempUser不为空也就是在数据库中找到了并且根据misUser的id找到的tempUser的密码和misUser密码相同即为登陆成功
flag = true;
this.loginUser = tempUser; // 当前登录的loginUser就为找到的tempUser
}
return flag;
}
// clear方法是点击重置按钮之后进行的步骤,将填写的信息清空,之后的重置事件中用到了
private void clear() {
this.fieldName.setText("");
this.fieldPassword.setText("");
}
// 窗体的编写
private void init() {
Container content = this.getContentPane(); // 实例化ContentPane
content.setLayout(new BorderLayout()); // 并设置其为BorderLayout
this.panelBody = new WelcomePanel(); // 用背景panel实例化JPanel这样给窗体背景
this.panelBody.setLayout(new GridBagLayout()); // 通过setLayout方法设置GridBagLayout精确布局管理器
this.panelBody.setBorder(BorderFactory.createMatteBorder(1, 1, 1, 1, new Color(24, 108, 224))); // 这是设置边框及颜色的代码,new Color( , , )是通过三元素进行设置
content.add(this.panelBody, BorderLayout.CENTER); // 将panelbody设进content
GridBagConstraints constraints = new GridBagConstraints(); // 实例化GridBagConstraints精确布局管理器constraints放入
this.labelTitle = new JLabel("学生信息管理系统登录");
this.labelTitle.setForeground(Color.WHITE); // setForeground() 设置文字颜色的方法
this.labelTitle.setFont(new Font("楷体", Font.BOLD, 18)); // setFont(new Font("字体", Font.样式, 字体大小)) 设置字体样式的方法
constraints.gridx = 1;
constraints.gridy = 0;
this.panelBody.add(this.labelTitle, constraints);
// 下面这句代码之后的放入都是靠右对齐的,是为了让用户名和密码的Label贴紧文本框的
constraints.anchor = GridBagConstraints.EAST;
this.labelName = new JLabel("用 户 名:");
this.labelName.setForeground(Color.WHITE); // setForeground() 设置文字颜色的方法
this.labelName.setFont(new Font("楷体", Font.BOLD, 16)); // setFont(new Font("字体", Font.样式, 字体大小)) 设置字体样式的方法
constraints.gridx = 0;
constraints.gridy = 1;
this.panelBody.add(this.labelName, constraints);
this.fieldName = new JTextField(16);
constraints.gridx = 1;
constraints.gridy = 1;
this.panelBody.add(this.fieldName, constraints);
this.labelPassword = new JLabel("密 码:");
this.labelPassword.setForeground(Color.WHITE); // setForeground() 设置文字颜色的方法
this.labelPassword.setFont(new Font("楷体", Font.BOLD, 16)); // setFont(new Font("字体", Font.样式, 字体大小)) 设置字体样式的方法
constraints.gridx = 0;
constraints.gridy = 2;
this.panelBody.add(this.labelPassword, constraints);
this.fieldPassword = new JPasswordField(16);
constraints.gridx = 1;
constraints.gridy = 2;
this.panelBody.add(this.fieldPassword, constraints);
this.panelButton = new JPanel();
this.panelButton.setOpaque(false); // 设置按钮附近颜色透明成背景颜色
this.buttonLogin = new JButton("登 录"); // setForeground() 设置文字颜色的方法
this.buttonLogin.setFont(new Font("黑体", Font.BOLD, 14)); // setFont(new Font("字体", Font.样式, 字体大小)) 设置字体样式的方法
this.buttonLogin.setActionCommand("login"); // setActionCommand为一个字符串之后在判断事件时用getActionCommand看是触发的哪个事件
this.buttonLogin.addActionListener(this); // 将buttonLogin添加进事件监听
this.buttonReset = new JButton("重 置");
this.buttonReset.setFont(new Font("黑体", Font.BOLD, 14)); // setFont(new Font("字体", Font.样式, 字体大小)) 设置字体样式的方法
this.buttonReset.addActionListener(this);
this.buttonReset.setActionCommand("Reset");
// 把两个按钮添加进panelButton然后添加进panelBody
this.panelButton.add(this.buttonLogin);
this.panelButton.add(this.buttonReset);
constraints.gridx = 1;
constraints.gridy = 3;
this.panelBody.add(this.panelButton, constraints);
this.setTitle("用户登录");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public LoginFrame() {
this.init();
}
public static void main(String[] args) {
LoginFrame loginFrame = new LoginFrame();
loginFrame.setBounds(720, 350, 500, 320);
loginFrame.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
if("login".equals(e.getActionCommand())) { // 这就是通过ActionCommand判断事件, 记住"常量".equals(变量)
String id = this.fieldName.getText(); // 获取用户输入的用户名
String password = new String(this.fieldPassword.getPassword()); // 获取用户输入的密码,别忘了强转成字符串
if(id == null || id.length() <= 0 || password == null || password.length() <= 0) { // 如果用户名或者密码有一项输入的是空的就不能再进行
JOptionPane.showMessageDialog(this, "用户名口令不能为空!");
return;
}
// 判断输入的用户名是否存在以及正确
MisUser user = new MisUser(); // 实例化一个user以便存入刚输入的用户名和密码
user.setUserId(id);
user.setUserPass(password);
// 调用本类开头声明的checkUser方法,将刚存好的user实例传进方法
if(this.checkUser(user)) {
JOptionPane.showMessageDialog(this, "登录成功!"); // 如果返回的flag为true则弹出主页面mainFrame
MainFrame mainFrame = new MainFrame(this.loginUser); // 并且弹出的主页面mainFrame实例化时同时传入刚登录的checkUser所获取的loginUser
mainFrame.setBounds(410, 120, 1100, 800);
mainFrame.setVisible(true);
this.dispose(); // 使用dispose方法将当前的登录页面关闭
} else {
JOptionPane.showMessageDialog(this, "用户名或密码错误!"); // 如果checkUser方法返回的flag为false时则弹出用户名口令错误!
}
} else if("Reset".equals(e.getActionCommand())) {
this.clear();
}
}
}
新增MainFrame的根据权限动态挂靠菜单方法
实现权限管理并动态挂靠菜单的思路:
① 首先根据权限并动态挂靠菜单的意思就是在数据库搜索该用户有操作哪些功能的权限,将所有该权限可以操作的功能挂到主页面的菜单栏上,这就需要misUser(用户表),auth(权限表),myMenu(菜单功能表)三个表的配合,这在之前复习Java第一个项目学生信息管理系统 02(数据库及model层部分) &Java面试题final关键字作用和finally、finalize的区别&生活【记录一个咸鱼大学生三个月的奋进生活】014也提到过。
② 咱先再分析一下这几个数据表,首先misUser(用户表)中每个用户都有着自己的roleId(权限代号)
例如:所有老师的用户都会有着同一个名字为teach的roleId
![](https://i-blog.csdnimg.cn/blog_migrate/ebe72b96329e53e21fa1f9d17ff2f78b.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/925803ae844e735e6a4f9e16ab941138.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/3f9bb91967de67c69fecda28241193d3.jpeg)
③ 然后就是通过sql语句判断实例化主页面时传进来的misUser对象能操作的功能有哪些,就是拿着登录的用户的roleId在auth表中他能操作的功能代号(menuId),然后拿着该功能代号(menuId)在myMenu表中搜索该menuId所对应的具体功能名字最后挂靠在菜单栏。
④ sql语句就是这样的:
![](https://i-blog.csdnimg.cn/blog_migrate/bd9b0005ea9113a32fe0b6535978e3c7.jpeg)
最后具体的实现代码就是这样:
private void createMenu() {
MyMenuDAO menuDAO = new MyMenuDAOImpl(); // 实例化MyMenuDAO,里面有一个findBySql方法,通过sql语句进行查询存入对象之后返回
String sql1 = "select * from myMenu where menuId like '__' and menuId in (select menuId from auth where roleId = '"+ misUser.getRoleId() +"')"; // '__'的意思是查找menuId里所有为两位数的信息
List<MyMenu> list1 = menuDAO.findBySql(sql1); // 查找到的数据存到list1集合里
for (MyMenu myMenu1 : list1) { // 遍历list1
JMenu tempMenu = new JMenu(); // 实例化JMenu,将查到的信息存到tempMenu菜单中,这是有复选的主菜单
tempMenu.setActionCommand(myMenu1.getMenuId()); // setActionCommand方法设置事件名为该功能在数据库中的Id
tempMenu.setText(myMenu1.getMenuName()); // setText方法设置菜单名
String sql2 = "select * from myMenu where menuId like '" + myMenu1.getMenuId() + "__' and menuId in (select menuId from auth where roleId = '"+ misUser.getRoleId() +"')"; // 嵌套循环查找该循环下的id+两位数的信息,例:1011,1012...,挂在该下拉菜单中,成不可再复选的菜单
List<MyMenu> list2 = menuDAO.findBySql(sql2); // 调用findbysql方法查找到的数据存到list2集合里
for (MyMenu myMenu2 : list2) { // 遍历list2
JMenuItem tempItem = new JMenuItem(); // 实例化tempItem这是一个JMenuItem,没有复选的菜单
tempItem.setActionCommand(myMenu2.getMenuId()); // setActionCommand方法设置事件名为该功能在数据库中的Id,在之后的点击功能显示详细操作MenuListener中会用到
tempItem.setText(myMenu2.getMenuName());
tempMenu.add(tempItem); // 将刚设好的无复选的菜单添加进tempMenu,就是有复选的主菜单,注意这还是在循环嵌套中,所以会将10或20等开头的都放在一起
}
this.menuBar.add(tempMenu); // 将刚添加好的主菜单添加进menuBar
}
}
代码成果:
admin权限时:
![](https://i-blog.csdnimg.cn/blog_migrate/93c535165c540381b029a90504eb109a.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/496116c0fba0b59132b9d81536854499.jpeg)
新增MainFrame的两个按钮退出以及重新登录方法
public void actionPerformed(ActionEvent e) {
if("exit".equals(e.getActionCommand())) { // 这就是通过ActionCommand判断事件
int n = JOptionPane.showConfirmDialog(this, "您确定要退出?"); // 选择框:JOptionPane.showConfirmDialog(在哪弹出,"弹出的问题内容"); 选择框会有选项yes或no,再根据选的是yes还是no进行之后的操作
if(n == JOptionPane.YES_OPTION) {
System.exit(0); // 退出窗体以及程序方法,用这个方法就不用再写this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} else if("relogin".equals(e.getActionCommand())) {
int n = JOptionPane.showConfirmDialog(this, "您确定要重新登录?");
if(n == JOptionPane.YES_OPTION) {
LoginFrame loginFrame = new LoginFrame();
loginFrame.setBounds(720, 350, 500, 320);
loginFrame.setVisible(true);
this.dispose(); // 关闭主页面但不会影响新生成的登录页面
}
}
}
改造后的MainFrame全部代码
package com.sm.framework.view;
// 这是进行所有管理系统操作的页面,根据Mymenu数据库中存的对象进行动态菜单操作
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import com.sm.framework.control.listener.MenuListener;
import com.sm.framework.model.dao.impl.MyMenuDAO;
import com.sm.framework.model.dao.impl.MyMenuDAOImpl;
import com.sm.framework.model.entity.MisUser;
import com.sm.framework.model.entity.MyMenu;
public class MainFrame extends JFrame implements ActionListener {
private MisUser misUser = null; // 这个在构造方法中接收登录界面传来的loginUser
private JMenuBar menuBar = null; // 菜单停靠menuBar
private JMenu menuHelp = null; // 帮助菜单
private JMenuItem itemAbout = null; // 关于菜单
private JMenuItem itemContent = null; // 内容菜单
private JPanel panelBody = null; // 整个panel
private JPanel panelWelcome = null; // 进行操作的panelWelcome
private JToolBar toolBar = null; // 最上方的工具栏
private JLabel labelwelcome = null; // 上方的欢迎句子
private JLabel labelText = null; // 上方的显示登录用户名字的句子
private JButton buttonExit = null; // 上方的退出按钮
private JButton buttonReLogin = null; // 上方的重新登录按钮
private JLabel labelState = null; // 底部的文字信息
// createMenu创造菜单方法
private void createMenu() {
MyMenuDAO menuDAO = new MyMenuDAOImpl(); // 实例化MyMenuDAO,里面有一个findBySql方法,通过sql语句进行查询存入对象之后返回
String sql1 = "select * from myMenu where menuId like '__' and menuId in (select menuId from auth where roleId = '"+ misUser.getRoleId() +"')"; // 这句话意思是查找menuId里所有为两位数的信息
List<MyMenu> list1 = menuDAO.findBySql(sql1); // 查找到的数据存到list1集合里
for (MyMenu myMenu1 : list1) { // 遍历list1
JMenu tempMenu = new JMenu(); // 实例化JMenu,将查到的信息存到tempMenu菜单中,这是有复选的主菜单
tempMenu.setActionCommand(myMenu1.getMenuId()); // setActionCommand方法设置事件名为该功能在数据库中的Id
tempMenu.setText(myMenu1.getMenuName()); // setText方法设置菜单名
String sql2 = "select * from myMenu where menuId like '" + myMenu1.getMenuId() + "__' and menuId in (select menuId from auth where roleId = '"+ misUser.getRoleId() +"')"; // 嵌套循环查找该循环下的id+两位数的信息,例:1011,1012...,挂在该下拉菜单中,成不可再复选的菜单
List<MyMenu> list2 = menuDAO.findBySql(sql2); // 调用findbysql方法查找到的数据存到list2集合里
for (MyMenu myMenu2 : list2) { // 遍历list2
JMenuItem tempItem = new JMenuItem(); // 实例化tempItem这是一个JMenuItem,没有复选的菜单
tempItem.setActionCommand(myMenu2.getMenuId()); // setActionCommand方法设置事件名为该功能在数据库中的Id,在之后的点击功能显示详细操作MenuListener中会用到
tempItem.setText(myMenu2.getMenuName());
tempItem.addActionListener(new MenuListener(this)); // 给所有的菜单选项添加监听事件,因为是在MenuListener中实现的所以要实例化MenuListener设监听器
tempMenu.add(tempItem); // 将刚设好的无复选的菜单添加进tempMenu,就是有复选的主菜单,注意这还是在循环嵌套中,所以会将10或20等开头的都放在一起
}
this.menuBar.add(tempMenu); // 将刚添加好的主菜单添加进menuBar
}
}
// 窗体方法
private void init() {
this.menuBar = new JMenuBar(); // 实例化menuBar
this.menuHelp = new JMenu("帮助"); // 实例化帮助功能的各个菜单,然后添加进去
this.itemAbout = new JMenuItem("关于");
this.itemContent = new JMenuItem("内容");
this.menuHelp.add(this.itemAbout);
this.menuHelp.add(this.itemContent);
// 调用createMenu方法
this.createMenu();
// createMenu已将动态菜单添加进menuBar,然后再将帮助功能添加进menuBar
this.menuBar.add(this.menuHelp);
this.setJMenuBar(this.menuBar);
// 设置panelBody
this.panelBody = (JPanel)this.getContentPane();
this.panelBody.setLayout(new BorderLayout());
// 设置主页面上方的欢迎语句
this.toolBar = new JToolBar();
this.toolBar.setFloatable(false); // 设置工具栏不能移动
this.toolBar.setLayout(new FlowLayout(FlowLayout.CENTER)); // 设置工具栏内容居中
this.labelwelcome = new JLabel("欢迎你:");
this.labelText = new JLabel(this.misUser.getUserName()); // 获取传入的misUser的username然后设为labelText
this.buttonExit = new JButton("退出");
this.buttonExit.setActionCommand("exit");
this.buttonExit.addActionListener(this);
this.buttonReLogin = new JButton("重新登录");
this.buttonReLogin.setActionCommand("relogin");
this.buttonReLogin.addActionListener(this);
this.toolBar.add(this.labelwelcome);
this.toolBar.add(this.labelText);
this.toolBar.add(this.buttonExit);
this.toolBar.add(this.buttonReLogin);
this.toolBar.setBorder(BorderFactory.createMatteBorder(1, 0, 0, 0, new Color(125, 147, 147)));
this.panelBody.add(this.toolBar, BorderLayout.NORTH); // 将工具栏添加进panelBody的boderLayout的上方
// 设置主页面中间的功能操作区域
this.panelWelcome = new JPanel();
this.panelWelcome.setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, new Color(24, 108, 224))); // setBorder(BorderFactory.createMatteBorder(1, 0, 1, 0, new Color(24, 108, 224)));设置边框方法
this.panelWelcome.setBackground(new Color(144, 207, 251));
this.panelBody.add(this.panelWelcome, BorderLayout.CENTER); // 将操作区域添加进panelBody的boderLayout的中间
// 设置主页面下方的水印文字信息
this.labelState = new JLabel("西安文理学院学生信息管理系统 by:wyh", JLabel.CENTER);
this.panelBody.add(this.labelState, BorderLayout.SOUTH); // 将文字信息添加进panelBody的boderLayout的下方
// 设置窗体信息
this.setTitle("西安文理学院学生信息管理系统主界面");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
// 写构造方法
public MainFrame() {
// TODO Auto-generated constructor stub
}
public MainFrame(MisUser misUser) { // 将刚登录页面的loginUser传进来,给到等会窗体方法会用到的misUser,然后调用窗体方法
this.misUser = misUser;
this.init();
}
@Override
public void actionPerformed(ActionEvent e) {
if("exit".equals(e.getActionCommand())) { // 这就是通过ActionCommand判断事件
int n = JOptionPane.showConfirmDialog(this, "您确定要退出?"); // 选择框:JOptionPane.showConfirmDialog(在哪弹出,"弹出的问题内容"); 选择框会有选项yes或no,再根据选的是yes还是no进行之后的操作
if(n == JOptionPane.YES_OPTION) {
System.exit(0); // 退出窗体以及程序方法,用这个方法就不用再写this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} else if("relogin".equals(e.getActionCommand())) {
int n = JOptionPane.showConfirmDialog(this, "您确定要重新登录?");
if(n == JOptionPane.YES_OPTION) {
LoginFrame loginFrame = new LoginFrame();
loginFrame.setBounds(720, 350, 500, 320);
loginFrame.setVisible(true);
this.dispose(); // 关闭主页面但不会影响新生成的登录页面
}
}
}
}
咱的第一个项目代码编写就要接近尾声了,就剩每个功能的操作代码了,下次将全部更新完成
Python简单爬数据实例
我们的python课也算刚刚结束了,课程设计是写一个简单的数据爬取代码
这是我写的简单的爬一个电影排行榜数据网页的代码,大家要用可以自取
报告我也一并分享给大家,如果帮到了有需要的同学记得给个赞哦
import io
import sys
import requests
from bs4 import BeautifulSoup
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] # 解决画图的中文乱码问题
url = 'https://cn163.net/archives/32966/'
resp = requests.get(url)
resp.encoding = 'utf-8'
html = resp.text
soup = BeautifulSoup(html, 'html.parser')
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')
tr_list = soup.find("tbody", attrs={"class": "row-hover"}).findAll("tr")
name_list = []
money_list = []
i=0
for tr in tr_list:
if i < 20:
i += 1
else:
break
#电影名
name = tr.find('td', attrs={"class": "column-1"}).text
name = name[2:]
name_list.append(name)
#预算
money = tr.find('td', attrs={"class": "column-3"}).text
money = money.replace('亿','')
money_list.append(money)
#折线图
#plt.plot(name_list,money_list)
#直方图
#plt.bar(name_list,money_list)
#饼图
#plt.pie(money_list,labels=name_list)
#散点图
plt.scatter(name_list,money_list)
plt.tick_params(axis='x', labelsize=6) #设置x轴字体大小
plt.xticks(rotation=45) #字体旋转45度
#显示图表
plt.show()
报告链接:
链接:https://pan.baidu.com/s/1FM9I17J6BEex2nXlnQFePA
提取码:jsk4
学习Java面试题(三次握手和四次挥手)
还是指路陈哈哈大佬的Java网络编程相关面试题原帖,太牛啦!
![](https://i-blog.csdnimg.cn/blog_migrate/e381027a5bd83dc160d54390d19d6fa4.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/88cc4670855c69b0415089f96a1e03db.jpeg)
![](https://i-blog.csdnimg.cn/blog_migrate/d1a0a6aadaa02bb17de74c7a48e8f6be.jpeg)
健身
有氧的计划基本上结束了,从明天开始应该会重拾拳击了,真的半年没再打过拳了,到时候也会分享给大家
![](https://i-blog.csdnimg.cn/blog_migrate/270d9e1c9522781483feaf1d45500a44.jpeg)
照片分享
![](https://i-blog.csdnimg.cn/blog_migrate/1bd228f33f59adc266ebd97cad5c2c8c.jpeg)