北邮JAVA高级语言程序设计(选修课)第六次图形化作业

北邮JAVA高级语言程序设计(选修课)第六次图形化作业

要求描述:
设计图形界面,实现员工信息的录入和查询。
该界面上有菜单如下
EmployeeInfoInput(一级菜单)
–CommisionEmployee(二级菜单)
–BasePlusCommisionEmployee

Search(一级菜单)
—AverageEarningSearch(查询全部员工的平均工资)

点击EmployeeInfoInput菜单下的某个菜单,弹出对话框,可以录入该类员工的详细信息,保存到内存中。
点击Search菜单下的AverageEarningSearch子菜单,显示全部员工的平均工资。

注:只考虑CommisionEmployee和BasePlusCommisionEmployee两类员工的信息输入。

源代码:

import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;


public class Enter
{    
	//我提前声明了一些按钮、标签以及输入框,让他们能被不同的内部类调用和修改
	factory f = new factory();
	public JButton btn1 = new JButton("EmployeeInfoInput");//一级菜单
	public JButton btn2 = new JButton("Search");//一级菜单
	public JButton btn3 = new JButton("退出系统");//一级菜单
	public JButton btn4 = new JButton("CommisionEmployee类员工");//二级菜单
	public JButton btn5 = new JButton("BasePlusCommisionEmployee类员工");//二级菜单
    public JButton btn6 = new JButton("返回");//二级菜单
	public JButton btn7 = new JButton("完成");//三级菜单CommisionEmployee类员工
	public JButton btn8 = new JButton("返回");//二级菜单
	public JButton btn9 = new JButton("完成");//三级菜单BasePlusCommisionEmployee类员工
	public JButton btn10 = new JButton("AverageEarningSearch");//二级菜单
	public JButton btn11 = new JButton("返回");//二级菜单
	public JButton btn12 = new JButton("ShowInfo");//二级菜单
	public JButton btn13 = new JButton("返回");//三级菜单ShowInfo
	
	JTextField text2 = new JTextField(25);//三级菜单CommisionEmployee类员工
	JTextField text1 = new JTextField(25);//三级菜单BasePlusCommisionEmployee类员工
	String ave2;
	JLabel label = new JLabel();
	//编写Enter()的构造方法	
	public Enter()
	{
		//先来实现主界面的设计
		JFrame window1 = new JFrame("员工信息的录入和查询");
		window1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//关闭窗口的同时结束整个程序
		window1.setSize(480, 600);
		window1.setLocation(720, 240);
		window1.setLayout(new FlowLayout(FlowLayout.CENTER,200,100));
		window1.setVisible(true);
		window1.add(btn1);
		window1.add(btn2);
		window1.add(btn3);
		//然后对主界面的三个按钮进行监听
		btn1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new CommisionEmployee();
			}
		});
		btn2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new AverageEarningSearch();
			}
		});
		btn3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				window1.dispose();
			}
		});
	}
	public class CommisionEmployee
	{
		public CommisionEmployee()
		{
			//其实创建不同的页面形式的大同小异,可以再声明一个内部类专门处理页面的创建
			//这样的代码思路更清晰,看起来也更好看
			//但我已经写完了...所以我懒得改了,直接Ctrl c + Ctrl v
			JFrame window2 = new JFrame("CommisionEmployee");
			window2.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			window2.setSize(480, 600);
			window2.setLocation(720, 240);
			window2.setLayout(new FlowLayout(FlowLayout.CENTER,200,100));
			window2.setVisible(true);
			window2.add(btn4);
			window2.add(btn5);
			window2.add(btn6);
			btn4.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					new InputCommisionEmployee();
				}
			});
			btn5.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					new InputBasePlusCommisionEmployee();
				}
			});
			btn6.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					window2.dispose();
				}
			});
		}
	}
	public class InputCommisionEmployee
	{
		public InputCommisionEmployee()
		{
			JFrame window3 = new JFrame("InputCommisionEmployee");
			window3.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			window3.setSize(480, 600);
			window3.setLocation(720, 240);
			window3.setLayout(new FlowLayout(FlowLayout.CENTER,200,100));
			window3.setVisible(true);
			window3.add(new JLabel("请输入员工信息形式如下:"));
			window3.add(new JLabel("gzo zihan 2018211031 7000 0.1"));
			window3.add(text2);
			window3.add(btn7);
			btn7.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					//这里省略了Employee类,直接处理好数据存入Hashmap中
					String line = text2.getText();
					String[] str = line.split(" ");
					double a = Double.parseDouble(str[3]);
					double b = Double.parseDouble(str[4]);
					String c = Double.toString(a*b);
					f.addEmployee(str[2],c);
					window3.dispose();
				}
			});
		}
	}
	public class Search
	{
		public Search()
		{
			JFrame window4 = new JFrame("CommisionEmployee");
			window4.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			window4.setSize(480, 600);
			window4.setLocation(720, 240);
			window4.setVisible(true);
			window4.add(new JLabel("全部员工的平均工资为:"));
			ave2 = Double.toString(f.Average());
			label.setText(ave2);
			//这里的label标签要声明在Enter类的全局变量中,不然是不会动态显示的
			//我最一开始不知道,浪费了好多时间QwQ
			window4.add(label);
			window4.add(btn8);
			window4.setLayout(new FlowLayout(FlowLayout.CENTER,200,100));
			btn8.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					window4.dispose();
				}
			});
		}
	}
	public class InputBasePlusCommisionEmployee
	{
		public InputBasePlusCommisionEmployee()
		{
			JFrame window5 = new JFrame("InputCommisionEmployee");
			window5.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			window5.setSize(480, 600);
			window5.setLocation(720, 240);
			window5.setLayout(new FlowLayout(FlowLayout.CENTER,200,100));
			window5.setVisible(true);
			window5.add(new JLabel("请输入员工信息形式如下:"));
			window5.add(new JLabel("gzo zihan 2018211031 7000 0.1 5000"));
			window5.add(text1);
			window5.add(btn9);	
			btn9.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					String line = text1.getText();
					String[] str = line.split(" ");
					double a = Double.parseDouble(str[3]);
					double b = Double.parseDouble(str[4]);
					double c = Double.parseDouble(str[5]);
					String d = Double.toString(a*b+c);
					f.addEmployee(str[2],d);
					window5.dispose();
				}
			});
		}
	}
	public class AverageEarningSearch
	{
		public AverageEarningSearch()
		{
			JFrame window6 = new JFrame("AverageEarningSearch");
			window6.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
			window6.setSize(480, 600);
			window6.setLocation(720, 240);
			window6.setLayout(new FlowLayout(FlowLayout.CENTER,200,100));
			window6.setVisible(true);
			window6.add(btn10);
			window6.add(btn12);
			window6.add(btn11);
			btn10.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					new Search();
				}
			});
			btn11.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					window6.dispose();
				}
			});
			//这里我加了一点小功能,显示已经输入的员工的编号和工资
			//其实我是想加名字的,但map只储存了编号和工资,就懒得再去处理名字了
			//我觉得可以在Enter的构造方法前声明两个数组来分别储存firstName和lastName
			//然后在显示的时候加上去
			btn12.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					new ShowInfo();
				}
			});
			
		}
		public class ShowInfo
		{
			public ShowInfo()
			{
				JFrame window7 = new JFrame("ShowInfo");
				window7.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				window7.setSize(480, 600);
				window7.setLocation(720, 240);
				window7.setLayout(new FlowLayout(FlowLayout.CENTER,100,50));
				window7.setVisible(true);
				String[] Info = {"socialNumber","Earning"};
				String[] data1 =  f.Number();
				String[] data2 = f.Money();
				int num = f.one();
				String[][] base;
				base = new String[10][10];
				for(int j = 0;j < num;j++)
				{
					base[j][0] = data1[j];
					base[j][1] = data2[j];
				}
				//这里用了JTable的构造方法之一,比另一个简便
				//base数组储存了表格信息,Info数组储存了表格名称
				JTable table = new JTable(base,Info);//这里用了JTable的构造方法之一,比另一个简便
				//一定要加这个JScrollPane(添加滚动条),不然表格名称无法显示
				//我也不知道为什么非要加....反正加了就能显示
				JScrollPane ScrollPane  = new JScrollPane(table);
				window7.add(ScrollPane );
				window7.add(btn13);
				btn13.addActionListener(new ActionListener() {
					public void actionPerformed(ActionEvent e) {
						window7.dispose();
					}
				});
			}
		}
	}
	//调用main()函数
	public static void main(String[] args) {
		new Enter();
	}
}

//声明一个factory类来储存员工编码和工资并实现相应的一些操作
class factory
{
	HashMap<String, String>employees = new HashMap<>();
	
	public void addEmployee(String num, String money)
	{
		employees.put(num, money);
	}
	void printEmployees()
	{
		for (String num : employees.keySet())
		{
            System.out.println(Double.parseDouble(employees.get(num)));
	    }
	}
	//这里我用了笨办法来获得员工编号和工资并返回储存的数组
	public String[] Number()
	{
		String[] data1;
		data1 = new String[10];
		int i = 0;
		for (String num : employees.keySet())
		{
			data1[i] = num;
			i++;
	    }
		return data1;
	}
	public String[] Money()
	{
		String[] sum;
		sum = new String[10];
		int i = 0;
		for (String num : employees.keySet())
		{
			sum[i] = employees.get(num);
			i++;
	    }
		return sum;
		
	}
	//计算员工的平均工资并返回
	double Average()
	{
		double[] sum;
		//这里我只设计了容量为11的数组来储存员工工资
		//也就是说最大只能计算11个人的平均工资,再多数组就会越界报错了
		sum = new double[10];
		int i = 0;
		double total = 0.0;
		double AVE = 0.0;
		for (String num : employees.keySet())
		{
			sum[i] = Double.parseDouble(employees.get(num));
			i++;
	    }
		for(int j = 0;j < i;j++)
		{
			total = total + sum[j];
		}
		AVE = total / Double.valueOf(i);
		return  AVE;
	}
	//计算已经输入的员工个数并返回个数值
	int one()
	{
		int i = 0;
		for (String num : employees.keySet())
		{
			i++;
	    }
		return i;
	}
}
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实验1 类的定义、对象数组的使用 1. 定义一个学生类(Student), 属性有 1)非静态属性String studentNumber 2)非静态属性String studentName 3)非静态属性int markForMaths 4)非静态属性int markForEnglish 5)非静态属性int markForScience 方法有: 1)构造方法Student(String number, String name) 2)构造方法Student() 3)String getNumber() 4)String getName() 5)void enterMarks(int markForMaths, int markForEnglish, int markForScience) 6)int getMathsMark() 7)int getEnglishMark() 8)int getScienceMark() 9)double calculateAverage() 10)String toString() 返回学生信息,包括学号、姓名、数学成绩、英语成绩、科学成绩、平均成绩。 注意:为了保证calculateAverage返回double类型,需要把三个分数的和除以3.0,而不是3. 另外,分数的初始值是什么?如果每个分数初始值为0,会造成混淆,分数为0表示还没有输入分数,还是分数确实为0?有更好的初始值吗? 编写Student类,并且编写一个StudentTest类,对Student类进行测试。 StudentTest类运行效果如下: 请输入学生学号:2011211301 请输入学生姓名:王晓 请输入学生三门课成绩(数学,英语,科学):88,79,90 学生信息如下: 学号:2011211301 姓名:王晓 数学成绩:88 英语成绩:79 科学成绩:90 平均成绩:85.66666666666667 2.定义一个StudentList类用来存储Student对象 属性有 1)Student[] list; //list存储学生对象 2)int total; //学生总人数 方法有: 1)StudentList(int length) //length是数组长度 2)boolean add(Student stu) //增加stu到数组中,成功,返回true,否则false 3)boolean remove(int no) //删除第no个数组元素,删除成功,返回true,否则false 4)boolean remove(Student number) //删除学号为number的学生,删除成功,返回true,否则false 5)boolean isEmpty() //判断数组是否为空,若是,返回true,否则false 6)Student getItem(int no) //返回第no个学生 7)Student getItem(Student number) //返回学号为number的学生,若该生不存在,返回null。 8) int getTotal() 返回学生总人数 编写StudentList类,并且编写一个StudentListTest类,对StudentList类进行测试。 StudentListTest类运行效果: 菜单如下,请输入 1~8代表您要执行的操作: 1. 增加1个学生 2. 根据学号删除学生 3. 根据位置删除学生 4. 判断是否为空 5.根据位置返回学生 6.根据学号返回学生 7. 输出全部学生信息 8.退出程序 请输入您的操作:1 请输入学生信息: 学号:2011211301 姓名:王晓 数学成绩:88 英语成绩:79 科学成绩:90 ---目前有1个学生,信息为---: 学号:2011211301 姓名:王晓 数学成绩:88 英语成绩:79 科学成绩:90 平均成绩:85.66666666666667 请输入您的操作:1 学号:2011211311 姓名:李辉 数学成绩:80 英语成绩:79 科学成绩:93 ---目前有2个学生,信息为---: 学号:2011211301 姓名:王晓 数学成绩:88 英语成绩:79 科学成绩:90 平均成绩:85.66666666666667 姓名:李辉 数学成绩:80 英语成绩:79 科学成绩:93 平均成绩:84.0 请输入您的操作:5 请输入学生位置:10 对不起,没有对应的学生 请输入您的操作:5 请输入学生位置:2 学生信息如下: 姓名:李辉 数学成绩:80 英语成绩:79 科学成绩:93 平均成绩:84.0 请输入您的操作:3 请输入要删除第几个学生:2 删除成功 ---目前有1个学生,信息为:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值