鱼C论坛

 找回密码
 立即注册
查看: 1305|回复: 3

[已解决]如何使用使用字符流和和GUI类实现以下功能

[复制链接]
发表于 2023-4-2 15:03:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
这道题目该怎么做
(1)设计图形化界面,至少包括文本类控件类。接收从键盘输入姓名、学号、成绩,并保存到文本文件中,重复进行。
(2)从文件中读取各学生的成绩,并计算所有学生成绩的平均值、最大值和最小值,排序后输出到另一文本文件
最佳答案
2023-4-2 15:17:08
要实现所描述的问题,可以使用Java Swing作为图形界面,使用字符流来与文本文件进行交互。以下是一个分步实现指南:

  • 导入必要的库:
    1. import javax.swing.*;
    2. import java.awt.*;
    3. import java.awt.event.*;
    4. import java.io.*;
    5. import java.nio.file.Files;
    6. import java.nio.file.Paths;
    7. import java.util.*;
    8. import java.util.stream.Collectors;
    复制代码

  • 创建一个扩展JFrame的自定义类,用于图形界面:
    1. public class StudentGradesApp extends JFrame {
    2.     // 声明组件
    3.     private JTextField nameField, studentNumberField, gradeField;
    4.     private JButton submitButton, calculateButton;
    5.     private JLabel nameLabel, studentNumberLabel, gradeLabel;
    6.    
    7.     // 构造函数
    8.     public StudentGradesApp() {
    9.         initializeComponents();
    10.         addActionListeners();
    11.         layoutComponents();
    12.         setFrameProperties();
    13.     }

    14.     private void initializeComponents() {
    15.         // 初始化组件
    16.     }
    17.    
    18.     private void addActionListeners() {
    19.         // 为按钮添加操作监听器
    20.     }
    21.    
    22.     private void layoutComponents() {
    23.         // 设置布局并添加组件
    24.     }
    25.    
    26.     private void setFrameProperties() {
    27.         // 设置框架属性
    28.     }

    29.     // 操作处理程序
    30.     private void onSubmit() {
    31.         // 将学生数据保存到文本文件中
    32.     }
    33.    
    34.     private void onCalculate() {
    35.         // 读取学生数据,处理并输出到另一个文本文件中
    36.     }

    37.     public static void main(String[] args) {
    38.         SwingUtilities.invokeLater(() -> {
    39.             new StudentGradesApp();
    40.         });
    41.     }
    42. }
    复制代码

  • 完成 initializeComponents() 方法,初始化组件:
    1. private void initializeComponents() {
    2.     nameField = new JTextField(20);
    3.     studentNumberField = new JTextField(20);
    4.     gradeField = new JTextField(20);

    5.     submitButton = new JButton("提交");
    6.     calculateButton = new JButton("计算");

    7.     nameLabel = new JLabel("姓名:");
    8.     studentNumberLabel = new JLabel("学号:");
    9.     gradeLabel = new JLabel("成绩:");
    10. }
    复制代码

  • 完成 addActionListeners() 方法,为按钮添加操作监听器:
    1. private void addActionListeners() {
    2.     submitButton.addActionListener(e -> onSubmit());
    3.     calculateButton.addActionListener(e -> onCalculate());
    4. }
    复制代码

  • 完成 layoutComponents() 方法,设置布局并添加组件:
    1. private void layoutComponents() {
    2.     setLayout(new GridBagLayout());
    3.     GridBagConstraints gbc = new GridBagConstraints();

    4.     gbc.insets = new Insets(5, 5, 5, 5);

    5.     gbc.gridx = 0;
    6.     gbc.gridy = 0;
    7.     add(nameLabel, gbc);

    8.     gbc.gridx = 1;
    9.     add(nameField, gbc);

    10.     gbc.gridx = 0;
    11.     gbc.gridy = 1;
    12.     add(studentNumberLabel, gbc);

    13.     gbc.gridx = 1;
    14.     add(studentNumberField, gbc);

    15.     gbc.gridx = 0;
    16.     gbc.gridy = 2;
    17.     add(gradeLabel, gbc);

    18.     gbc.gridx = 1;
    19.     add(gradeField, gbc);

    20.     gbc.gridx = 0;
    21.     gbc.gridy = 3;
    22.     gbc.gridwidth = 2;
    23.     add(submitButton, gbc);

    24.     gbc.gridy = 4;
    25.     add(calculateButton, gbc);
    26. }
    复制代码

  • 完成 setFrameProperties() 方法,设置框架属性:
    1. private void setFrameProperties() {
    2.     setTitle("学生成绩应用");
    3.     setSize(400, 300);
    4.     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    5.     setLocationRelativeTo(null);
    6.     setVisible(true);
    7. }
    复制代码

  • 实现 `onSubmit()` 方法,将学生数据保存到文本文件中:
    1. private void onSubmit() {
    2.     String name = nameField.getText();
    3.     String studentNumber = studentNumberField.getText();
    4.     String grade = gradeField.getText();

    5.     try (FileWriter fw = new FileWriter("student_data.txt", true);
    6.          BufferedWriter bw = new BufferedWriter(fw)) {
    7.         bw.write(name + "," + studentNumber + "," + grade);
    8.         bw.newLine();
    9.     } catch (IOException e) {
    10.         e.printStackTrace();
    11.     }

    12.     // Clear input fields
    13.     nameField.setText("");
    14.     studentNumberField.setText("");
    15.     gradeField.setText("");
    16. }
    复制代码

  • 实现 onCalculate() 方法,读取学生数据,处理并输出到另一个文本文件中:
    1. private void onCalculate() {
    2.     List<String> lines;
    3.     List<Student> students = new ArrayList<>();

    4.     try {
    5.         lines = Files.readAllLines(Paths.get("student_data.txt"));
    6.         for (String line : lines) {
    7.             String[] data = line.split(",");
    8.             students.add(new Student(data[0], data[1], Double.parseDouble(data[2])));
    9.         }
    10.     } catch (IOException e) {
    11.         e.printStackTrace();
    12.     }

    13.     // Calculate average, min, and max
    14.     double sum = 0;
    15.     double min = Double.MAX_VALUE;
    16.     double max = Double.MIN_VALUE;

    17.     for (Student student : students) {
    18.         double grade = student.getGrade();
    19.         sum += grade;
    20.         min = Math.min(min, grade);
    21.         max = Math.max(max, grade);
    22.     }

    23.     double average = sum / students.size();

    24.     // Sort students by grade
    25.     students.sort(Comparator.comparingDouble(Student::getGrade).reversed());

    26.     // Output to another text file
    27.     try (FileWriter fw = new FileWriter("output.txt", false);
    28.          BufferedWriter bw = new BufferedWriter(fw)) {
    29.         bw.write("平均成绩: " + average);
    30.         bw.newLine();
    31.         bw.write("最高成绩: " + max);
    32.         bw.newLine();
    33.         bw.write("最低成绩: " + min);
    34.         bw.newLine();
    35.         bw.newLine();
    36.         bw.write("成绩排序:");
    37.         bw.newLine();

    38.         for (Student student : students) {
    39.             bw.write(student.getName() + "," + student.getStudentNumber() + "," + student.getGrade());
    40.             bw.newLine();
    41.         }
    42.     } catch (IOException e) {
    43.         e.printStackTrace();
    44.     }
    45. }
    复制代码

  • 创建一个 Student 类来存储学生信息:
    1. public class Student {
    2.     private String name;
    3.     private String studentNumber;
    4.     private double grade;

    5.     public Student(String name, String studentNumber, double grade) {
    6.         this.name = name;
    7.         this.studentNumber = studentNumber;
    8.         this.grade = grade;
    9.     }

    10.     public String getName() {
    11.         return name;
    12.     }

    13.     public String getStudentNumber() {
    14.         return studentNumber;
    15.     }

    16.     public double getGrade() {
    17.         return grade;
    18.     }
    19. }
    复制代码



现在,这个程序应该能够实现所描述的功能。用户可以通过图形界面输入学生的姓名、学号和成绩,并将其保存到文本文件中。

然后,程序可以读取这些信息,计算所有学生的平均、最高和最低成绩,并将排序后的成绩输出到另一个文本文件中。

此实现仅作为一个基本示例,可以根据需要对其进行进一步优化。例如,可以添加输入验证以确保用户输入的数据是有效的,或者添加错误处理以优雅地处理任何可能的错误。

在实际应用中,也可以考虑将学生数据存储在数据库中,以提供更可靠的数据存储和检索方式。使用数据库可以简化数据管理,并提供更强大的查询和排序功能。

最后,务必确保已在 Java 项目中包含了 Java Swing 和必要的 IO 库。这样,代码才能顺利运行并完成所需任务。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-4-2 15:17:08 | 显示全部楼层    本楼为最佳答案   
要实现所描述的问题,可以使用Java Swing作为图形界面,使用字符流来与文本文件进行交互。以下是一个分步实现指南:

  • 导入必要的库:
    1. import javax.swing.*;
    2. import java.awt.*;
    3. import java.awt.event.*;
    4. import java.io.*;
    5. import java.nio.file.Files;
    6. import java.nio.file.Paths;
    7. import java.util.*;
    8. import java.util.stream.Collectors;
    复制代码

  • 创建一个扩展JFrame的自定义类,用于图形界面:
    1. public class StudentGradesApp extends JFrame {
    2.     // 声明组件
    3.     private JTextField nameField, studentNumberField, gradeField;
    4.     private JButton submitButton, calculateButton;
    5.     private JLabel nameLabel, studentNumberLabel, gradeLabel;
    6.    
    7.     // 构造函数
    8.     public StudentGradesApp() {
    9.         initializeComponents();
    10.         addActionListeners();
    11.         layoutComponents();
    12.         setFrameProperties();
    13.     }

    14.     private void initializeComponents() {
    15.         // 初始化组件
    16.     }
    17.    
    18.     private void addActionListeners() {
    19.         // 为按钮添加操作监听器
    20.     }
    21.    
    22.     private void layoutComponents() {
    23.         // 设置布局并添加组件
    24.     }
    25.    
    26.     private void setFrameProperties() {
    27.         // 设置框架属性
    28.     }

    29.     // 操作处理程序
    30.     private void onSubmit() {
    31.         // 将学生数据保存到文本文件中
    32.     }
    33.    
    34.     private void onCalculate() {
    35.         // 读取学生数据,处理并输出到另一个文本文件中
    36.     }

    37.     public static void main(String[] args) {
    38.         SwingUtilities.invokeLater(() -> {
    39.             new StudentGradesApp();
    40.         });
    41.     }
    42. }
    复制代码

  • 完成 initializeComponents() 方法,初始化组件:
    1. private void initializeComponents() {
    2.     nameField = new JTextField(20);
    3.     studentNumberField = new JTextField(20);
    4.     gradeField = new JTextField(20);

    5.     submitButton = new JButton("提交");
    6.     calculateButton = new JButton("计算");

    7.     nameLabel = new JLabel("姓名:");
    8.     studentNumberLabel = new JLabel("学号:");
    9.     gradeLabel = new JLabel("成绩:");
    10. }
    复制代码

  • 完成 addActionListeners() 方法,为按钮添加操作监听器:
    1. private void addActionListeners() {
    2.     submitButton.addActionListener(e -> onSubmit());
    3.     calculateButton.addActionListener(e -> onCalculate());
    4. }
    复制代码

  • 完成 layoutComponents() 方法,设置布局并添加组件:
    1. private void layoutComponents() {
    2.     setLayout(new GridBagLayout());
    3.     GridBagConstraints gbc = new GridBagConstraints();

    4.     gbc.insets = new Insets(5, 5, 5, 5);

    5.     gbc.gridx = 0;
    6.     gbc.gridy = 0;
    7.     add(nameLabel, gbc);

    8.     gbc.gridx = 1;
    9.     add(nameField, gbc);

    10.     gbc.gridx = 0;
    11.     gbc.gridy = 1;
    12.     add(studentNumberLabel, gbc);

    13.     gbc.gridx = 1;
    14.     add(studentNumberField, gbc);

    15.     gbc.gridx = 0;
    16.     gbc.gridy = 2;
    17.     add(gradeLabel, gbc);

    18.     gbc.gridx = 1;
    19.     add(gradeField, gbc);

    20.     gbc.gridx = 0;
    21.     gbc.gridy = 3;
    22.     gbc.gridwidth = 2;
    23.     add(submitButton, gbc);

    24.     gbc.gridy = 4;
    25.     add(calculateButton, gbc);
    26. }
    复制代码

  • 完成 setFrameProperties() 方法,设置框架属性:
    1. private void setFrameProperties() {
    2.     setTitle("学生成绩应用");
    3.     setSize(400, 300);
    4.     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    5.     setLocationRelativeTo(null);
    6.     setVisible(true);
    7. }
    复制代码

  • 实现 `onSubmit()` 方法,将学生数据保存到文本文件中:
    1. private void onSubmit() {
    2.     String name = nameField.getText();
    3.     String studentNumber = studentNumberField.getText();
    4.     String grade = gradeField.getText();

    5.     try (FileWriter fw = new FileWriter("student_data.txt", true);
    6.          BufferedWriter bw = new BufferedWriter(fw)) {
    7.         bw.write(name + "," + studentNumber + "," + grade);
    8.         bw.newLine();
    9.     } catch (IOException e) {
    10.         e.printStackTrace();
    11.     }

    12.     // Clear input fields
    13.     nameField.setText("");
    14.     studentNumberField.setText("");
    15.     gradeField.setText("");
    16. }
    复制代码

  • 实现 onCalculate() 方法,读取学生数据,处理并输出到另一个文本文件中:
    1. private void onCalculate() {
    2.     List<String> lines;
    3.     List<Student> students = new ArrayList<>();

    4.     try {
    5.         lines = Files.readAllLines(Paths.get("student_data.txt"));
    6.         for (String line : lines) {
    7.             String[] data = line.split(",");
    8.             students.add(new Student(data[0], data[1], Double.parseDouble(data[2])));
    9.         }
    10.     } catch (IOException e) {
    11.         e.printStackTrace();
    12.     }

    13.     // Calculate average, min, and max
    14.     double sum = 0;
    15.     double min = Double.MAX_VALUE;
    16.     double max = Double.MIN_VALUE;

    17.     for (Student student : students) {
    18.         double grade = student.getGrade();
    19.         sum += grade;
    20.         min = Math.min(min, grade);
    21.         max = Math.max(max, grade);
    22.     }

    23.     double average = sum / students.size();

    24.     // Sort students by grade
    25.     students.sort(Comparator.comparingDouble(Student::getGrade).reversed());

    26.     // Output to another text file
    27.     try (FileWriter fw = new FileWriter("output.txt", false);
    28.          BufferedWriter bw = new BufferedWriter(fw)) {
    29.         bw.write("平均成绩: " + average);
    30.         bw.newLine();
    31.         bw.write("最高成绩: " + max);
    32.         bw.newLine();
    33.         bw.write("最低成绩: " + min);
    34.         bw.newLine();
    35.         bw.newLine();
    36.         bw.write("成绩排序:");
    37.         bw.newLine();

    38.         for (Student student : students) {
    39.             bw.write(student.getName() + "," + student.getStudentNumber() + "," + student.getGrade());
    40.             bw.newLine();
    41.         }
    42.     } catch (IOException e) {
    43.         e.printStackTrace();
    44.     }
    45. }
    复制代码

  • 创建一个 Student 类来存储学生信息:
    1. public class Student {
    2.     private String name;
    3.     private String studentNumber;
    4.     private double grade;

    5.     public Student(String name, String studentNumber, double grade) {
    6.         this.name = name;
    7.         this.studentNumber = studentNumber;
    8.         this.grade = grade;
    9.     }

    10.     public String getName() {
    11.         return name;
    12.     }

    13.     public String getStudentNumber() {
    14.         return studentNumber;
    15.     }

    16.     public double getGrade() {
    17.         return grade;
    18.     }
    19. }
    复制代码



现在,这个程序应该能够实现所描述的功能。用户可以通过图形界面输入学生的姓名、学号和成绩,并将其保存到文本文件中。

然后,程序可以读取这些信息,计算所有学生的平均、最高和最低成绩,并将排序后的成绩输出到另一个文本文件中。

此实现仅作为一个基本示例,可以根据需要对其进行进一步优化。例如,可以添加输入验证以确保用户输入的数据是有效的,或者添加错误处理以优雅地处理任何可能的错误。

在实际应用中,也可以考虑将学生数据存储在数据库中,以提供更可靠的数据存储和检索方式。使用数据库可以简化数据管理,并提供更强大的查询和排序功能。

最后,务必确保已在 Java 项目中包含了 Java Swing 和必要的 IO 库。这样,代码才能顺利运行并完成所需任务。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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 都匹配
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 来处理集合。

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

  1. import java.util.List;
复制代码


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

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

  1. import java.util.*;
  2. import java.awt.*;
复制代码


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

  1. import java.util.ArrayList;
  2. import java.util.Comparator;
  3. import java.util.List;
  4. import java.awt.GridBagConstraints;
  5. import java.awt.GridBagLayout;
  6. import java.awt.Insets;
  7. // ... 其他必要的导入
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-4 21:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表