Part03 ☀️

YangeIT大约 4 分钟

Part03 ☀️

课程内容

  • 新增工作量功能 ✏️
  • 编辑删除按钮显示 ✏️

1. 完成保存逻辑

完成保存逻辑

上一节我们完成了工作量对话框的代码编写,接下来我们完成保存逻辑

WorkloadDialog类中的保存方法

// 保存工作量
private void saveWorkload() {
    // System.out.println("保存工作");
    // 获取表单数据
    Strng workheheDate = dateField.getText();
    float hours = Float.parseFloat(hoursField.geText());
    String description = descArea.getText();
    String teacher = teachrField.getText();
    // 设置工作量对象属性
    workload.setTeacher(teacher);
    workload.setWorkate(workDate);
    workload.setHours(hours);
    workload.setDescription(description);
    // 保存工作量对象到文件
    DataUtil.saveWorkload(workload);
    // 调用父窗口刷新列表
    parent.refreshData();
    // 关闭当前窗口
    dispos();
}

完成了保存逻辑,接下来观察数据文件中是否存在新增的数据

总结

课堂作业

  1. 参考上述提示,完成添加工作的代码书写!🎤

2. 完成编辑和删除按钮的显示优化

前言

image
image

出现上述的问题,需要用到TableCellRendererTableCellEditor 接口,这两个接口分别用于渲染和编辑 表格单元格。在自定义按钮面板渲染器和编辑器时,需要实现这两个接口,并重写相应的方法。

区别
区别

代码操作

首先我们分析一下,如何实现操作列的编辑和删除按钮能够正常显示和点击。

1. 观察截面图,我们要获取到表格的最后一列,也就是操作列,然后给这个操作列设置渲染器和编辑器。

image
image

可以发现,可以通过索引值5(从0开始)来获取表格的最后一列,也就是操作列。

TableColumn buttonColumn = workloadTable.getColumnModel().getColumn(5);
buttonColumn.setCellRenderer(渲染器对象);// 设置渲染器
buttonColumn.setCellEditor(编辑器对象);//  设置编辑器

2. 接下来参照上述的说明,我们定义2个类(渲染器和编辑器)实现TableCellRendererTableCellEditor 接口,并重写相应的方法。

image
image
package com.it.frame;

import javax.swing.*;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import java.awt.*;

/**
 *自定义按钮面板渲染器
 */
class ButtonPanelRenderer implements TableCellRenderer {
    private JPanel panel;// 按钮面板
    private JButton editBtn;// 修改按钮
    private JButton deleteBtn;//  删除按钮

    /** 构造方法 */
    public ButtonPanelRenderer() {
        //  1. 创建面板
        panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
        // 2. 创建编辑和删除按钮
        editBtn = new JButton("修改");
        deleteBtn = new JButton("删除");
        // 3. 设置按钮样式
        editBtn.setMargin(new Insets(0, 5, 0, 5));
        deleteBtn.setMargin(new Insets(0, 5, 0, 5));
        // 4. 将按钮添加到面板中
        panel.add(editBtn);
        panel.add(deleteBtn);
    }

    /**
     * 返回一个包含两个按钮的面板
     */
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        return panel;
    }
}

// 自定义按钮面板编辑器
class ButtonPanelEditor extends AbstractCellEditor implements TableCellEditor {
    private JPanel panel;// 按钮面板
    private JButton editBtn;//  修改按钮
    private JButton deleteBtn;//  删除按钮
    private int editedRow;// 被修改的行
    
    public ButtonPanelEditor(JTable table, MainFrame frame) {
        panel = new JPanel(new FlowLayout(FlowLayout.CENTER, 5, 0));
        editBtn = new JButton("修改");
        deleteBtn = new JButton("删除");
        // 设置按钮样式
        editBtn.setMargin(new Insets(0, 5, 0, 5));
        deleteBtn.setMargin(new Insets(0, 5, 0, 5));
        // 修改按钮事件
        editBtn.addActionListener(e -> {
            fireEditingStopped();//  通知表格编辑结束
            //todo 点击编辑,弹出对话框
            System.out.println("即将弹出编辑对话框...");
        });
        // 删除按钮事件
        deleteBtn.addActionListener(e -> {
            fireEditingStopped();//  通知表格编辑结束
            //弹出对话框,提示是删除
            int confirm = JOptionPane.showConfirmDialog(table, 
                "确定删除此行吗?", "确认删除", JOptionPane.YES_NO_OPTION);
            if (confirm == JOptionPane.YES_OPTION) { // 如果用户确认删除,则调用方法执行删除(传入被删除的行)
                //todo 执行删除逻辑
                System.out.println("正在执行删除逻辑");
            }
        });
        
        panel.add(editBtn);//  将按钮添加到面板中
        panel.add(deleteBtn);//  将按钮添加到面板中
    }
    
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value,
            boolean isSelected, int row, int column) {
        System.out.println("第"+row+"行被点击了");
        editedRow = row;//  记录被修改的行
        return panel;
    }
    
    @Override
    public Object getCellEditorValue() {
        return ""; // 返回值不重要,因为我们直接处理按钮事件
    }


}


















































 








 































  1. 最后,在MainFrame类中,找到构造方法方法,将渲染器和编辑器设置到表格的操作列中。
//  设置表格的最后一列(操作列)的渲染器和编辑器
TableColumn buttonColumn = workloadTable.getColumnModel().getColumn(5);
buttonColumn.setCelRenderer(new ButtonPanelRenderer());// 设置渲染器
buttonColumn.setCellEditor(new ButtonPanelEditor(workloadTable,this));//  设置编辑器

  1. 启动程序,点击表格中的操作列,观察控制台日志输出,发现按钮已经可以正常显示了。
image
image

总结

课堂作业

1.参考上述的讲义完成编辑和删除按钮的优化显示!🎤