CalculateGPA小程序主要是为了方便Windows用户计算自己的综合成绩。开发的想法源于群里有人用C++或者VB实现了计算综合成绩的小程序,这让自己感觉Java也不能落后。其实,也就是晚上花了一点时间就做出来了,整个程序的代码不多,核心代码只有50行左右。下面简单说明一下程序逻辑。
实现逻辑:通过 Jsoup 来解析包含成绩的HTML页面,分别获取学分(credit)、成绩(score)两组数据,并分别存储在ArrayList集合(list_credit、list_score)中。当将HTML中的所有有用数据全部解析出来,再对list_credit和list_score中的数据对应取出,计算学分、成绩加权总和(total),同时计算学分总和(total_credit),最后计算total/total_credit即为综合成绩。
解析HTML中类名为user name的标签的文本内容即可。
这个界面设计比较简单,主要是通过javax.swing包创建JFrame、JtabbedPane、JLabel、JTextField、Jbutton、JFileChooser等。这部分代码直接放在了无参构造函数中,用来初始化小程序。
小程序有两个click事件需要监听,一个是选择文件,一个是确定。点击“选择”按钮之后,触发打开文件选择器,同时将选择文件的路径输入到窗体文本中;点击“确定”按钮,触发解析HTML文本,将结果显示在窗口提示界面中。
private static final long serialVersionUID = 1L;//Java序列化版本号
JFrame frame = new JFrame("CalculateGPA(航空所专用)");// 框架布局
JTabbedPane tabPane = new JTabbedPane();// 选项卡布局
Container con = new Container();// 窗体容器
JLabel label = new JLabel("选择文件"); //选择
JTextField text = new JTextField();// 文件的路径
JButton button1 = new JButton("选择");// 选择
JFileChooser jfc = new JFileChooser();// 文件选择器
JButton button2 = new JButton("确定");// 确定
public calculateGPA(){
jfc.setCurrentDirectory(new File("d://"));// 文件选择器的初始目录定为d盘
double lx = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double ly = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
frame.setLocation(new Point((int) (lx / 2) - 150, (int) (ly / 2) - 150));// 设定窗口出现位置
frame.setSize(400, 300);// 设定窗口大小
frame.setContentPane(tabPane);// 设置布局
label.setBounds(30, 35, 70, 20);
text.setBounds(95, 35, 150, 20);
button1.setBounds(250, 35, 70, 20);
button2.setBounds(150, 90, 60, 20);
button1.addActionListener(this); // 添加事件处理
button2.addActionListener(this); // 添加事件处理
con.add(label);
con.add(text);
con.add(button1);
con.add(button2);
frame.setVisible(true);// 窗口可见
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 使能关闭窗口,结束程序
tabPane.add("欢迎使用", con);// 添加布局1
}
public String getUserName(File input){
Document doc = null;
try {
doc = Jsoup.parse(input, "UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
Elements content = doc.getElementsByClass("user name");
String userName = content.get(0).text();
return userName;
}
public calculateGPA(){
jfc.setCurrentDirectory(new File("d://"));// 文件选择器的初始目录定为d盘
double lx = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
double ly = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
frame.setLocation(new Point((int) (lx / 2) - 150, (int) (ly / 2) - 150));// 设定窗口出现位置
frame.setSize(400, 300);// 设定窗口大小
frame.setContentPane(tabPane);// 设置布局
label.setBounds(30, 35, 70, 20);
text.setBounds(95, 35, 150, 20);
button1.setBounds(250, 35, 70, 20);
button2.setBounds(150, 90, 60, 20);
button1.addActionListener(this); // 添加事件处理
button2.addActionListener(this); // 添加事件处理
con.add(label);
con.add(text);
con.add(button1);
con.add(button2);
frame.setVisible(true);// 窗口可见
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);// 使能关闭窗口,结束程序
tabPane.add("欢迎使用", con);// 添加布局1
}
public void actionPerformed(ActionEvent e) {
if (e.getSource().equals(button1)) {
jfc.setFileSelectionMode(0);// 设定只能选择到文件
int state = jfc.showOpenDialog(null);// 此句是打开文件选择器界面的触发语句
if (state == 1) {
return;// 撤销则返回
} else {
File f = jfc.getSelectedFile();// f为选择到的文件
text.setText(f.getAbsolutePath());
}
}
if (e.getSource().equals(button2)) {
// 弹出对话框可以改变里面的参数具体得靠大家自己去看,时间很短
File f = jfc.getSelectedFile();
double result = calculate(f);
String userName = getUserName(f);
JOptionPane.showMessageDialog(null, userName+",您好!您的综合成绩为:"+result, "提示", 2);
}
}
public static void main(String[] args){
new calculateGPA();
}