转载请注明出处!
题目:
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;
}