Java Swing 自定义组件库分享(十四)
Java Swing 自定义组件库分享十四渲染器与编辑器一、背景二、设计说明三、CheckBox 渲染器与编辑器四、禁用背景渲染器五、开关渲染器与编辑器六、总结一、背景CusTable支持了基本的数据展示和交互但 Swing 表格真正的强大之处在于渲染器Renderer和编辑器Editor机制。渲染器控制单元格的显示样式颜色、字体、对齐等编辑器控制单元格的编辑行为双击后弹出什么组件通过自定义渲染器和编辑器可以实现复选框、开关、操作按钮等复杂交互让表格不再只是静态数据展示。二、设计说明本篇涉及的四个核心组件1. CheckBox 渲染器与编辑器CheckboxRenderer将Boolean值显示为复选框只读CheckboxEditor允许用户点击复选框切换Boolean值2. 禁用背景渲染器DisableBgCellRenderer禁用单元格选中时的背景高亮常用于操作列3. 开关渲染器与编辑器SwitchCellRenderer将Boolean值显示为滑动开关只读SwitchCellEditor点击开关切换Boolean值并支持业务回调三、CheckBox 渲染器与编辑器3.1 CheckboxRendererimportjavax.swing.*;importjavax.swing.table.DefaultTableCellRenderer;importjava.awt.*;/** * 复选框渲染器 * 将 Boolean 值渲染为 JCheckBox用于表格中的复选框列 * * 使用示例 * TableColumn col table.getColumnModel().getColumn(0); * col.setCellRenderer(new CheckboxRenderer()); */publicclassCheckboxRendererextendsDefaultTableCellRenderer{privatefinalJCheckBoxcheckBoxnewJCheckBox();publicCheckboxRenderer(){checkBox.setHorizontalAlignment(SwingConstants.CENTER);checkBox.setBorder(BorderFactory.createEmptyBorder(0,10,0,0));}OverridepublicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,booleanisSelected,booleanhasFocus,introw,intcolumn){checkBox.setSelected(Boolean.TRUE.equals(value));returncheckBox;}}3.2 CheckboxEditorimportjavax.swing.*;/** * 复选框编辑器 * 允许在表格中通过点击复选框切换 Boolean 值 * * 使用示例 * TableColumn col table.getColumnModel().getColumn(0); * col.setCellEditor(new CheckboxEditor()); */publicclassCheckboxEditorextendsDefaultCellEditor{publicCheckboxEditor(){super(newJCheckBox());}OverridepublicObjectgetCellEditorValue(){return((JCheckBox)getComponent()).isSelected();}}3.3 使用示例TableColumncoltable.getColumnModel().getColumn(0);col.setCellRenderer(newCheckboxRenderer());col.setCellEditor(newCheckboxEditor());四、禁用背景渲染器4.1 DisableBgCellRendererimportjavax.swing.*;importjavax.swing.table.TableCellRenderer;importjava.awt.*;/** * 禁用选中背景色渲染器 * 包装原始渲染器在指定列被选中时使用未选中时的背景色 * * 使用示例 * TableCellRenderer defaultRenderer table.getDefaultRenderer(Object.class); * TableColumn col table.getColumnModel().getColumn(3); * col.setCellRenderer(new DisableBgCellRenderer(defaultRenderer, 3)); */publicclassDisableBgCellRendererimplementsTableCellRenderer{privatefinalTableCellRendererdefaultRenderer;privatefinalintcolumn;publicDisableBgCellRenderer(TableCellRendererdefaultRenderer,intcolumn){this.defaultRendererdefaultRenderer;this.columncolumn;}OverridepublicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,booleanisSelected,booleanhasFocus,introw,intcolumn){ComponentcdefaultRenderer.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);// 如果该列需要禁用选中背景if(isSelectedcolumnthis.column){c.setBackground(table.getBackground());c.setForeground(table.getForeground());}returnc;}}4.2 使用示例// 禁用第3列操作列的选中高亮TableCellRendererdefaultRenderertable.getDefaultRenderer(Object.class);TableColumncoltable.getColumnModel().getColumn(3);col.setCellRenderer(newDisableBgCellRenderer(defaultRenderer,3));五、开关渲染器与编辑器5.1 SwitchCellRendererimportjavax.swing.*;importjavax.swing.table.TableCellRenderer;importjava.awt.*;/** * 开关渲染器 * 将 Boolean 值渲染为 SwitchComponent * * 使用示例 * TableCellRenderer defaultRenderer table.getDefaultRenderer(Object.class); * TableColumn col table.getColumnModel().getColumn(2); * col.setCellRenderer(new SwitchCellRenderer(defaultRenderer)); */publicclassSwitchCellRendererimplementsTableCellRenderer{// 见第九篇privatefinalSwitchComponentswitchComponentnewSwitchComponent();privatefinalTableCellRendererdefaultRenderer;publicSwitchCellRenderer(TableCellRendererdefaultRenderer){this.defaultRendererdefaultRenderer;}OverridepublicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,booleanisSelected,booleanhasFocus,introw,intcolumn){if(valueinstanceofBoolean){switchComponent.setSwitched((Boolean)value);switchComponent.setEnabled(true);JPanelpanelnewJPanel(newFlowLayout(FlowLayout.CENTER,0,5));panel.setPreferredSize(newDimension(100,50));panel.setBackground(table.getBackground());panel.add(switchComponent);returnpanel;}ComponentcomponentdefaultRenderer.getTableCellRendererComponent(table,value,isSelected,hasFocus,row,column);component.setBackground(table.getBackground());component.setForeground(table.getForeground());returncomponent;}}5.2 SwitchCellEditorimportjavax.swing.*;importjavax.swing.table.TableCellEditor;importjava.awt.*;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.util.EventObject;importjava.util.function.BiFunction;/** * 开关编辑器 * 允许在表格中通过点击滑动开关切换 Boolean 值 * * 使用示例 * TableColumn col table.getColumnModel().getColumn(2); * col.setCellEditor(new SwitchCellEditor(table, (row, newState) - { * System.out.println(第 row 行状态变为 newState); * return true; * })); */publicclassSwitchCellEditorextendsAbstractCellEditorimplementsTableCellEditor{// 见第九篇privatefinalSwitchComponentswitchComponentnewSwitchComponent();privateinteditingRow;privatebooleaneditingfalse;//见上一篇privatefinalCusTable?cusTable;privatefinalBiFunctionInteger,Boolean,BooleanswitchAction;publicTSwitchCellEditor(CusTableTcusTable,BiFunctionInteger,Boolean,BooleanswitchAction){this.cusTablecusTable;this.switchActionswitchAction;switchComponent.addMouseListener(newMouseAdapter(){OverridepublicvoidmouseClicked(MouseEvente){if(switchComponent.isEnabled()editing){toggleSwitchState();e.consume();}}});}privatevoidtoggleSwitchState(){booleannewState!switchComponent.isSwitched();// CallbackProcessor见第二篇BooleanresultCallbackProcessor.apply(switchAction,editingRow,newState,false);if(result!nullresult){switchComponent.setSwitched(newState);stopCellEditing();if(null!cusTable){cusTable.repaint();}}else{cancelCellEditing();}}OverridepublicObjectgetCellEditorValue(){returnswitchComponent.isSwitched();}OverridepublicComponentgetTableCellEditorComponent(JTabletable,Objectvalue,booleanisSelected,introw,intcolumn){this.editingRowrow;this.editingtrue;if(valueinstanceofBoolean){switchComponent.setSwitched((Boolean)value);switchComponent.setEnabled(true);JPanelpanelnewJPanel(newFlowLayout(FlowLayout.CENTER,0,5));panel.setPreferredSize(newDimension(100,50));panel.setBackground(table.getBackground());panel.add(switchComponent);SwingUtilities.invokeLater(()-{if(editing){toggleSwitchState();}});returnpanel;}returnswitchComponent;}OverridepublicbooleanisCellEditable(EventObjecte){returneinstanceofMouseEvent;}OverridepublicbooleanshouldSelectCell(EventObjectanEvent){returntrue;}OverridepublicbooleanstopCellEditing(){this.editingfalse;returnsuper.stopCellEditing();}OverridepublicvoidcancelCellEditing(){this.editingfalse;super.cancelCellEditing();}}5.3 使用示例// 设置开关列第2列TableCellRendererdefaultRenderertable.getDefaultRenderer(Object.class);TableColumncoltable.getColumnModel().getColumn(2);col.setCellRenderer(newSwitchCellRenderer(defaultRenderer));col.setCellEditor(newSwitchCellEditor(table,(row,newState)-{// 执行业务逻辑System.out.println(第row行状态变为newState);// 返回 true 表示更新成功界面同步切换returntrue;}));六、总结自定义渲染器和编辑器是 Swing 表格实现复杂交互的核心机制。本篇展示了四种常见的表格交互模式复选框适合布尔值的展示和编辑禁用背景适合操作列等不需要选中高亮的场景滑动开关适合状态切换场景交互更直观

相关新闻

生产级多维聚合:pandas五大核心模式与避坑指南

生产级多维聚合:pandas五大核心模式与避坑指南

1. 项目概述:为什么多维聚合不是“加个groupby”就能搞定的事我在银行数据平台组干了八年,从最早用SQL写几十行嵌套子查询做客户分层,到现在每天在Jupyter里调试pandas的agg链式调用,踩过的坑比写的代码还多。今天这篇讲的“多维聚…

2026/7/13 4:55:28 阅读更多 →
Codex与DeepSeek集成:构建智能工作流代理的完整指南

Codex与DeepSeek集成:构建智能工作流代理的完整指南

Codex 与 DeepSeek 的集成正在重新定义 AI 工作代理的能力边界。这次的技术演进不再是简单的代码补全工具升级,而是让 AI 真正具备了操控电脑、参与完整工作流程的能力。对于想要构建自动化工作流的开发者来说,这套组合提供了从底层 CRI 接口到高层业务逻…

2026/7/13 4:55:28 阅读更多 →
CMU深度学习课程解析:从数学原理到工程实践的完整学习体系

CMU深度学习课程解析:从数学原理到工程实践的完整学习体系

去年秋天,有位刚转行AI的朋友问我:“能不能推荐一门真正能打基础的深度学习课?网上教程要么太浅,要么直接扔代码。”我反问他:“你是想学会调几个模型,还是想真正理解为什么这些模型能工作?”他…

2026/7/13 4:55:28 阅读更多 →

最新新闻

BQ25887与STM32F373RC在锂电池平衡管理中的应用

BQ25887与STM32F373RC在锂电池平衡管理中的应用

1. BQ25887与STM32F373RC在电池管理系统中的协同作用在当今便携式电子设备蓬勃发展的背景下,多节锂电池串联供电方案已成为主流选择。然而,串联电池组面临的核心挑战在于单体电池间的电压不均衡问题——这种不均衡会显著降低整体电池组的可用容量&#x…

2026/7/13 5:49:58 阅读更多 →
Eino 框架编排讲解:Chain和Graph

Eino 框架编排讲解:Chain和Graph

在AI应用与Agent开发快速迭代的当下,简单的线性代码拼接已经无法满足复杂大模型业务场景的需求。传统开发模式存在组件耦合严重、流程难以复用、调试排查困难、动态逻辑无法实现等痛点,而编排能力正是解决这些问题的核心关键。 Eino 作为字节开源的Go语言…

2026/7/13 5:49:58 阅读更多 →
高精度信号采集系统:AD7175-8与TM4C123GH6PZ实战指南

高精度信号采集系统:AD7175-8与TM4C123GH6PZ实战指南

1. 项目概述:高精度信号采集系统的核心组件在工业测量、医疗设备和科学仪器等领域,对微弱信号的精确采集与处理一直是工程师面临的挑战。AD7175-8作为ADI公司推出的24位Σ-Δ型ADC,配合TI的TM4C123GH6PZ微控制器,能够构建出专业级…

2026/7/13 5:49:58 阅读更多 →
Tailwind CSS v4.3 从入门到实战Vite 安装、响应式布局、暗黑模式与主题配置

Tailwind CSS v4.3 从入门到实战Vite 安装、响应式布局、暗黑模式与主题配置

前言传统前端项目中,CSS 文件容易随着业务增长而不断膨胀:类名越来越多、同一套颜色和间距被重复定义、响应式规则分散在多个媒体查询里。 Tailwind CSS 使用 Utility-First(工具类优先) 的方式,把常见样式拆成可组合类…

2026/7/13 5:47:45 阅读更多 →
C++实战:LSB规则下十六进制字节流到有符号整数的解码指南

C++实战:LSB规则下十六进制字节流到有符号整数的解码指南

1. 项目概述:从十六进制字节流到有符号整数的桥梁在嵌入式通信、文件解析或者逆向工程中,我们常常会面对一串串冷冰冰的十六进制数据。这些数据,比如0xFE 0xFF 0x00 0x2A,对人类来说只是一堆数字和字母的组合,但对于程…

2026/7/13 5:43:43 阅读更多 →
ANSYS Fluent三维流体仿真:从网格划分到激光熔池实战指南

ANSYS Fluent三维流体仿真:从网格划分到激光熔池实战指南

这次我们来深入探讨ANSYS Fluent这款专业流体仿真软件的三维详细教学。Fluent作为计算流体动力学(CFD)领域的行业标准工具,广泛应用于航空航天、汽车工程、能源化工等行业的流体分析、传热传质和多相流模拟。对于工程师和研究人员来说&#x…

2026/7/13 5:43:43 阅读更多 →

日新闻

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改

Palworld存档编辑完全掌握:从零开始实现游戏数据可视化修改 【免费下载链接】palworld-save-tools Tools for converting Palworld .sav files to JSON and back 项目地址: https://gitcode.com/gh_mirrors/pa/palworld-save-tools 你是否曾经想要调整Palwor…

2026/7/13 0:01:19 阅读更多 →
浦东旧模块回收哪家强?专业评测带你一探究竟

浦东旧模块回收哪家强?专业评测带你一探究竟

于科技迅猛飞速迭代的当下此刻, 旧模块的回收处置, 不但关联着资源的再度利用, 而且更牵扯到数据安全以及环保合规事宜。你是不是也正为那堆积得如同山峦般的旧模块而发愁? 是不是不清楚该怎样安全且高效地去处理它们? 别忧心烦恼, 就在今日, 我会以具备权威影响力的自媒体博…

2026/7/13 0:01:19 阅读更多 →
卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

卡梅德生物技术快报|重组蛋白的表达和纯化:IMAC 金属螯合色谱全流程工艺手册|基质 - 配基 - 金属离子匹配与蛋白质分离纯化参数优化

1 研究背景与现存技术痛点(提出问题)基因工程、蛋白质组学、生物制药研发流程中,蛋白质分离纯化是决定下游实验成败的关键环节。当前实验室常规蛋白质分离纯化工艺存在三类难以标准化的技术瓶颈:传统离子交换、分子筛层析无特异性…

2026/7/13 0:05:20 阅读更多 →

周新闻

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨

互联网大厂 Java 求职面试:燕双非的搞笑回答与技术探讨 在一个阳光明媚的上午,互联网大厂的面试官坐在桌前,准备迎接他的面试候选人——燕双非,一个以搞笑和幽默著称的程序员。第一轮提问 面试官:燕双非,作…

2026/7/13 4:38:36 阅读更多 →
车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估

车载以太网PMA测试设备选型:示波器、VNA、信号源3类仪器关键参数与预算评估在智能驾驶和车联网技术快速发展的今天,车载以太网作为新一代车载网络的核心传输技术,其物理层性能直接决定了数据传输的可靠性和稳定性。1000BASE-T1作为当前主流的…

2026/7/13 4:38:38 阅读更多 →
VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战,5步完成Keil工程转换

VSCode EIDE 插件 2.0:APM32/STM32 项目迁移实战指南嵌入式开发领域正经历一场工具链的静默革命。当传统Keil用户首次打开VSCode的扩展市场搜索EIDE时,往往会惊讶于这个看似简单的插件竟能重构十余年的开发习惯。本文将揭示如何用五个精准步骤&#xff0…

2026/7/13 4:38:40 阅读更多 →

月新闻