|
发表于 2023-4-2 15:17:08
|
显示全部楼层
本楼为最佳答案
 要实现所描述的问题,可以使用Java Swing作为图形界面,使用字符流来与文本文件进行交互。以下是一个分步实现指南:
- 导入必要的库:
- import javax.swing.*;
- import java.awt.*;
- import java.awt.event.*;
- import java.io.*;
- import java.nio.file.Files;
- import java.nio.file.Paths;
- import java.util.*;
- import java.util.stream.Collectors;
复制代码
- 创建一个扩展JFrame的自定义类,用于图形界面:
- public class StudentGradesApp extends JFrame {
- // 声明组件
- private JTextField nameField, studentNumberField, gradeField;
- private JButton submitButton, calculateButton;
- private JLabel nameLabel, studentNumberLabel, gradeLabel;
-
- // 构造函数
- public StudentGradesApp() {
- initializeComponents();
- addActionListeners();
- layoutComponents();
- setFrameProperties();
- }
- private void initializeComponents() {
- // 初始化组件
- }
-
- private void addActionListeners() {
- // 为按钮添加操作监听器
- }
-
- private void layoutComponents() {
- // 设置布局并添加组件
- }
-
- private void setFrameProperties() {
- // 设置框架属性
- }
- // 操作处理程序
- private void onSubmit() {
- // 将学生数据保存到文本文件中
- }
-
- private void onCalculate() {
- // 读取学生数据,处理并输出到另一个文本文件中
- }
- public static void main(String[] args) {
- SwingUtilities.invokeLater(() -> {
- new StudentGradesApp();
- });
- }
- }
复制代码
- 完成 initializeComponents() 方法,初始化组件:
- private void initializeComponents() {
- nameField = new JTextField(20);
- studentNumberField = new JTextField(20);
- gradeField = new JTextField(20);
- submitButton = new JButton("提交");
- calculateButton = new JButton("计算");
- nameLabel = new JLabel("姓名:");
- studentNumberLabel = new JLabel("学号:");
- gradeLabel = new JLabel("成绩:");
- }
复制代码
- 完成 addActionListeners() 方法,为按钮添加操作监听器:
- private void addActionListeners() {
- submitButton.addActionListener(e -> onSubmit());
- calculateButton.addActionListener(e -> onCalculate());
- }
复制代码
- 完成 layoutComponents() 方法,设置布局并添加组件:
- private void layoutComponents() {
- setLayout(new GridBagLayout());
- GridBagConstraints gbc = new GridBagConstraints();
- gbc.insets = new Insets(5, 5, 5, 5);
- gbc.gridx = 0;
- gbc.gridy = 0;
- add(nameLabel, gbc);
- gbc.gridx = 1;
- add(nameField, gbc);
- gbc.gridx = 0;
- gbc.gridy = 1;
- add(studentNumberLabel, gbc);
- gbc.gridx = 1;
- add(studentNumberField, gbc);
- gbc.gridx = 0;
- gbc.gridy = 2;
- add(gradeLabel, gbc);
- gbc.gridx = 1;
- add(gradeField, gbc);
- gbc.gridx = 0;
- gbc.gridy = 3;
- gbc.gridwidth = 2;
- add(submitButton, gbc);
- gbc.gridy = 4;
- add(calculateButton, gbc);
- }
复制代码
- 完成 setFrameProperties() 方法,设置框架属性:
- private void setFrameProperties() {
- setTitle("学生成绩应用");
- setSize(400, 300);
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- setLocationRelativeTo(null);
- setVisible(true);
- }
复制代码
- 实现 `onSubmit()` 方法,将学生数据保存到文本文件中:
- private void onSubmit() {
- String name = nameField.getText();
- String studentNumber = studentNumberField.getText();
- String grade = gradeField.getText();
- try (FileWriter fw = new FileWriter("student_data.txt", true);
- BufferedWriter bw = new BufferedWriter(fw)) {
- bw.write(name + "," + studentNumber + "," + grade);
- bw.newLine();
- } catch (IOException e) {
- e.printStackTrace();
- }
- // Clear input fields
- nameField.setText("");
- studentNumberField.setText("");
- gradeField.setText("");
- }
复制代码
- 实现 onCalculate() 方法,读取学生数据,处理并输出到另一个文本文件中:
- private void onCalculate() {
- List<String> lines;
- List<Student> students = new ArrayList<>();
- try {
- lines = Files.readAllLines(Paths.get("student_data.txt"));
- for (String line : lines) {
- String[] data = line.split(",");
- students.add(new Student(data[0], data[1], Double.parseDouble(data[2])));
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- // Calculate average, min, and max
- double sum = 0;
- double min = Double.MAX_VALUE;
- double max = Double.MIN_VALUE;
- for (Student student : students) {
- double grade = student.getGrade();
- sum += grade;
- min = Math.min(min, grade);
- max = Math.max(max, grade);
- }
- double average = sum / students.size();
- // Sort students by grade
- students.sort(Comparator.comparingDouble(Student::getGrade).reversed());
- // Output to another text file
- try (FileWriter fw = new FileWriter("output.txt", false);
- BufferedWriter bw = new BufferedWriter(fw)) {
- bw.write("平均成绩: " + average);
- bw.newLine();
- bw.write("最高成绩: " + max);
- bw.newLine();
- bw.write("最低成绩: " + min);
- bw.newLine();
- bw.newLine();
- bw.write("成绩排序:");
- bw.newLine();
- for (Student student : students) {
- bw.write(student.getName() + "," + student.getStudentNumber() + "," + student.getGrade());
- bw.newLine();
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
复制代码
- 创建一个 Student 类来存储学生信息:
- public class Student {
- private String name;
- private String studentNumber;
- private double grade;
- public Student(String name, String studentNumber, double grade) {
- this.name = name;
- this.studentNumber = studentNumber;
- this.grade = grade;
- }
- public String getName() {
- return name;
- }
- public String getStudentNumber() {
- return studentNumber;
- }
- public double getGrade() {
- return grade;
- }
- }
复制代码
现在,这个程序应该能够实现所描述的功能。用户可以通过图形界面输入学生的姓名、学号和成绩,并将其保存到文本文件中。
然后,程序可以读取这些信息,计算所有学生的平均、最高和最低成绩,并将排序后的成绩输出到另一个文本文件中。
此实现仅作为一个基本示例,可以根据需要对其进行进一步优化。例如,可以添加输入验证以确保用户输入的数据是有效的,或者添加错误处理以优雅地处理任何可能的错误。
在实际应用中,也可以考虑将学生数据存储在数据库中,以提供更可靠的数据存储和检索方式。使用数据库可以简化数据管理,并提供更强大的查询和排序功能。
最后,务必确保已在 Java 项目中包含了 Java Swing 和必要的 IO 库。这样,代码才能顺利运行并完成所需任务。 |
|