Part03 ☀️
大约 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();
}
完成了保存逻辑,接下来观察数据文件中是否存在新增的数据
总结
课堂作业
- 参考上述提示,完成添加工作的代码书写!🎤
2. 完成编辑和删除按钮的显示优化
前言

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

代码操作
首先我们分析一下,如何实现操作列的编辑和删除按钮能够正常显示和点击。
1. 观察截面图,我们要获取到表格的最后一列,也就是操作列,然后给这个操作列设置渲染器和编辑器。

可以发现,可以通过索引值5(从0开始)来获取表格的最后一列,也就是操作列。
TableColumn buttonColumn = workloadTable.getColumnModel().getColumn(5);
buttonColumn.setCellRenderer(渲染器对象);// 设置渲染器
buttonColumn.setCellEditor(编辑器对象);// 设置编辑器
2. 接下来参照上述的说明,我们定义2个类(渲染器和编辑器)实现TableCellRenderer
和 TableCellEditor
接口,并重写相应的方法。

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 ""; // 返回值不重要,因为我们直接处理按钮事件
}
}
- 最后,在
MainFrame
类中,找到构造方法
方法,将渲染器和编辑器设置到表格的操作列中。
// 设置表格的最后一列(操作列)的渲染器和编辑器
TableColumn buttonColumn = workloadTable.getColumnModel().getColumn(5);
buttonColumn.setCelRenderer(new ButtonPanelRenderer());// 设置渲染器
buttonColumn.setCellEditor(new ButtonPanelEditor(workloadTable,this));// 设置编辑器
- 启动程序,点击表格中的操作列,观察控制台日志输出,发现按钮已经可以正常显示了。

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