📜  使用Java Swing 的学生成绩计算器(1)

📅  最后修改于: 2023-12-03 15:06:52.431000             🧑  作者: Mango

使用Java Swing 的学生成绩计算器

这是一个使用Java Swing编写的学生成绩计算器。它可以帮助用户计算他们的平均分数,课程GPA和绩点等信息。这个应用程序是使用MVC模式(Model-View-Controller)开发的,它将数据和用户界面分开,同时保持逻辑一致性。

界面设计

这个应用程序的GUI界面使用简单的布局来显示文本标签和文本框。它有一个按钮,当按钮按下时,会触发计算平均分数和课程GPA的方法。这个计算器有三个文本框,用户可以在这些文本框中输入他们的三个成绩。右侧还有一个文本区域,用于显示计算后的结果。

实现细节

这个应用程序是用Java Swing编写的。它使用MVC模式,并且将UI组件和逻辑组件分开。这种设计使应用程序易于扩展和维护。在代码中,我们使用了一些Java Swing组件,例如JLabel,JTextField,JButton 和 JTextArea等,以构建用户界面。我们还使用了事件监听器(ActionListener)来处理用户界面事件和呈现计算后的结果。在Model部分,我们定义了一个NameValue数据结构来保留每门成绩的详细信息。在Controller部分,我们编写了一个方法来计算平均分数,课程GPA和绩点。在View部分,我们编写了一个方法来呈现并更新用户界面。

优化思路

在当前的实现中,我们只能计算三个成绩的平均分数,这是不够灵活的。我们可以通过增加更多的文本框来使应用程序具有更大的灵活性。此外,我们可以考虑实现“撤销”和“重做”功能,以便用户可以更轻松地更正错误。我们还可以添加一些图表,以便用户可以更好地了解他们的成绩分布。

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

public class Calculator {
    private double score1, score2, score3;

    private JFrame frame;
    private JLabel label1, label2, label3, resultLabel;
    private JTextField field1, field2, field3;
    private JTextArea resultArea;
    private JButton button;

    public Calculator() {
        frame = new JFrame("Grade Calculator");
        label1 = new JLabel("Score 1:");
        field1 = new JTextField(6);
        label2 = new JLabel("Score 2:");
        field2 = new JTextField(6);
        label3 = new JLabel("Score 3:");
        field3 = new JTextField(6);
        button = new JButton("Calculate");
        resultLabel = new JLabel("Results:");
        resultArea = new JTextArea(10, 20);
    }

    public void createAndShowGUI() {
        JPanel panel = new JPanel();
        panel.add(label1);
        panel.add(field1);
        panel.add(label2);
        panel.add(field2);
        panel.add(label3);
        panel.add(field3);
        panel.add(button);
        panel.add(resultLabel);
        panel.add(resultArea);
        frame.add(panel);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
        button.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                score1 = Double.parseDouble(field1.getText());
                score2 = Double.parseDouble(field2.getText());
                score3 = Double.parseDouble(field3.getText());
                double average = (score1 + score2 + score3) / 3.0;
                double totalPoints = scoreToPoints(score1) + scoreToPoints(score2) + scoreToPoints(score3);
                double courseGPA = totalPoints / 9.0;
                String output = "Average: " + average + "\nCourse GPA: " + courseGPA;
                resultArea.setText(output);
            }
        });
    }

    private double scoreToPoints(double score) {
        if (score >= 93.0) {
            return 4.0;
        } else if (score >= 88.0) {
            return 3.5;
        } else if (score >= 82.0) {
            return 3.0;
        } else if (score >= 76.0) {
            return 2.5;
        } else if (score >= 70.0) {
            return 2.0;
        } else if (score >= 60.0) {
            return 1.0;
        } else {
            return 0.0;
        }
    }

    public static void main(String[] args) {
        Calculator calculator = new Calculator();
        calculator.createAndShowGUI();
    }
}