鱼C论坛

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

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

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

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

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

x
这道题目该怎么做
(1)设计图形化界面,至少包括文本类控件类。接收从键盘输入姓名、学号、成绩,并保存到文本文件中,重复进行。
(2)从文件中读取各学生的成绩,并计算所有学生成绩的平均值、最大值和最小值,排序后输出到另一文本文件
最佳答案
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 库。这样,代码才能顺利运行并完成所需任务。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 库。这样,代码才能顺利运行并完成所需任务。
想知道小甲鱼最近在做啥?请访问 -> 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 都匹配
想知道小甲鱼最近在做啥?请访问 -> 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 来处理集合。

在文件开头添加以下导入语句:
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;
// ... 其他必要的导入
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-20 16:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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