|
发表于 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 库。这样,代码才能顺利运行并完成所需任务。 |
|