构建一个小型Java应用:命令行应用与图形用户界面(GUI)应用!
开篇语
哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云/阿里云/华为云/51CTO;欢迎大家常来逛逛
今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一个人虽可以走的更快,但一群人可以走的更远。
我是一名后端开发爱好者,工作日常接触到最多的就是Java语言啦,所以我都尽量抽业余时间把自己所学到所会的,通过文章的形式进行输出,希望以这种方式帮助到更多的初学者或者想入门的小伙伴们,同时也能对自己的技术进行沉淀,加以复盘,查缺补漏。
小伙伴们在批阅的过程中,如果觉得文章不错,欢迎点赞、收藏、关注哦。三连即是对作者我写作道路上最好的鼓励与支持!
前序
在本节中,我们将使用Java SE技术栈构建一个简单的命令行应用程序,并介绍如何处理数据存储、文件操作、异常处理以及多线程应用。通过这些技术,你将能够构建一个有实际功能的小型Java应用。
前言
Java SE(标准版)是构建桌面应用、命令行工具和一些中小型应用的核心技术栈。无论是命令行应用还是图形用户界面(GUI)应用,Java都提供了强大的支持。在本篇中,我们将介绍如何使用Java SE的技术栈构建一个简单的应用,重点展示数据存储、文件操作、异常处理和多线程等基本功能。
第一部分:构建一个简单的命令行应用
1.1 应用需求
我们将构建一个简单的命令行应用程序,模拟一个学生信息管理系统。功能如下:
- 用户可以添加、查看和删除学生信息。
- 学生信息包括学生的姓名、学号和年龄。
- 数据将保存在本地文件中,以便持久化。
1.2 创建学生类
我们首先创建一个Student
类来表示学生信息。
Student.java
:
public class Student {
private String name;
private String studentId;
private int age;
public Student(String name, String studentId, int age) {
this.name = name;
this.studentId = studentId;
this.age = age;
}
public String getName() {
return name;
}
public String getStudentId() {
return studentId;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Name: " + name + ", Student ID: " + studentId + ", Age: " + age;
}
}
1.3 学生管理类
接下来,我们实现一个StudentManager
类,用于管理学生信息,支持添加、查看和删除学生信息。
StudentManager.java
:
import java.io.*;
import java.util.*;
public class StudentManager {
private List<Student> students;
private static final String FILE_NAME = "students.txt";
public StudentManager() {
students = new ArrayList<>();
loadStudentsFromFile();
}
// 添加学生
public void addStudent(Student student) {
students.add(student);
saveStudentsToFile();
}
// 查看所有学生
public void displayStudents() {
if (students.isEmpty()) {
System.out.println("No students found.");
} else {
for (Student student : students) {
System.out.println(student);
}
}
}
// 删除学生
public void deleteStudent(String studentId) {
students.removeIf(student -> student.getStudentId().equals(studentId));
saveStudentsToFile();
}
// 从文件加载学生数据
private void loadStudentsFromFile() {
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream(FILE_NAME))) {
students = (List<Student>) ois.readObject();
} catch (FileNotFoundException e) {
System.out.println("No previous data found, starting fresh.");
} catch (IOException | ClassNotFoundException e) {
System.out.println("Error loading data: " + e.getMessage());
}
}
// 保存学生数据到文件
private void saveStudentsToFile() {
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(FILE_NAME))) {
oos.writeObject(students);
} catch (IOException e) {
System.out.println("Error saving data: " + e.getMessage());
}
}
}
解释:
addStudent()
:添加学生信息并保存到文件。displayStudents()
:显示所有学生信息。deleteStudent()
:根据学号删除学生。loadStudentsFromFile()
和saveStudentsToFile()
:实现学生数据的持久化,数据保存在本地文件中。
1.4 主应用程序
最后,我们创建一个简单的命令行界面,让用户可以选择执行不同的操作。
MainApp.java
:
import java.util.Scanner;
public class MainApp {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
StudentManager manager = new StudentManager();
while (true) {
System.out.println("\nStudent Management System");
System.out.println("1. Add Student");
System.out.println("2. View Students");
System.out.println("3. Delete Student");
System.out.println("4. Exit");
System.out.print("Choose an option: ");
int choice = scanner.nextInt();
scanner.nextLine(); // Consume the newline character
switch (choice) {
case 1:
System.out.print("Enter name: ");
String name = scanner.nextLine();
System.out.print("Enter student ID: ");
String studentId = scanner.nextLine();
System.out.print("Enter age: ");
int age = scanner.nextInt();
scanner.nextLine(); // Consume the newline character
manager.addStudent(new Student(name, studentId, age));
break;
case 2:
manager.displayStudents();
break;
case 3:
System.out.print("Enter student ID to delete: ");
String idToDelete = scanner.nextLine();
manager.deleteStudent(idToDelete);
break;
case 4:
System.out.println("Exiting...");
scanner.close();
return;
default:
System.out.println("Invalid choice. Please try again.");
}
}
}
}
解释:
- 该应用程序提供了简单的命令行交互,用户可以选择添加学生、查看学生列表或删除学生。
第二部分:图形用户界面(GUI)应用
2.1 应用需求
现在我们将把同样的学生信息管理系统转化为一个简单的图形用户界面(GUI)应用,使用Swing
库来创建GUI。我们将继续实现添加、查看和删除学生信息的功能。
2.2 创建GUI界面
我们将使用JFrame
来构建应用的主窗口,JButton
来添加按钮,JTextField
和JTextArea
来输入和显示数据。
StudentManagementGUI.java
:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
public class StudentManagementGUI {
private JFrame frame;
private JTextField nameField, studentIdField, ageField;
private JTextArea textArea;
private StudentManager manager;
public StudentManagementGUI() {
manager = new StudentManager();
initialize();
}
private void initialize() {
frame = new JFrame("Student Management System");
frame.setBounds(100, 100, 400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(new BorderLayout());
JPanel panel = new JPanel();
frame.getContentPane().add(panel, BorderLayout.NORTH);
panel.setLayout(new GridLayout(4, 2));
JLabel nameLabel = new JLabel("Name:");
nameField = new JTextField();
panel.add(nameLabel);
panel.add(nameField);
JLabel studentIdLabel = new JLabel("Student ID:");
studentIdField = new JTextField();
panel.add(studentIdLabel);
panel.add(studentIdField);
JLabel ageLabel = new JLabel("Age:");
ageField = new JTextField();
panel.add(ageLabel);
panel.add(ageField);
JPanel buttonPanel = new JPanel();
frame.getContentPane().add(buttonPanel, BorderLayout.SOUTH);
JButton addButton = new JButton("Add Student");
addButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String name = nameField.getText();
String studentId = studentIdField.getText();
int age = Integer.parseInt(ageField.getText());
manager.addStudent(new Student(name, studentId, age));
displayStudents();
}
});
buttonPanel.add(addButton);
JButton deleteButton = new JButton("Delete Student");
deleteButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String studentId = studentIdField.getText();
manager.deleteStudent(studentId);
displayStudents();
}
});
buttonPanel.add(deleteButton);
textArea = new JTextArea();
frame.getContentPane().add(new JScrollPane(textArea), BorderLayout.CENTER);
frame.setVisible(true);
}
private void displayStudents() {
List<Student> students = manager.getStudents();
textArea.setText("");
for (Student student : students) {
textArea.append(student.toString() + "\n");
}
}
public static void main(String[] args) {
new StudentManagementGUI();
}
}
解释:
- 我们使用
JFrame
来创建主窗口,JPanel
来布局用户输入字段和按钮。 JTextArea
用于显示学生列表。- 用户可以通过输入学生信息并点击“Add Student”按钮来添加学生,通过输入学号并点击“Delete Student”按钮来删除学生。
第三部分:异常处理与多线程应用
3.1 异常处理
在开发过程中,异常是不可避免的,合理的异常处理能够让我们的程序更稳定。Java提供了try-catch
结构来捕获并处理异常。
示例:文件读取时的异常处理
import java.io.*;
public class FileReadingExample {
public static void main(String[] args) {
try (BufferedReader reader = new BufferedReader(new FileReader("data.txt"))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (FileNotFoundException e) {
System.out.println("File not found: " + e.getMessage());
} catch (IOException e) {
System.out.println("I/O error: " + e.getMessage());
}
}
}
解释:
try-with-resources
语句自动关闭资源,避免了资源泄漏。catch
块用于捕获并处理文件操作时可能抛出的异常。
3.2 多线程应用
Java的多线程能力使得应用能够执行多个任务而不阻塞主线程。下面是一个简单的多线程示例,模拟一个后台任务。
示例:
public class MultiThreadExample {
public static void main(String[] args) {
Thread task1 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Task 1 - Step " + (i + 1));
try {
Thread.sleep(1000); // 暂停1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
Thread task2 = new Thread(() -> {
for (int i = 0; i < 5; i++) {
System.out.println("Task 2 - Step " + (i + 1));
try {
Thread.sleep(1000); // 暂停1秒
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
task1.start();
task2.start();
}
}
解释:
Thread
类用于创建新的线程。sleep()
方法使得线程暂停执行一段时间,模拟执行任务的过程。
总结
通过这篇文章,我们介绍了如何使用Java SE技术栈构建一个小型Java应用,包括命令行应用和图形用户界面(GUI)应用。我们学习了如何管理数据存储、进行文件操作、处理异常以及使用多线程来提高应用的响应性。掌握这些技能,将帮助你构建功能完善、稳定高效的Java应用。
… …
文末
好啦,以上就是我这期的全部内容,如果有任何疑问,欢迎下方留言哦,咱们下期见。
… …
学习不分先后,知识不分多少;事无巨细,当以虚心求教;三人行,必有我师焉!!!
wished for you successed !!!
⭐️若喜欢我,就请关注我叭。
⭐️若对您有用,就请点赞叭。
⭐️若有疑问,就请评论留言告诉我叭。
版权声明:本文由作者原创,转载请注明出处,谢谢支持!
- 点赞
- 收藏
- 关注作者
评论(0)