白痴爱面包 发表于 2023-4-2 15:03:28

如何使用使用字符流和和GUI类实现以下功能

这道题目该怎么做
(1)设计图形化界面,至少包括文本类控件类。接收从键盘输入姓名、学号、成绩,并保存到文本文件中,重复进行。
(2)从文件中读取各学生的成绩,并计算所有学生成绩的平均值、最大值和最小值,排序后输出到另一文本文件

isdkz 发表于 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, data, Double.parseDouble(data)));
      }
    } 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 库。这样,代码才能顺利运行并完成所需任务。

白痴爱面包 发表于 2023-4-2 15:56:31

isdkz 发表于 2023-4-2 15:17
要实现所描述的问题,可以使用Java Swing作为图形界面,使用字符流来与文本文件进行交互。以下是一个分步实 ...

当我尝试运行时为什么会出现以下错误
错误: 对List的引用不明确
    List<String> lines;
    ^
java.util 中的接口 java.util.List 和 java.awt 中的类 java.awt.List 都匹配

isdkz 发表于 2023-4-2 16:03:09

白痴爱面包 发表于 2023-4-2 15:56
当我尝试运行时为什么会出现以下错误
错误: 对List的引用不明确
    List lines;


你遇到这个错误是因为 Java 在理解你要引用的 List 时出现了问题,

因为有两个具有相同名称但位于不同包中的类:java.util.List 和 java.awt.List。

要解决这个问题,你应该显式地导入要使用的正确的 List 类。在这种情况下,你应该使用 java.util.List 来处理集合。

在文件开头添加以下导入语句:

import java.util.List;

这将让 Java 知道你要使用 java.util 包中的 List 类,错误应该得到解决。

如果你已经用通配符这样导入了两个包:

import java.util.*;
import java.awt.*;


你仍然可能遇到 "引用不清楚" 的错误。在这种情况下,最好只导入所需的特定类,而不是使用通配符。删除通配符导入并显式导入类:

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
// ... 其他必要的导入
页: [1]
查看完整版本: 如何使用使用字符流和和GUI类实现以下功能