基于JAVA和MYSQL数据库实现的小型公司工资管理系统

WhiteInterweaves

发布日期: 2018-11-05 11:25:51 浏览量: 2629
评分:
star star star star star star star star star star_border
*转载请注明来自write-bug.com

第一章 需求分析

1.1 功能要求

1.1.1 功能概况

本次设计要求运用面向对象设计知识,利用 JAVA 语言设计实现一个“小型公司工资管理系统”。

1.1.2 存储功能

能够存储雇员的编号、姓名、性别、所在部门,级别,并进行工资的计算。 其中,雇员级别分为经理、技术人员、销售人员和销售经理。四类人员的月薪计算方法如下:经理拿固定月薪;技术人员按小时领取月薪;销售人员按其当月销售额的提成领取工资;销售经理既拿固定月薪也领取销售提成。由此要求,该项目需要利用数据库的关系表存储数据。

1.1.3 添加功能

程序能够任意添加上述四类人员的记录,可提供选择界面供用户选择所要添加的人员类别,要求员工的编号要唯一,如果添加了重复编号的记录时,则提示数据添加重复并取消添加。需要利用 Java 语言连接数据库,使用数据库添加语句。

1.1.4 查询功能

可根据编号、姓名等信息对已添加的记录进行查询,如果未找到,给出相应的提示信息,如果找到,则显示相应的记录信息。利用 Java Swing 控件进行展示。

1.1.5 编辑功能

可根据查询结果对相应的记录进行修改,修改时注意编号的唯一性。

1.1.6 删除功能

主要实现对已添加的人员记录进行删除。如果当前系统中没有相应的人员记录, 则提示“记录为空!”并返回操作;否则,输入要删除的人员的编号或姓名,根据所输入的信息删除该人员记录,如果没有找到该人员信息,则提示相应的记录不存。

1.1.7 统计功能

能根据多种参数进行人员的统计。例如,统计四类人员数量以及总数,或者统计男、女员工的数量,或者统计平均工资、最高工资、最低工资等信息。利用数据库语句完成统计。

1.1.8 界面功能

利用 java 的 GUI 功能设计系统的图形用户界面,要求界面美观,易用。

第二章 概要设计

2.1 系统分析

2.1.1 架构设计

本系统采用架构如下图所示,主要分为三个模块:用户操作界面、身份认证中心和用户数据库。其中,用户操作界面为最顶层功能,便于用户选择以添加、修改、 删除、查询统计公司信息;身份认证中心便于鉴别不同用户,以实现映射到不同的数据库(表);用户数据库中保存用户个人存储的信息,同时实现最底层功能,即各项功能的基本操作。

2.1.2 实体设计

登陆实体

作为程序的进入窗口,用户登陆时,系统会要求用户输入账号和密码,并在数据库中进行匹配分析,若用户名存在且密码正确则通过身份认证,同时映射到用户 个人的数据表中,不同用户对应不同数据表存储相关信息。

主界面实体

登录成功后的功能选择界面,包含添加、查询、显示、统计四个功能,其中,对于查询或显示的信息可直接选择并完成修改删除功能。

添加功能实体

从主界面中选择进入,负责接收用户输入的员工信息,判断员工编号是否重复、录入的员工信息格式是否正确,并将符合要求的数据项其上传至数据库,完成添加员工信息的操作。

查询功能实体

从主界面中选择进入,按照用户选择的查找方式和具体查找要求,从数据库中筛选符合条件的信息并以表格形式显示,如果未查询到相关信息会给以提示。

修改功能实体

从查询功能实体进入。查询结果会以表格的形式显示在用户面前,用户可以双击某项查询结果进入编辑界面完成修改功能,同添加功能类似,系统会判断用户修改的编号是否已经重复、修改的信息是否格式正确,并将符合要求的信息在数据 库中完成更新修改操作。

删除功能实体

从查询功能实体进入。查询结果会以表格的形式显示在用户面前,用户可以双击某项查询结果进入编辑界面,在编辑界面中可选择删除此信息,删除完成后将会予以反馈。

统计功能实体

自动统计以下内容:公司整体信息(职位分布、部门人数分布等)、各部门详细信息(男女比例、工资情况、年龄情况、职位分部等),并可由用户自行选取具体部门、具体级别并显示统计结果,所有统计结果均自动绘图显示。

2.1.3 分层设计

数据库驱动层(数据层)

数据库驱动层为最底层,主要以各种 JDBC 数据库驱动语句以及各种算法组成,完成添加、修改、删除、查询、统计分析的基本功能,并完成添加修改过程中的编号查重、格式判断等异常判断。各功能成功或失败情况将传递给上层,同时,异常情况也将分类传递给上层。

异常处理层(功能层)

主要分类处理数据库反馈的结果,例如查询成功失败、添加的编号重复、修改成功等操作的反馈结果。并处理来自底层抛出的异常,捕获后生成提示信息传递给上一层。

用户界面层(表示层)

接受来自异常处理层的处理结果:对于异常,采用消息框提示的方式展示给用户;对于查询结果,以表格的形式显示在界面上;对于统计结果,自动绘制图表显示给用户;其他提示信息同样采用消息框给用户反馈。同时用户可以直接在界面上选择相应功能,底层会自动实现相应操作并反馈给用户界面层。

2.2 程序流程

2.2.1 系统流程图

2.2.2 调用关系

运行程序后,首先进入用户登陆界面,用户名与密码不匹配则登陆失败,成功则进入用户操作主界面。

在用户操作主界面中有四个按钮供用户选择,分别是:添加记录、查询记录、显示信息、统计整理,点击不同按钮跳转至不同功能实现界面。

添加信息模块允许用户添加新信息,系统会判断编号是否重复、各式是否正确。若通过审核则将此信息添加至数据库中,询问用户是否继续添加。如果退出则重新返回主界面。

查询信息模块允许用户按个人需求查询相关信息,如:职员编号、姓名、性别、级别、部门等。查询得到的信息会显示在表格中,用户可以点击表格中具体某一项选择编辑信息,在编辑模块中可以修改或删除选中的信息。

显示信息模块与查询功能类似,显示的内容会自动放入表格中同时允许编辑修改。 统计整理模块会将统计得到的信息以图表形式显示给用户,同时允许用户自行查询想要统计的信息并自动绘制图表。

第三章 详细设计

3.1 功能类定义与实现

3.1.1 常量与参数的定义(Parameter 类)

JDBC 数据库连接所用参数与端口

JDBC(Java Data Base Connectivity,java 数据库连接)是一种用于执行 SQL 语句的 Java API,可以为多种关系数据库提供统一访问,它由一组用 Java 语言编写的类和接口组成。JDBC 为数据库开发人员提供了一个标准的 API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序,并且可跨平台运行,并且不受数据库供应商的限制。

本系统采用的是MySQL数据库,编程语言为Java语言,编译器为Eclipse Oxygen,Java连接数据库时需要用到JDBC驱动器、数据库URL以及数据库管理员账号密码等。

根据数据库的 URL、用户名和密码,创建一个 JDBC Connection 对象。如: Connection connection = DriverManager.geiConnection(“连接数据库的 URL”, “ 用户名”, “密码”)。其中,URL=协议名+IP 地址(域名)+端口+数据库名称;用户名 和密码是指登录数据库时所使用的用户名和密码。示例创建 MySQL 的数据库连接代码如下:

  1. Connection connectMySQL = DriverManager.geiConnection("jdbc:mysql://localhost:3306/myuser","root" ,"root");
  2. public static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
  3. public static final String DB_URL = "jdbc:mysql://localhost:3306/java?useSSL=true&characterEncoding=UTF8";
  4. public static final String ACC = "root";
  5. public static final String PWD = "zxczxc";

职员级别对应代号

本系统中将职员级别分为四种:经理、技术人员、销售人员、销售经理,其中经理拿固定月薪;技术人员按小时领取月薪;销售人员按其当月销售额的提成领取工资;销售经理既拿固定月薪也领取销售提成。若想方便统计需要将对应职位转换成相应的代号。此处经理对应 int 型数字 1,技术人员对应 2,销售人员对应 3,销售经理对应 4.具体如下:

  1. public static final int Manager = 1; //经理
  2. public static final int Engineer = 2; //技术人员
  3. public static final int Salesman = 3; //销售人员
  4. public static final int SalesManager = 4; //销售经理

工资自动计算所需常量

由于经理拿固定月薪;技术人员按小时领取月薪;销售人员按其当月销售额的提成领取工资;销售经理既拿固定月薪也领取销售提成。若想方便计算工资,必须提前订好各种常量,如:固定的月薪、工作每小时的工资、销售额提成比例等,具体如下:

  1. public static final int BASE = 5000; //底薪
  2. public static final int HOUR = 80; //每小时工资
  3. public static final double Parameter = 0.015; //提成比例

3.1.2 职工个人信息的定义(Person 类)

职工个人信息

职工个人信息包括:职工编号(唯一)、姓名、性别、年龄、电话号码、所属部 门、工作级别、月工作时间、月销售总额、月工资。其中月工资不可显式输入,自动由程序结算得到。通过构造函数直接创建对象,具体如下:

  1. public Person(String ID,String name,String sex,int age,String phone, String department,int kind,int hours,double sells) { this.ID = ID;
  2. this.name = name;
  3. this.sex = sex;
  4. this.age = age;
  5. this.phone = phone;
  6. this.department = department;
  7. this.kind = kind;
  8. this.hours = hours;
  9. this.sells = sells;}

通过此方法得到私有成员变量:

  1. public String getID() {
  2. return ID;
  3. }

职工工资计算方法

经理拿固定月薪;技术人员按小时领取月薪;销售人员按其当月销售额的提成领取工资;销售经理既拿固定月薪也领取销售提成。具体计算方法如下:

  1. switch (kind) {
  2. case 1: this.salary = Parameter.BASE; break;
  3. case 2: this.salary = Parameter.HOUR*hours; break;
  4. case 3: this.salary = Parameter.Parameter*sells; break;
  5. case 4: this.salary = Parameter.BASE + Parameter.Parameter*sells; break;
  6. default: return;
  7. }

3.1.3 数据库查询与底层算法(JDBC 类)

JDBC 连接数据库

在开发环境中加载指定数据库的驱动程序。使用的数据库是MySQL,所以需要下载MySQL支持JDBC的驱动程序(mysql-connector-java-5.1.18-bin.jar);而开发环境是Eclipse,将下载得到的驱动程序加载进开发环境中。

在Java程序中加载驱动程序。在Java程序中,可以通过 “Class.forName(“指定数据库的驱动程序”)” 方式来加载添加到开发环境中的驱动程序,例如加载MySQL的数据驱动程序的代码为:

  1. Class.forName(“com.mysql.jdbc.Driver”);

创建数据连接对象:通过DriverManager类创建数据库连接对象Connection。DriverManager类作用于Java程序和JDBC驱动程序之间,用于检查所加载的驱动程序是否可以建立连接,然后通过它的getConnection方法,根据数据库的URL、用户名和密码,创建一个JDBC Connection 对象。如:

  1. Connection connection = DriverManager.geiConnection(“连接数据库的URL", "用户名", "密码”)

其中,URL=协议名+IP地址(域名)+端口+数据库名称;用户名和密码是指登录数据库时所使用的用户名和密码。

创建Statement对象:Statement 类的主要是用于执行静态 SQL 语句并返 回它所生成结果的对象。通过Connection 对象的 createStatement()方法可以创建一个Statement对象。例如:

  1. Statement statament = connection.createStatement();

具体示例创建Statement对象代码如下:

  1. Statement statamentMySQL =connectMySQL.createStatement();

调用Statement对象的相关方法执行相对应的 SQL 语句:通过execuUpdate() 方法用来数据的更新,包括插入和删除等操作,例如向staff表中插入一条数据的代码:

  1. statement.excuteUpdate("INSERT INTO staff(name, age, sex,address, depart, worklen,wage)" + " VALUES ('Tom1', 321, 'M', 'china','Personnel','3','3000' ) ");

通过调用Statement对象的executeQuery()方法进行数据的查询,而查询结果会得到 ResulSet对象,ResulSet表示执行查询数据库后返回的数据的集合,ResulSet对象 具有可以指向当前数据行的指针。通过该对象的next()方法,使得指针指向下一行,然后将数据以列号或者字段名取出。如果当next()方法返回null,则表示下一行中没有数据存在。使用示例代码如下:

  1. ResultSet resultSel = statement.executeQuery( "select * from staff" );

关闭数据库连接:使用完数据库或者不需要访问数据库时,通过Connection的 close() 方法及时关闭数据连接。

身份认证

对于用户,需要先要求输入账号密码,并将账号密码传入数据库身份鉴别表进行匹配,若用户名密码均匹配成功,则映射到用户创建的表中。传入参数为账号和密码,返回判断情况:返回1为账号不存在、返回2为密码不正确、返回3为出现数据库连接异常、返回0则认证成功。

  1. public static int LoginCharge(String acc,String pwd) {
  2. try {
  3. Class.forName(Parameter.JDBC_DRIVER);
  4. Connection conn = DriverManager.getConnection(Parameter.DB_URL, Parameter.ACC, Parameter.PWD);
  5. Statement stat = conn.createStatement();
  6. String query = "select * from `" + Parameter.COMPANY + "` where acc=\"" + acc + "\"";
  7. ResultSet rs = stat.executeQuery(query);
  8. if (!rs.next())
  9. return 1;//账号不存在
  10. String pwd2 = rs.getString("pwd");
  11. if(!pwd2.equals(pwd))
  12. return 2;//密码不正确
  13. String table = rs.getString("table");
  14. Parameter.TABLE = table;
  15. return 0;
  16. }catch (Exception e) {
  17. e.printStackTrace();
  18. return 3;
  19. }

插入信息模块中,需要判断插入的编号是否重复,如果重复则不允许插入,函数 rs.next()如果返回结果不为空,则说明已经存在此编号。输入信息为Person对象,返回判断结果:返回1为编号已存在,返回2为数据库连接异常,返回0为插入成功,具体如下:

  1. public static int insertIntoSql(Person p) {
  2. try {
  3. Class.forName(Parameter.JDBC_DRIVER);
  4. Connection conn = DriverManager.getConnection(Parameter.DB_URL, Parameter.ACC, Parameter.PWD);
  5. Statement stat = conn.createStatement(); // 判断是否已经存在编号
  6. String query1 = "select * from `" + Parameter.TABLE + "` where no=\"" + p.getID() + "\"";
  7. ResultSet rs = stat.executeQuery(query1);
  8. if (rs.next()) {
  9. return 1;
  10. }
  11. String query = "INSERT INTO `" + Parameter.TABLE + "` VALUES (\"" + p.getID() + "\",\"" + p.getName() + "\",\"" + p.getSex() + "\",\"" + p.getAge() + "\",\"" + p.getPhone() + "\",\"" + p.getDep() + "\",\"" + p.getKind() + "\",\"" + p.getHours() + "\",\"" + p.getSells() + "\",\"" + p.getSalary() + "\")";
  12. stat.executeUpdate(query);
  13. return 0;
  14. } catch (Exception expt) {
  15. return 2;
  16. }
  17. }

从数据库中删除信息

删除信息模块中,需要删除的编号是否存在,如果不存在则不允许删除,函数 rs.next()如果返回结果为空,则说明此编号对应的职员不存在。输入信息为职员的 编号ID,返回判断结果:返回1为编号不存在,返回2为数据库连接异常,返回0为插 入成功,具体如下:

  1. public static int deleteFromsql(String id) {
  2. try {
  3. Class.forName(Parameter.JDBC_DRIVER);
  4. Connection conn = DriverManager.getConnection(Parameter.DB_URL, Parameter.ACC, Parameter.PWD);
  5. Statement stat = conn.createStatement();
  6. String query1 = "select * from `" + Parameter.TABLE + "` where no=\"" + id + "\"";
  7. ResultSet rs = stat.executeQuery(query1);
  8. if (!rs.next()) {
  9. return 1;
  10. }
  11. String query2 = "delete from `" + Parameter.TABLE + "` where no=\"" + id + "\"";
  12. stat.executeUpdate(query2);
  13. return 0;
  14. } catch (Exception expt) {
  15. return 2;
  16. }
  17. }

从数据库中查询信息

查询信息模块中,具体分为按照ID查询和按照其他条件查询,具体差别为ID唯一,至多只能查找到一条信息,而按照其他条件查询可能会返回多条信息,因此需要区 别处理,输入信息为职员的信息,返回值为查询结果,为空则查询失败具体如下:

  1. public static String searchByID(String id) {//按照ID查询
  2. try {
  3. Class.forName(Parameter.JDBC_DRIVER);
  4. Connection conn = DriverManager.getConnection(Parameter.DB_URL, Parameter.ACC, Parameter.PWD);
  5. Statement stat = conn.createStatement();
  6. String query1 = "select * from `" + Parameter.TABLE + "` where no=\"" + id + "\"";
  7. ResultSet rs = stat.executeQuery(query1);
  8. if (!rs.next()) {
  9. return null;
  10. }
  11. String name = rs.getString("name");
  12. String sex = rs.getString("sex");
  13. int age = rs.getInt("age");
  14. String phone = rs.getString("phone");
  15. String department = rs.getString("department");
  16. int kind = rs.getInt("kind");
  17. int hours = rs.getInt("hours");
  18. double sells = rs.getDouble("sales");
  19. double salary = rs.getDouble("salary");
  20. String result = id + "@" + name + "@" + sex + "@" + age + "@" + phone + "@" + department + "@" + kind + "@" + hours + "@" + sells + "@" + salary;
  21. // 生成日志
  22. File f = new File("log.txt");
  23. if (!f.exists())
  24. f.createNewFile();
  25. PrintStream ps = new PrintStream(new FileOutputStream(f));
  26. ps.println(result);
  27. ps.close();
  28. return result;
  29. } catch (Exception expt) {
  30. return "Fail";
  31. }
  32. }
  33. public static String searchByOthers(String chosen, String others) { //按照其他条件查询,chosen为条件,others为具体筛选内容
  34. try {
  35. Class.forName(Parameter.JDBC_DRIVER);
  36. Connection conn = DriverManager.getConnection(Parameter.DB_URL, Parameter.ACC, Parameter.PWD);
  37. Statement stat = conn.createStatement();
  38. String query;
  39. if (chosen.equals("age") || chosen.equals("kind"))
  40. query = "select * from `" + Parameter.TABLE + "` where " + chosen + "=\"" + Integer.parseInt(others) + "\"";
  41. else
  42. query = "select * from `" + Parameter.TABLE + "` where " + chosen + "=\"" + others + "\"";
  43. ResultSet rs = stat.executeQuery(query);
  44. if (!rs.next()) {
  45. return null;
  46. }
  47. String id = rs.getString("no");
  48. String name = rs.getString("name");
  49. String sex = rs.getString("sex");
  50. int age = rs.getInt("age");
  51. String phone = rs.getString("phone");
  52. String department = rs.getString("department");
  53. int kind = rs.getInt("kind");
  54. int hours = rs.getInt("hours");
  55. double sells = rs.getDouble("sales");
  56. double salary = rs.getDouble("salary");
  57. String result = id + "@" + name + "@" + sex + "@" + age + "@" + phone + "@" + department + "@" + kind + "@" + hours + "@" + sells + "@" + salary;
  58. while (rs.next()) {
  59. id = rs.getString("no");
  60. sex = rs.getString("sex");
  61. name = rs.getString("name");
  62. age = rs.getInt("age");
  63. phone = rs.getString("phone");
  64. department = rs.getString("department");
  65. kind = rs.getInt("kind");
  66. hours = rs.getInt("hours");
  67. sells = rs.getDouble("sales");
  68. salary = rs.getDouble("salary");
  69. result += "#" + id + "@" + name + "@" + sex + "@" + age + "@" + phone + "@" + department + "@" + kind + "@" + hours + "@" + sells + "@" + salary;
  70. }
  71. } catch (Exception expt) {
  72. expt.printStackTrace();
  73. return "Fail";
  74. }
  75. }

从数据库中更新信息

编辑信息模块中,如果需要修改信息,则需要启用更新操作:先判断是否修改了编号,如果修改编号则需要判断修改后的编号是否重复,如果重复则不允许修改为此编号。输入修改前的Person对象和修改后的Person对象,如果修改失败则回退操作,即把原来的Person对象恢复,具体实现如下:

  1. public static int UpdateFromsql(Person newP, Person oldP) {
  2. try {
  3. Class.forName(Parameter.JDBC_DRIVER);
  4. Connection conn = DriverManager.getConnection(Parameter.DB_URL, Parameter.ACC, Parameter.PWD);
  5. Statement stat = conn.createStatement();
  6. if (deleteFromsql(oldP.getID()) != 0) {
  7. return 1;
  8. }
  9. String query1 = "select * from `" + Parameter.TABLE + "` where no=\"" + newP.getID() + "\"";
  10. ResultSet rs = stat.executeQuery(query1);
  11. if (rs.next()) {
  12. if (insertIntoSql(oldP) != 0)
  13. JOptionPane.showMessageDialog(null, "发生未知错误");
  14. return 2;
  15. }
  16. if (insertIntoSql(newP) != 0) {
  17. if (insertIntoSql(oldP) != 0)
  18. JOptionPane.showMessageDialog(null, "发生未知错误");
  19. return 3;
  20. }
  21. return 0;
  22. } catch (Exception expt) {
  23. if (insertIntoSql(oldP) != 0)
  24. JOptionPane.showMessageDialog(null, "发生未知错误");
  25. return 4;
  26. }
  27. }

从数据库中统计整理信息

统计整理模块功能较为复杂,但实现方法大体类似,根据具体的查询条件和查询内容查询相关的信息,并返回结果,具体实现如下:

统计数量

  1. public static int statisticCount(String option) {
  2. try {
  3. Class.forName(Parameter.JDBC_DRIVER);
  4. Connection conn = DriverManager.getConnection(Parameter.DB_URL, Parameter.ACC, Parameter.PWD);
  5. Statement stat = conn.createStatement();
  6. String query = "select count(*) from `" + Parameter.TABLE + "` "+option;
  7. ResultSet rs = stat.executeQuery(query);
  8. if (!rs.next()||rs.getString(1)==null) {
  9. return 0;
  10. }
  11. int result = Integer.parseInt(rs.getString(1));
  12. return result;
  13. } catch (Exception expt) {
  14. JOptionPane.showMessageDialog(null, "发生未知错误");
  15. return 0;
  16. }
  17. }

统计不同职位的人数

  1. public static int statisticKindCount(int kind, String option1, String option2)

统计不同性别的人数

  1. public static int statisticSexCount(String sex, String option1, String option2)

统计最高、最低、平均工资

  1. public static double statisticAvgSalary(String option1, String option2)
  2. public static double statisticMaxSalary(String option1, String option2)
  3. public static double statisticMinSalary(String option1, String option2)

统计最大、最小、平均年龄

  1. public static double statisticAvgAge(String option1, String option2)
  2. public static int statisticMaxAge(String option1, String option2)
  3. public static int statisticMinAge(String option1, String option2)

3.2 图形界面类定义与实现

3.2.1 JFreeChart 制图(JFreeChart 类)

柱形图制作

传入图表的名称(标题)、Dataset 容器(存放图形参数)、以及所要绘制图形的颜色,返回绘制的 Chart 图形。

  1. public class CategoryChart {
  2. public static JFreeChart createChart(String name, CategoryDataset dataset,Color color) {
  3. JFreeChart chart = ChartFactory.createBarChart3D(name, null, null, dataset, PlotOrientation.VERTICAL, true, false, false);
  4. CategoryPlot plot = chart.getCategoryPlot();// 设置图的高级 属性
  5. BarRenderer3D renderer = new BarRenderer3D();// 3D 属性修改
  6. plot.setNoDataMessage("无 信 息");
  7. renderer.setSeriesPaint(0,color); //设置柱的颜色
  8. // 设置网格竖线颜色
  9. plot.setDomainGridlinePaint(Color.gray);
  10. plot.setDomainGridlinesVisible(true); // 设置网格横线颜色
  11. plot.setRangeGridlinePaint(Color.gray);
  12. plot.setRangeGridlinesVisible(true); // 图片背景色
  13. plot.setBackgroundPaint(Color.LIGHT_GRAY);
  14. plot.setOutlineVisible(true); // 设置墙体颜色
  15. renderer.setWallPaint(Color.gray);
  16. // 对 X 轴做操作
  17. CategoryAxis domainAxis = plot.getDomainAxis();
  18. // 对 Y 轴做操作
  19. ValueAxis rAxis = plot.getRangeAxis();
  20. renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
  21. renderer.setBaseItemLabelsVisible(true);
  22. renderer.setBaseItemLabelFont(new Font("黑体", Font.CENTER_BASELINE, 12), true);
  23. renderer.setBasePositiveItemLabelPosition( new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.CENTER_LEFT));
  24. renderer.setItemLabelAnchorOffset(15);
  25. //设置距离图片左端距离
  26. domainAxis.setUpperMargin(0.2); //设置距离图片右端距离
  27. domainAxis.setLowerMargin(0.2); //设置柱的透明度
  28. plot.setForegroundAlpha(0.6f); // 最后还得将 renderer 放到 plot 中
  29. plot.setRenderer(renderer);// 将修改后的属性值保存到图中
  30. return chart;
  31. }
  32. }

饼图制作

传入图表的名称(标题)、Dataset 容器(存放图形参数),饼图颜色自动分配,返回绘制的 Chart 图形。

  1. public class PieChart {
  2. public static JFreeChart createChart(String name,PieDataset piedataset) {
  3. JFreeChart jfreechart = ChartFactory.createPieChart3D(name, piedataset, true, true, false);
  4. PiePlot3D pieplot3d = (PiePlot3D) jfreechart.getPlot();
  5. pieplot3d.setNoDataMessage("无 信 息");
  6. pieplot3d.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}:{1}({2})"));//设置标签显示的格式
  7. pieplot3d.setSectionOutlinesVisible(false);
  8. pieplot3d.setLabelBackgroundPaint(new Color(220, 220, 220));//设置标签的背景颜色。
  9. //设置旋转角度
  10. pieplot3d.setStartAngle(180.0); //设置旋转方向,Rotation.CLOCKWISE)为顺时针
  11. pieplot3d.setDirection(Rotation.CLOCKWISE); //设置图表透明图 0.0~1.0 范围。0.0 为完全透明,1.0 为完全不透明
  12. pieplot3d.setForegroundAlpha(0.9F);
  13. return jfreechart;
  14. }
  15. }

3.2.2 Dataset 容器(JFreeChart 制图所需容器)

柱形图数据集

主要包括年龄统计的数据集和工资统计的数据集,对于年龄和工资,本系统统计最大值、平均值和最小值,对于这三项数据,采用柱形图绘制比较合适。代码见附录。

饼图数据集

主要包括性别比例统计的数据集和不同部门、级别人数分布统计的数据集,对于年龄比例和人数比例,本系统绘制饼图直观的展现不同种类人数所占比例的大小。代码见附录

3.2.3 界面设计与制作(JFrame 继承子类)

主要包括登陆界面、主界面、插入信息界面、查询信息界面、编辑界面(修 改删除查询详情)、显示信息界面(表格显示)、统计整理界面(自动制作柱形图、 饼图),详情见第五章。 设计界面主要使用 Java Swing 和 Java AWT,采用框架 Java BeautyEye,同 时采用事件处理等接口完成图形界面设计,做到良好的美观性以及实用性、易用性。便于用户操作。

3.3 函数调用关系图

程序由 LoginFrame()进入,登陆成功进入 MainFrame(),Mainframe 可以选择进入 InsertFrame、QueryFrame 和 StatisticFrame,其中 QueryFrame 调用 Delete 和 Update 函数,Statistic 调用 HandleDate、JFreeChart 和 JDBC 函数完成统计并自动将数据可视化。

第四章 测试结果

4.1 登陆界面

4.2 程序主界面

如果登陆失败,如账号不存在或密码错误,则会给以相应提示,登陆成功则跳转至程序主界面。

4.3 添加信息界面

如果编号重复、添加内容格式不正确,则会有一定提示:

4.4 查询信息界面

查询界面打开后默认显示全部记录,以表格形式显示

共有五种查询方式可选择:

在此处我们选择查询部门为技术部的所有职员,其他类似不做重复测试。可以看到表格刷新,显示出符合条件的所有记录:

4.5 编辑信息界面

在查询界面点击每条查询结果的最右侧按钮可进入编辑界面,可以修改、删除、查询详细信息

4.6 统计整理界面

上传的附件 cloud_download 小型公司工资管理系统.7z ( 7.90mb, 335次下载 )
error_outline 下载需要8点积分

keyboard_arrow_left上一篇 : 基于android的2048 基于JSP的网上花店系统的设计与实现 : 下一篇keyboard_arrow_right



WhiteInterweaves
2018-11-05 11:27:03
使用JAVA和MYSQL数据库实现的小型公司工资管理系统
心跳
2019-06-23 20:20:12
eclipse可以直接导入嘛?
wuzhihan
2019-06-27 12:57:21
不需要MySQL建表吗
wuzhihan
2019-06-27 12:58:18
不需要MySQL建表吗
wuzhihan
2019-06-27 12:59:26
不需要MySQL建表吗

发送私信

别人早就看开的事情, 你只是比别人慢了点

5
文章数
11
评论数
eject