java实战(四):编写学生信息管理系统页面·

1.要求

编写程序 实现表格的输入和编辑功能。界面如下:

 

 

1、用户按插入键后,把学号、姓名和成绩插入到最后一行,序号显示当前的行号。

2、当用户选中表格的某一行时,按删除按钮,则这一行从表格中删除

3、编辑功能,用户可以直接双击表格上的某一行进行内容编辑,例如修改成绩或者姓名,学号。

4、表格的内容保存到一个文件中,等下一次程序启动时重新加载保存的内容到表格中。

2.代码实现

import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import java.io.*;

public class TableExample extends JFrame {
    private JTable table; // 表格组件
    private DefaultTableModel tableModel; // 表格模型
    private JTextField studentIdField; // 学号输入框
    private JTextField nameField; // 姓名输入框
    private JTextField scoreField; // 成绩输入框

    public TableExample() {
        setTitle("表格示例"); // 设置窗口标题
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置窗口关闭操作
        setSize(800, 600); // 设置窗口大小

        // 创建表格模型
        tableModel = new DefaultTableModel() {
            @Override
            public boolean isCellEditable(int row, int column) {
                // 设置序号列不可编辑
                return column != 0;
            }
        };
        tableModel.addColumn("序号"); // 添加列名
        tableModel.addColumn("学号");
        tableModel.addColumn("姓名");
        tableModel.addColumn("成绩");

        // 创建表格
        table = new JTable(tableModel);

        // 创建插入面板
        JPanel insertPanel = new JPanel();
        insertPanel.setLayout(new FlowLayout());

        // 创建学号输入框
        studentIdField = new JTextField(5);
        insertPanel.add(new JLabel("学号:"));
        insertPanel.add(studentIdField);

        // 创建姓名输入框
        nameField = new JTextField(5);
        insertPanel.add(new JLabel("姓名:"));
        insertPanel.add(nameField);

        // 创建成绩输入框
        scoreField = new JTextField(5);
        insertPanel.add(new JLabel("成绩:"));
        insertPanel.add(scoreField);

        // 创建插入按钮
        JButton insertButton = new JButton("插入");
        insertPanel.add(insertButton);
        insertButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 获取用户输入的学号、姓名和成绩
                String studentId = studentIdField.getText();
                String name = nameField.getText();
                String score = scoreField.getText();

                // 插入新行
                Vector<String> rowData = new Vector<>();
                rowData.add(String.valueOf(tableModel.getRowCount() + 1)); // 序号
                rowData.add(studentId);
                rowData.add(name);
                rowData.add(score);
                tableModel.addRow(rowData);

                // 清空输入框
                studentIdField.setText("");
                nameField.setText("");
                scoreField.setText("");
            }
        });

        // 创建删除按钮
        JButton deleteButton = new JButton("删除");
        insertPanel.add(deleteButton);
        deleteButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 获取选中的行
                int selectedRow = table.getSelectedRow();
                // 删除选中的行
                if (selectedRow >= 0) {
                    tableModel.removeRow(selectedRow);
                }
            }
        });

        // 创建面板并添加按钮和表格
        JPanel panel = new JPanel();
        panel.setLayout(new BorderLayout());
        panel.add(insertPanel, BorderLayout.SOUTH);
        panel.add(new JScrollPane(table), BorderLayout.CENTER);

        // 将面板添加到窗口中
        add(panel);
        // 添加窗口关闭事件监听器
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                saveTableData();
            }
        });

        // 加载保存的表格内容
        loadTableData();

        setVisible(true); // 设置窗口可见
    }

    // 保存表格内容到文件
    private void saveTableData() {
        try {
            FileWriter writer = new FileWriter("table_data.txt"); // 创建文件写入流
            BufferedWriter bufferedWriter = new BufferedWriter(writer); // 创建缓冲写入流

            // 逐行写入表格数据
            for (int i = 0; i < tableModel.getRowCount(); i++) {
                for (int j = 0; j < tableModel.getColumnCount(); j++) {
                    bufferedWriter.write(tableModel.getValueAt(i, j).toString()); // 获取表格数据并写入文件
                    bufferedWriter.write(","); // 以逗号分隔每个单元格的数据
                }
                bufferedWriter.newLine(); // 换行
            }

            bufferedWriter.close(); // 关闭缓冲写入流
            writer.close(); // 关闭文件写入流
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 从文件加载表格内容
    private void loadTableData() {
        try {
            File file = new File("table_data.txt"); // 创建文件对象
            if (file.exists()) { // 判断文件是否存在
                FileReader reader = new FileReader(file); // 创建文件读取流
                BufferedReader bufferedReader = new BufferedReader(reader); // 创建缓冲读取流

                String line;
                while ((line = bufferedReader.readLine()) != null) { // 逐行读取文件内容
                    String[] data = line.split(","); // 以逗号分隔每个单元格的数据
                    tableModel.addRow(data); // 添加行数据到表格模型
                }

                bufferedReader.close(); // 关闭缓冲读取流
                reader.close(); // 关闭文件读取流
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        new TableExample(); // 创建表格示例对象
    }
}

3.效果

点插入可以生成

 

点击可以删除 

 

加了个监视器,若关闭了就会保存文件,然后再写一个加载数据的函数,在每一次创建之后都可以加载数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/206282.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

观海微电子---AF、AG、AR 的差别和作用

一、名称解释及原理 1.AF ---- Anti-fingerprint&#xff0c;中文为抗指纹。一般 SiO2AF 材料&#xff08;DON&#xff0c;M4、道康宁 AF 材料&#xff09;&#xff0c;一般采用真空蒸发镀膜法。 原理&#xff1a;AF 防污防指纹玻璃是根据荷叶原理&#xff0c;在玻璃外表面涂制…

预约系统源码解析:打造智能定制化预约服务的技术奇迹

在当今数字化时代&#xff0c;预约系统的重要性日益凸显&#xff0c;而预约系统源码的开放将为各行业带来更加灵活、智能的预约解决方案。本文将深入探讨预约系统源码的技术内幕&#xff0c;为开发者提供实用的代码示例&#xff0c;助力打造智能定制化的预约服务。 技术栈概览…

【brpc学习实践】ParallelChannel的使用与并行请求

概览 ParallelChannel (有时被称为“pchan”)同时访问其包含的sub channel,并合并它们的结果。用户可通过CallMapper修改请求,通过ResponseMerger合并结果。ParallelChannel看起来就像是一个Channel: 支持同步和异步访问。 发起异步操作后可以立刻删除。 可以取消。 支持超…

java学习part25多线程

132-多线程-程序、进程、线程与并行、并发的概念_哔哩哔哩_bilibili 1.概念 2.共享内容 只有线程间能通信&#xff0c;进程之间不共享内容。 3.继承thread的多线程 相当于golang里先写一个线程函数run(),子类对象调用start()相当于go关键字 相当于go run() package thread;/…

在ubuntu虚拟机上安装不同版本的交叉编译工具链

在之前的章节中&#xff0c;学习了如何安装了4.8.3的交叉编译工具链&#xff1a; 交叉编译 和 软硬链接 的初识&#xff08;面试重点&#xff09;-CSDN博客 但是&#xff0c;在之后学习内核编译时&#xff0c;由于我的树莓派内核版本较高&#xff0c;为6.1&#xff0c;所以在…

RubyMine 2023 年下载、安装、使用教程,详细图解

大家好&#xff0c;今天为大家带来的是RubyMine 2023 年下载、安装、使用教程&#xff0c;详细图解。 文章目录 1 RubyMine 简介2 RubyMine 下载、安装教程RubyMine 下载RubyMine 安装 3 RubyMine 汉化4. 常用快捷键一级必会二级进阶 1 RubyMine 简介 RubyMine 是一个为 Ruby …

改造python3中的http.server为简单的文件下载服务

改造 修改python3中的http.server.SimpleHTTPRequestHandler&#xff0c;实现简单的文件上传下载服务 simple_http_file_server.py&#xff1a; # !/usr/bin/env python3import datetime import email import html import http.server import io import mimetypes import os …

vue中.sync修饰符与$emit(update:xxx)双向数据绑定

文章目录 一、单向数据流二、props父子传值2.1、父组件2.2、子组件2.3、优缺点2.3.1、优点2.3.2、缺点 三、.sync修饰符双向绑定3.1、父组件3.2、子组件3.3、优缺点3.3.1、优点3.3.2、缺点 3.4、[文档](https://v2.cn.vuejs.org/v2/guide/components-custom-events.html#sync-%…

JAVA全栈开发 day14_集合(Collection\List接口、数据结构、泛型)

一、数组 数组是一个容器&#xff0c;可以存入相同类型的多个数据元素。 数组局限性&#xff1a; ​ 长度固定&#xff1a;&#xff08;添加–扩容&#xff0c; 删除-缩容&#xff09; ​ 类型是一致的 对象数组 &#xff1a; int[] arr new int[5]; … Student[] arr …

ThermalLabel SDK for .NET 13.0.23.1113 Crack

ThermalLabel SDK for .NET 是一个 .NET 典型类库&#xff0c;它允许用户和开发人员创建非常创新的条码标签并将其发布在 zebra ZPL、EPL、EPSON ESC、POS 以及 Honeywell intermec 指纹中通过在 VB.NET 或 C# 上编写 .NET 纯代码来实现热敏打印机&#xff0c;以实现项目框架的…

shell编程系列(6)-使用Sort进行数据排序

文章目录 前言使用Sort命令文本排序sort命令的选项如下&#xff1a;基本排序对单个指定列进行排序对多个指定列进行排序删除重复的行 结语 前言 shell脚本通常用作一些自动化的操作&#xff0c;但是在有些场景下例如科研运算&#xff0c;有时候会产生大量的运算结果文件&#…

单片机AVR单片机病房控制系统设计+源程序

一、系统方案 设计一个可容8张床位的病房呼叫系统。要求每个床位都有一个按钮&#xff0c;当患者需要呼叫护士时&#xff0c;按下按钮&#xff0c;此时护士值班室内的呼叫系统板上显示该患者的床位号&#xff0c;并蜂鸣器报警。当护士按下“响应”键时&#xff0c;结束当前呼叫…

【idea】设置鼠标滚轮控制缩放大小

1、点击file 选择Setting 2、点击Editor 下面的 General 3、勾选 Mouse Control 下面的 Change font size with CtrlMouse Wheel in 4、点级apply 5、按 ctrl键 鼠标滚轮缩放字体的大小

python进阶技巧

1.闭包 通过函数嵌套&#xff0c;可以让内部函数依赖外部变量&#xff0c;可以避免全局变量的污染问题 闭包注意事项&#xff1a; 总结&#xff1a; 2.装饰器 2.1装饰器的一般写法 2.2 装饰器的语法糖写法 def outer(func):def inner():print(睡了)func()print(起床)retur…

java--多态

1.什么是多态 多态是在继承/实现的情况下的一种现象&#xff0c;表现为&#xff1a;对象多态、行为多态。 2.多态的具体代码体现 编译看左边&#xff0c;运行看右边 3.多态的前提 有继承/实现关系&#xff1b;存在父类引用子类对象&#xff1b;存在方法重写 4.多态的一个注…

Navicat连接Oracle数据库记录

oracle服务如图&#xff1a; navicat连接设置&#xff1a; 测试连接成功&#xff01; 连接创建成功&#xff01;

语音信号处理:librosa

1 librosa介绍 Librosa是一个用于音频和音乐分析的Python库&#xff0c;专为音乐信息检索&#xff08;Music Information Retrieval&#xff0c;MIR&#xff09;社区设计。自从2015年首次发布以来&#xff0c;Librosa已成为音频分析和处理领域中最受欢迎的工具之一。它提供了一…

python中的函数定义

默认参数 注&#xff1a; 在Python中&#xff0c;print(x, and y both correct)是一条打印语句&#xff08;print statement&#xff09;&#xff0c;用于将一条消息输出到控制台或终端。它的作用是将变量x的值和字符串and y both correct同时输出到屏幕上。 在这个语句中&…

基于AT89C51单片机的节日彩灯门设计

1&#xff0e;设计任务 本设计采用单片机为主控芯片&#xff0c;结合外围电路组成彩灯门的控制系统器&#xff0c;用来控制16个彩色的LED发光&#xff0c;实现彩色亮点的循环移动&#xff1b;通过软件编程实现各种各样的彩色亮点平面循环移动&#xff0c;该彩色控制器可以通过输…