Part02 ☀️

YangeIT大约 8 分钟

Part02 ☀️

课程内容

  • 工作量模块业务说明及设计 ✏️
  • 工作量主界面构建 ✏️
  • 查询工作量功能 ✏️
  • 增加工作量对话框 ✏️

1. 工作量模块业务说明及设计

业务模块说明

  1. 系统概述

教师工作量任务管理系统旨在帮助学校或教育机构有效管理教师的工作任务分配、记录和统计。系统采用Java Swing GUI开发,主要功能包括用户登录注册、工作量任务管理(增删改查)等。

原型图
原型图
  1. 工作量模块业务说明

    • 业务需求
      • 记录教师日常工作任务及耗时
      • 支持按教师姓名条件查询
      • 为教师绩效考核提供数据支持
      • 实现工作量任务的规范化管理
    • 核心业务流程
      • 教师/管理员登录系统
      • 添加新的工作量任务
      • 查看/修改/删除已有任务
    • 业务规则
      • 每位教师只能查看和修改自己的任务(管理员除外)
      • 任务耗时以小时为单位,最小1小时
      • 日期不能晚于当前日期
      • 必填字段:教师姓名、耗时、日期、任务描述
  2. 任务说明

  • 任务界面开发
  • 添加任务功能
  • 查询任务功能
  • 修改任务功能
  • 删除任务功能
  • 代码优化
各种操作
各种操作

总结

回答下列问题,测一测你对工作量的了解程度

  1. 工作量模块的主要功能是什么?
  2. 工作量模块的业务规则有哪些?
  3. 工作量模块的任务界面开发包括哪些功能?

2. 工作量主界面构建

工作量主界面构建

用户登录成功后,进入工作量模块主界面,主界面包括菜单栏、工作区、状态栏等部分。菜单栏包括“数据处理”、“其他”等菜单项,工作区用于显示工作量任务列表,状态栏用于显示当前用户信息。

image
image

代码操作

1. 完成状态栏和菜单栏的构建

public class MainFrame extends JFrame {
    private User currentUser; //当前登录用户

    public MainFrame(User user) {
        this.currentUser = user;
        setTitle("教师工作量管理 - " + user.getUsername());
        setSize(800, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        // 创建菜单栏
        JMenuBar menuBar = new JMenuBar();
        // 创建数据处理菜单栏项
        JMenu menu = new JMenu("操作");
        // 创建添加菜单栏项
        JMenuItem addItem = new JMenuItem("添加工作量");
        //todo 添加任务事件(待实现)
        menu.add(addItem);
        JMenuItem logoutItem = new JMenuItem("退出");
        // 退出登录事件
        logoutItem.addActionListener(e -> {
            dispose(); // 关闭当前窗口
            new LoginFrame().setVisible(true); // 打开登陆页面
        });
        menu.add(logoutItem);
        // 添加2个菜单栏项到菜单栏
        menuBar.add(menu);
        // 设置菜单栏到本窗口
        this.setJMenuBar(menuBar);
        s
        //todo 接下来完成表格设置 
    }
}




 
 




























点击App启动,观察页面是否正常显示 👇

状态栏和菜单栏显示效果
状态栏和菜单栏显示效果
  1. 完成工作区构建(表格)

2.1. 在MainFrame类中添加成员变量tableModel 和 workloadTable,方便全类调用

public class MainFrame extends JFrame {
    private User currentUser; //当前登录用户
    private DefaultTableModel tableModel;//表格模型
    private JTable workloadTable;//表格

 
 
 

2.2. 接上面第一步的代码,设置表格 👇

表格标题
表格标题
    // 创建表格列表模型
    tableModel = new DefaultTableModel( new Object[]{"ID", "教师姓名","日期", "工作小时", "工作内容描述", "操作"}, 0);
    // 创建表格组件
    workloadTable = new JTable(tableModel);
    // 设置表格选择模式为单选
    workloadTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    // 添加到窗口中,并且设置表格可以上下滑动,且居中显示
    add(new JScrollPane(workloadTable), BorderLayout.CENTER);

    // 设置表格标题(见上图)
    // 如果是管理员,显示所有教师工作量,否则只显示当前用户的
    if ("admin".equals(currentUser.getRole())) {
        JLabel titleLabel = new JLabel("所有教师工作量");
        titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 16));
        titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
        // 添加到窗口中,并且设置居中显示
        add(titleLabel, BorderLayout.NORTH);
    } else {
        JLabel titleLabel = new JLabel("我的工作量");
        titleLabel.setFont(new Font("微软雅黑", Font.BOLD, 16));
        titleLabel.setHorizontalAlignment(SwingConstants.CENTER);
        // 添加到窗口中,并且设置居中显示
        add(titleLabel, BorderLayout.NORTH);

      
    }

    //todo 加载数据











 
 















完成代码后,开始测试,观察页面是否正常显示 👇

image
image

3. 设置监听事件和加载数据方法

在上面的todo位置,设置监听事件和加载数据,代码如下 👇

image
image
//加载数据
 public void refreshData() {
    System.out.println("正在加载数据....");
 }
// 弹出添加工作量对话框
private void addWorkload() {
    System.out.println("即将弹出添加任务对话框....");
}


4. 调用工具类DataUtil完成加载数据逻辑

/**
 * 刷新工作量表格数据
 */
public void refreshData() {
    tableModel.setRowCount(0); // 清空表格
    // 如果是管理员,显示所有教师工作量,否则只显示当前用户的
    if ("admin".equals(currentUser.getRole())) {
        for (Workload workload : DataUtil.getAllWorkloads()) {
            tableModel.addRow(new Object[]{workload.getId(), workload.getTeacher(), workload.getWorkDate(), workload.getHours(), workload.getDescription(), "编辑"});
        }
    } else {
        for (Workload workload : DataUtil.getWorkloadsByTeacherName(currentUser.getUsername())) {
            tableModel.addRow(new Object[]{workload.getId(), workload.getTeacher(), workload.getWorkDate(), workload.getHours(), workload.getDescription(), "编辑"});
        }
    }

}

// 弹出添加工作量对话框(内部逻辑后续实现)
private void addWorkload() {
    System.out.println("即将弹出添加任务对话框....");
}

测试图
测试图

好了,至此主页面的列表显示,而且不同用户登录后,显示的列表信息都不一样,Nice!

但是测试后发现,操作栏似乎和设计图不符(编辑和删除),这个怎么解决尼?下节课我们来讲解。

总结

课堂作业

  1. 参考上述的步骤,完成教师工作量管理系统的列表展示。🎤

3. JDialog回顾讲解

JDialog

image
image

1. 需求分析

在任务管理或其他业务场景中,需要一个对话框(Dialog)来收集新增任务的相关信息(如下图),如截图中展示的“添加工作量”对话框,包含教师名称(可能通过下拉框选择)、工作日期、工作小时、工作描述等字段,以及“保存”和“取消”操作按钮。

2. 涉及的 Java Swing 组件

  • 1 JDialog
    • 作用:作为对话框的容器,用于承载其他组件并实现弹出式交互窗口。
    • 特点:可以设置模态(modal),即阻止用户与对话框所属窗口的其他部分交互,直到对话框关闭;可设置标题、大小、位置等属性。
  • 2 JLabel
    • 作用:用于显示提示文本,如“教师名称:”“工作日期(yyyy - MM - dd):”等。
  • 3 JComboBox(用于教师名称选择)
    • 作用:提供下拉选择功能,方便用户从预定义的教师列表中选择。
  • 4 JTextField(用于工作日期、工作小时等文本输入)
    • 作用:接收用户的单行文本输入。
  • 5 JTextArea(用于工作描述多行输入)
    • 作用:允许用户输入多行文本描述。
  • 6 JButton(保存和取消按钮)
    • 作用:触发相应的操作逻辑,如保存输入数据或关闭对话框。

代码操作

image
image

分析示例图,确定所需的组件,如 JLabel、JComboBox、JTextField、JTextArea 和 JButton 等。然后根据需求设置组件的属性,如文本内容、下拉选项、默认值等。代码如下:👇

public class WorkloadDialog extends JDialog {

    private User currentUser;// 当前登录用户
    private JTextField dateField;//  工作日期
    private JTextField hoursField;//  工作小时
    private JTextField teacherField;//  教师名称
    private JTextArea descArea;//  工作描述
    private MainFrame parent;//  父窗口,方便调用父窗口刷新数据
    private Workload workload;//  保存当前正在编辑的

    public WorkloadDialog(JFrame parent, User currentUser) {
        //调用父类的构造方法,设置标题
        super(parent,"添加工作量", true);
        this.parent = (MainFrame) parent;
        this.currentUser = currentUser;
        workload=new Workload();//  创建一个空的Workload对象
        setSize(600, 400);
        setLocationRelativeTo(parent);
        //设置一个最外围的面板
        JPanel panel = new JPanel(new BorderLayout(10, 10));
        panel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));

        //设置第一个部分:表单面板(4行2列)
        JPanel formPanel = new JPanel(new GridLayout(4, 2, 10, 10));
        //添加第一行
        formPanel.add(new JLabel("教师名称:"));
        //用来保存教师姓名的组件
        teacherField = new JTextField();
        //教师这一列采用下拉列表选择教师姓名
        JComboBox<String> teacherComboBox = new JComboBox<>();
        for (User user : DataUtil.getAllTeachers()) {
            teacherComboBox.addItem(user.getUsername());
        }
        //当选择了教师姓名,将教师姓名保存到teacherField中
        teacherField.setText(currentUser.getUsername());
        teacherComboBox.addActionListener(e -> {
            String selectedTeacher = (String) teacherComboBox.getSelectedItem();
            teacherField.setText(selectedTeacher);
        });
        formPanel.add(teacherComboBox);
        //第二行数据设置
        formPanel.add(new JLabel("工作日期 (yyyy-MM-dd):"));
        dateField = new JTextField();
        //默认设置当前日期(将当前日期格式化)
        dateField.setText(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
        formPanel.add(dateField);
        //第三行数据设置
        formPanel.add(new JLabel("工作小时:"));
        hoursField = new JTextField();
        formPanel.add(hoursField);
        //第四行数据设置
        formPanel.add(new JLabel("工作描述:"));
        descArea = new JTextArea(3, 20);
        formPanel.add(new JScrollPane(descArea));

        //将表单面板添加到最外围面板
        panel.add(formPanel, BorderLayout.CENTER);

        // 按钮面板
        JPanel buttonPanel = new JPanel();
        JButton saveBtn = new JButton("保存");
        saveBtn.addActionListener(e -> saveWorkload());
        JButton cancelBtn = new JButton("取消");
        cancelBtn.addActionListener(e -> dispose());
        buttonPanel.add(saveBtn);
        buttonPanel.add(cancelBtn);
        panel.add(buttonPanel, BorderLayout.SOUTH);

        add(panel);
    }

    // 保存工作量
    private void saveWorkload() {
        System.out.println("保存工作");
    }

}

输入数据,点击保存按钮,观察控制台输出,发现保存按钮的点击事件被触发,但数据未保存(待完成)。 image

点击对话框下面的保存按钮,观察控制台输出!!👇 image

至此,添加工作量对话框的界面和基本功能已经完成。接下来,我们需要实现保存按钮的点击事件,将用户输入的工作量信息保存到数据文件中。

总结

课堂作业

  1. 完成教师工作量管理系统的添加工作量对话框。🎤