学生成绩管理系统(JAVA版本)

转载请注明出处!

题目:

1) 设计一课程成绩录入系统,需要录入的信息包括学生的班级、学号、姓名、性别、课程名和成绩等。根据这些信息的性质选择使用不同的图形组件来设计界面。

基本功能有:

(a) 某课程的成绩一览画面,可以察看所有学生的成绩信息。

    提供录入,更新,删除等功能按钮, 并实现各按钮响应的事件。

(b) 成绩录入画面,提供学生信息的录入组件,界面包括班级、学号、姓名、性别、课程名和成绩的输入域和一个录入按钮。

注意事项:

1)当用户单击录入按钮时,程序检查各输入域中是否有非空的数据,若有空域则抛出一个Exception对象;同时程序检查成绩输入域,如果不是数值信息,或是负的数值信息,也抛出相应的异常。在抛出异常之前应提供详细的信息说明,从而让使用该程序的用户了解所出现的问题,同时考虑上述异常出现时程序应该如何处理。

2)可以考虑,结合数据库知识,将用户录入的信息保存到数据库中。也可以保存到csv文件中。


这是我带java助教的最后一个实验了,花了两天时间写了一下。希望对你们能有帮助。

首先我没有考虑使用数据库,而选择了用csv文件操作。一方面单就题目而言数据量不是很大,操作无非是 增删改查。另一方面:文件操作方便快捷,占用资源小。但是带来的问题也有很多。比如安全性;频繁的磁盘操作等等;好了首先说说我的思路把:

首先要新建csv文件,里面保存了所有记录(不是手动添加的),字段用 逗号 隔开。

那么加载进来放在那里?难道每次新建一条记录,或者删除一条记录都要对文件进行操作吗?

我想到了用一个 ArrayList 保存这些记录。程序一开始就从csv文件一行一行读入记录然后放在一个全局变量ArrayList里面。这样不管是 增删改查 都在这个 链表里面操作 。切记,程序退出的时候 ,要把链表里面的值一行一行写入文件!! 所以对文件的操作次数减少了N多。

效果图如下:


源码如下:

login.java

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.BorderLayout;

import javax.swing.ImageIcon;
import javax.swing.JLabel;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JScrollPane;
import javax.swing.RowSorter;

import java.awt.Panel;
import java.awt.FlowLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.StringTokenizer;
import java.util.Vector;

import javax.swing.JTextPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 * @author 最爱C大调
 * @version 
 *创建时间:2014-6-5 下午6:09:56
 *类说明
 */
public class login {
	
	static ArrayList<Student> as = new ArrayList<Student>(); //重要! 保存了当前处理的所有记录!

	private JFrame frame;
	JTable table;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					login window = new login();
					window.frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the application.
	 */
	public login() {
		initialize();
	}

	/**
	 * Initialize the contents of the frame.
	 */
	private void initialize() {
		load();
		frame = new JFrame();
		frame.getContentPane().setBackground(new Color(153, 204, 153));
		frame.setBounds(400, 400, 525, 447);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		// 关闭程序之前将list 里面保存的所有记录写出文件!
		frame.addWindowListener( new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				try {
				
					File stu_csv = new File("F://stu.csv");
					if(stu_csv.exists())    //必须删除原有文件,保持文件没有冗余!
						stu_csv.delete();
					stu_csv.createNewFile();
					BufferedWriter bfw = new BufferedWriter(new FileWriter(stu_csv,true));//true 表示文件是追加模式
					//bfw.newLine();
					for (Student stu : as) {
						bfw.write(stu.id+","+stu.name+","+stu.kecheng+","+stu.score+"\r\n");
					}
					bfw.close();
					
				} catch (IOException es) {
					// TODO Auto-generated catch block
					es.printStackTrace();
				}
				System.exit(0);
			};
		}
			
		);
		//Image img=Toolkit.getDefaultToolkit().getImage("C:\\Users\\Administrator\\Desktop\\wancy.jpg");
		ImageIcon img = new ImageIcon("C:\\Users\\Administrator\\Desktop\\wancy.jpg");
		
		JMenuBar menuBar = new JMenuBar();
		frame.setJMenuBar(menuBar);
		
		JMenu mnNewMenu = new JMenu("操作");
		menuBar.add(mnNewMenu);
		
		JMenuItem add_menuItem = new JMenuItem("添加");
		
		mnNewMenu.add(add_menuItem);
		add_menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new addScore(as);
			}
		});
		
		JMenuItem del_menuItem = new JMenuItem("删除");
		del_menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new delet(as);
			}
		});
		mnNewMenu.add(del_menuItem);
		
		JMenuItem change_menuItem = new JMenuItem("修改");
		change_menuItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				new modify(as);
			}
		});
		mnNewMenu.add(change_menuItem);
		
		JMenuItem query_menuItem = new JMenuItem("查询");
		mnNewMenu.add(query_menuItem);
		
		JMenuItem update_menuItem = new JMenuItem("更新");
		mnNewMenu.add(update_menuItem);
		//显示界面
				String col[]={"学号","姓名","课程","分数"};
				final DefaultTableModel tableModel = new DefaultTableModel(col, 0);
			  JTable table = new JTable(tableModel);
			  table.setEnabled(false);
				JScrollPane pane = new JScrollPane(table); //设置table不可编辑
				JTableHeader tableH;
				table.setBackground(new Color(144,238,144));
				table.setForeground(new Color(100,100,100)) ;
				table.setGridColor(new Color(105 ,105, 105));
				tableH = table.getTableHeader();
			    //设置表头的背景色
			    tableH.setBackground(new Color(200, 200, 200));
			    //设置表头的文字颜色
			  
			    tableH.setForeground(new Color(0,0,205));
				for (Student student : as) {
					Object [] data ={student.id,student.name,student.kecheng,student.score};
					tableModel.addRow(data);
				}
				tableModel.fireTableDataChanged();
				 RowSorter<TableModel> sorter = new TableRowSorter<TableModel>(tableModel); //可以排序
				 table.setRowSorter(sorter);
				 frame.getContentPane().add(pane, BorderLayout.CENTER);
				
		
		update_menuItem.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				
				tableModel.setRowCount(0); // 之前的table一定要清零!
				//ArrayList<Student> asss = new display().as;
				//load();
				for (Student student : as) {
					Object [] data1 ={student.id,student.name,student.kecheng,student.score};
					System.out.println(student.id+student.name+student.kecheng+student.score);
					tableModel.addRow(data1);
				}
				//tableModel.fireTableDataChanged(); // 更新table;
				
				//System.out.println("hello");
				
				 
			}
		});
		
		
	}
	void load(){
		try { 
	           File csv = new File("F://stu.csv"); // CSV文件

	           BufferedReader br = new BufferedReader(new FileReader(csv));

	           // 读取直到最后一行 
	           String line = ""; 
	           while ((line = br.readLine()) != null) { 
	               // 把一行数据分割成多个字段 
	               StringTokenizer st = new StringTokenizer(line, ",");
	               Student sst = new Student(st.nextToken(),st.nextToken(),st.nextToken(),st.nextToken());
	               as.add(sst);
	               System.out.println(); 
	           } 
	           br.close();
	           

	       } catch (FileNotFoundException e) { 
	           // 捕获File对象生成时的异常 
	           e.printStackTrace(); 
	       } catch (IOException e) { 
	           // 捕获BufferedReader对象关闭时的异常 
	           e.printStackTrace(); 
	       } 
	}
	
}
</pre><p>addScore.java</p><pre code_snippet_id="381138" snippet_file_name="blog_20140607_3_9770692" name="code" class="java">import java.awt.BorderLayout;

/**
 * @author 最爱C大调
 * @version 
 *创建时间:2014-6-6 下午1:02:05
 *类说明
 */
public class addScore extends JFrame implements ActionListener {
	JPanel pan = new JPanel();
	JPanel pan1 = new JPanel();
	JLabel lb_id = new JLabel("学号");
	JTextField tf_id = new JTextField(10);
	JLabel lb_name = new JLabel("姓名");
	JTextField tf_name = new JTextField(8);
	JLabel lb_kecheng = new JLabel("课程名");
	JTextField tf_kecheng = new JTextField(20);
	JLabel lb_score = new JLabel("分数");
	JTextField tf_score = new JTextField(8);
	JButton add_ok = new JButton("确认");
    JButton  reset = new JButton("重置");
    /*
	 * Create the frame.
	 */
	public addScore(final ArrayList<Student> as) {
		
		//setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(500, 500, 450, 300);
	
		//contentPane.setLayout(new BorderLayout(0, 0));
		getContentPane().setLayout(new BorderLayout());
		pan.setLayout(new GridLayout(4,2));
		lb_id.setHorizontalAlignment(SwingConstants.CENTER);
		pan.add(lb_id);
		pan.add(tf_id);
		lb_name.setHorizontalAlignment(SwingConstants.CENTER);
		pan.add(lb_name);
		pan.add(tf_name);
		lb_kecheng.setHorizontalAlignment(SwingConstants.CENTER);
		pan.add(lb_kecheng);
		pan.add(tf_kecheng);
		lb_score.setHorizontalAlignment(SwingConstants.CENTER);
		pan.add(lb_score);
		pan.add(tf_score);
		pan1.add(add_ok);
		getContentPane().add(pan,BorderLayout.NORTH);
		getContentPane().add(pan1,BorderLayout.SOUTH);
		
		pan1.add(reset);
		setVisible(true);
		
		reset.addActionListener(this);
		add_ok.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String str_id,str_name,str_kecheng,str_score;
				str_id = tf_id.getText();
				str_name = tf_name.getText();
				str_kecheng = tf_kecheng.getText();
				str_score = tf_score.getText();
				try {                                                                         // 异常检测!
					
					if(Double.parseDouble(str_score)<0||Double.parseDouble(str_score)>100)      
						throw new NegativeScoreException("please enter a correct score!");
				  if(str_id.equals("")||str_name.equals("")||str_kecheng.equals("")||str_score.equals("")){
					    //System.out.print("logerro");
						throw new NegativeStuException("no input !");}
				} catch (NegativeScoreException es) {
					// TODO: handle exception
					System.out.println(es);
				} catch(NegativeStuException es) {
					System.out.println(es);
				}
				as.add(new Student(str_id, str_name, str_kecheng, str_score));
				JDialog jd_ok = new JDialog();
				JLabel jl_ok = new JLabel();
				jl_ok.setText("添加成功!");
				jd_ok.add(jl_ok);
				jd_ok.setSize(200,100);
				jd_ok.setLocationRelativeTo(null);
				jd_ok.setVisible(true);
			}
		});
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		/*if(e.getSource()==add_ok){
			add();
		}*/
		if(e.getSource()==reset){
			reset();
		}
	}
	void add(){}
	
	void reset(){
		tf_id.setText("");
		tf_name.setText("");
		tf_kecheng.setText("");
		tf_score.setText("");
	}
	

}
 class NegativeScoreException extends Exception
{
	 public NegativeScoreException(String mes) {
		// TODO Auto-generated constructor stub
		super(mes);
	}
}
 
 class NegativeStuException extends Exception
 {
	 public NegativeStuException(String mes) {
		// TODO Auto-generated constructor stub
		 super(mes);
	}
 }

import java.awt.event.ActionEvent;

/**
 * @author 最爱C大调
 * @version 
 *创建时间:2014-6-6 下午10:12:32
 *类说明
 */
public class delet  extends JFrame  {
		JPanel panel = new JPanel();
		JPanel panel2 = new JPanel();
		JLabel jl = new JLabel("将要删除记录的学号:");
		JTextField jt = new JTextField(10);
		JButton jb_ok = new JButton("OK");
		
	 delet(final ArrayList<Student> as){
	 	
	 	getContentPane().add(panel, BorderLayout.CENTER);
	 	getContentPane().add(panel2, BorderLayout.SOUTH);
	 	setSize(300,200);
		 panel.add(jl);
		 panel.add(jt);
		 panel2.add(jb_ok);
		 setBounds(500, 500, 450, 300);
		 setVisible(true);
		 jb_ok.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				boolean flag = true;
				for (Student student : as) {
					if(student.id.equals(jt.getText()))
					{
						flag = false;
						as.remove(student);
						JDialog dl = new JDialog();
						JLabel text = new JLabel("删除成功!");
						dl.add(text);
						dl.setSize(100,100);
						dl.setLocationRelativeTo(null);
						dl.setVisible(true);
					}
					
				}
				if(flag)
				{
					JDialog dl = new JDialog();
					JLabel text = new JLabel("没有这条记录!");
					dl.add(text);
					dl.setSize(100,100);
					dl.setLocationRelativeTo(null);
					dl.setVisible(true);
				}
			}
		});
	}

	
}



import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.*;

/**
 * @author 最爱C大调
 * @version 
 *创建时间:2014-6-7 上午11:03:48
 *类说明
 */
public class modify extends JFrame {
	
	JPanel pan = new JPanel();
	JPanel pan1 = new JPanel();
	JLabel lb_id = new JLabel("学号");
	JTextField tf_id = new JTextField(10);
	JLabel lb_name = new JLabel("姓名");
	JTextField tf_name = new JTextField(8);
	JLabel lb_kecheng = new JLabel("课程名");
	JTextField tf_kecheng = new JTextField(20);
	JLabel lb_score = new JLabel("分数");
	JTextField tf_score = new JTextField(8);
	JButton add_ok = new JButton("确认");
    JButton  reset = new JButton("重置");
	public modify(final ArrayList<Student> as) {
		// TODO Auto-generated constructor stub
		setBounds(500, 500, 450, 300);
		getContentPane().setLayout(new BorderLayout());
		pan.setLayout(new GridLayout(4,2));
		lb_id.setHorizontalAlignment(SwingConstants.CENTER);
		pan.add(lb_id);
		pan.add(tf_id);
		lb_name.setHorizontalAlignment(SwingConstants.CENTER);
		pan.add(lb_name);
		pan.add(tf_name);
		lb_kecheng.setHorizontalAlignment(SwingConstants.CENTER);
		pan.add(lb_kecheng);
		pan.add(tf_kecheng);
		lb_score.setHorizontalAlignment(SwingConstants.CENTER);
		pan.add(lb_score);
		pan.add(tf_score);
		pan1.add(add_ok);
		getContentPane().add(pan,BorderLayout.NORTH);
		getContentPane().add(pan1,BorderLayout.SOUTH);
		
		pan1.add(reset);
		setVisible(true);
		add_ok.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				String str_id,str_name,str_kecheng,str_score;
				str_id = tf_id.getText();
				str_name = tf_name.getText();
				str_kecheng = tf_kecheng.getText();
				str_score = tf_score.getText();
				/*if(!as.contains(str_id))
				{
					
				}*/
				boolean flag = false;
				for (Student student : as) {
					if(student.id.equals(str_id))
					{
						flag = true;
						student.name=str_name;
						student.kecheng=str_kecheng;
						student.score = str_score;
					}	
				}
				if(!flag)
				{
					JDialog dl = new JDialog();
					JLabel text = new JLabel("没有这条记录!重新输入!");
					dl.add(text);
					dl.setSize(100,100);
					dl.setLocationRelativeTo(null);
					dl.setVisible(true);
				}
			}
		});
		
		reset.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				tf_id.setText("");
				tf_name.setText("");
				tf_kecheng.setText("");
				tf_score.setText("");
			}
		});

	}

}

/**
 * @author 最爱C大调
 * @version 
 *创建时间:2014-6-6 下午3:58:55
 *类说明
 */
public class Student {
	String id;
	String name;
	public Student(String id, String name, String kecheng, String score) {
		//super();
		this.id = id;
		this.name = name;
		this.kecheng = kecheng;
		this.score = score;
	}
	String kecheng;
	String score;
}



评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值