正常使用表格

很简单,使用一次就知道了,不过多介绍。

// 创建 JTable 实例,使用默认的模型
JTable table = new JTable(); // 设置表格数据
Object[][] data = {
{1, "Apple", 10.0},
{2, "Banana", 5.0},
{3, "Orange", 8.0}
}; Object[] columnNames = {"ID", "Name", "Price"};
table.setModel(new DefaultTableModel(data, columnNames));

show:

自定义表格样式

// 创建 JTable 实例,并使用自定义的 FileTableModel
JTable table = new JTable(new FileTableModel()); // 获取第二列(列索引为 1)的列模型 . 为第二列设置自定义的渲染器 AvailableRenderer
table.getColumnModel().getColumn(1).setCellRenderer(new AvailableRenderer()); // 获取第二列(列索引为 1)的列模型 . 为第二列设置自定义的编辑器 AvailableEditor . 将一个 JCheckBox 实例作为编辑器的渲染组件传入
table.getColumnModel().getColumn(1).setCellEditor(new AvailableEditor(new JCheckBox()));

可以看到,将默认的Model替换,改成自定义的模型,然后设置渲染器和编辑。渲染器就类似HTML的CSS样式。 编辑器就类似JS,可以在里面编辑事件,方便与用户交互。

核心就是理解这三个类的各自作用:

  • FileTableModel 定义了表格的数据源和基本行为。
  • AvailableRenderer 定义了表格中复选框单元格的显示效果。
  • AvailableEditor 定义了表格中复选框单元格的编辑交互行为。

Model、渲染器和编辑器的代码:

// 定义表格模型
// FileTableModel 继承自 AbstractTableModel,用于自定义表格模型
private class FileTableModel extends AbstractTableModel {
@Override
public int getRowCount() {
// 返回表格中的行数,通过获取 data 数组的长度
return data.length;
} @Override
public int getColumnCount() {
// 返回表格中的列数,通过获取 columnNames 数组的长度
return columnNames.length;
} @Override
public Object getValueAt(int rowIndex, int columnIndex) {
// 返回指定单元格的值,通过访问 data 数组中相应的位置
return data[rowIndex][columnIndex];
} @Override
public String getColumnName(int column) {
// 返回指定列的列名,通过访问 columnNames 数组中相应的位置
return columnNames[column];
} @Override
public Class<?> getColumnClass(int columnIndex) {
// 指定哪些单元格可以编辑,这里设置只有第二列(columnIndex == 1)可以编辑
return getValueAt(0, columnIndex).getClass();
} @Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
// 指定哪些单元格可以编辑,这里设置只有第二列(columnIndex == 1)可以编辑
return columnIndex == 1;
} @Override
public void setValueAt(Object value, int rowIndex, int columnIndex) {
// 设置指定单元格的值,并通知表格该单元格数据已经更新
data[rowIndex][columnIndex] = value;
fireTableCellUpdated(rowIndex, columnIndex);
}
} // 定义渲染器,用于渲染第二列的复选框
// AvailableRenderer 是一个自定义的渲染器,用于渲染 JTable 中的复选框单元格
// 它继承自 JCheckBox 并实现 TableCellRenderer 接口
private class AvailableRenderer extends JCheckBox implements TableCellRenderer { // 构造函数,用于初始化渲染器
public AvailableRenderer() {
// 设置复选框在单元格中水平居中
setHorizontalAlignment(SwingConstants.CENTER);
} // 重写此方法,用于自定义渲染单元格的行为
@Override
public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
// 根据传入的值设置复选框的选中状态
setSelected((Boolean) value); // 将复选框设置为可用状态,以便能够正确渲染
setEnabled(true); // 根据当前单元格是否被选中,设置复选框的背景色
// 如果被选中,则使用表格的选中行背景色
// 否则使用表格的默认背景色
setBackground(isSelected ? table.getSelectionBackground() : table.getBackground()); // 返回当前 JCheckBox 实例,作为渲染的组件
return this;
}
} // 定义编辑器,用于编辑第二列的复选框
private class AvailableEditor extends DefaultCellEditor implements ItemListener {
private JCheckBox checkBox;
private int editingRow; public AvailableEditor(JCheckBox checkBox) {
super(checkBox);
this.checkBox = checkBox;
this.checkBox.addItemListener(this);
} @Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
editingRow = row; // 记录当前编辑的行号
checkBox.setSelected((Boolean) value);
return checkBox;
} @Override
public Object getCellEditorValue() {
return checkBox.isSelected();
} @Override
public void itemStateChanged(ItemEvent e) {
super.fireEditingStopped();
System.out.println("-----"); // 打印"123" int id = (int) data[editingRow][0]; // 获取ID
String fileName = (String) data[editingRow][2]; // 获取文件名
System.out.println("ID: " + id + ", File Name: " + fileName);
}
}

shwo:

java switch 自定义表格的渲染和编辑示例的更多相关文章

  1. java的自定义配置文件统一读取配置类示例

    前言:在我们的日常编程中难免会有些我们自定义的配置,虽然Java中提供了很多的读取配置文件的方法,但是当我们需要修改配置文件的key的时候,就会发现太过散乱了,工作量也会很大,涉及的文件还很多,一不小 ...

  2. 动态渲染可编辑单元格的Table

    一.问题描述 问题是这样的,后台传了xArr = [x1, x2,...,xn]和yArr = [y1, y2, ..yn]两个数组,前端要渲染出表格并且可以填写每个单元格的值,然后按照一定数据结构保 ...

  3. Android中使用ListView绘制自定义表格(2)

    上回再写了<Android中使用ListView绘制自定义表格>后,很多人留言代码不全和没有数据样例.但因为项目原因,没法把源码全部贴上来.近两天,抽空简化了一下,做了一个例子. 效果图如 ...

  4. Dev_GridView自定义表格

    #region 自定义表格 //初始化测斜分析数据表 BandedGridView view = advBandedGridView1 as BandedGridView; view.BeginUpd ...

  5. IOS自定义表格UITableViewCell

    在UITableView中,自定义表格,最原始是继承UITableViewCell,然后通过写代码方式去搞,但是这个费事了. 1.在storyboard中 给一个ViewController的tabi ...

  6. java导出excel表格

    java导出excel表格: 1.导入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifac ...

  7. Java读取excel表格

    Java读取excel表格 一般都是用poi技术去读取excel表格的,但是这个技术又是什么呢 什么是Apache POI? Apache POI是一种流行的API,它允许程序员使用Java程序创建, ...

  8. 使用Java代码自定义Ribbon配置

    很多场景下,需要实现不同的微服务采用不同的策略,例如修改Ribbon的负载均衡规则等.Spring Cloud允许使用Java代码自定义Ribbon的配置. 在Spring Cloud中,Ribbon ...

  9. C#的委托与Java的自定义接口的异曲同工的同步操作

    C#的委托(以WinForm为例) 在子窗体(ChildFrm)中定义一个委托 this.CaptureListener(callback);//子窗体触发委托事件,以告诉调用的窗体 /// < ...

  10. Java Switch支持的类型问题

    常见支持类型为int,byte,short,char及枚举类型.以上是JDK1.6以前的版本.JDK1.7时,又增加了String. 参考资料:1.java switch支持的数据类型 2.java中 ...

随机推荐

  1. 【Azure 应用服务】App Service 配置 Application Settings 访问Storage Account得到 could not be resolved: '*.file.core.windows.net'的报错。没有解析成对应中国区 Storage Account地址 *.file.core.chinacloudapi.cn

    问题描述 App Service 配置 Application Settings 访问Storage Account.如下: { "name": "WEBSITE_CON ...

  2. Redisson 框架中的分布式锁

    实现分布式锁通常有三种方式:数据库.Redis 和 Zookeeper.我们比较常用的是通过 Redis 和 Zookeeper 实现分布式锁.Redisson 框架中封装了通过 Redis 实现的分 ...

  3. Postman/Jmeter工具实现接口测试,为什么还要用代码来实现接口自动化测试?

    这种工具包括一些开源框架最大缺点就是不够灵活,如果是单接口的测试还行,但是有的项目接口比较庞大和负责,这种情况下就不大适用工具(工具适用于小型项目,代码适用于中大型项目) 主要有以下几个原因: 1敏捷 ...

  4. 图片动态操作,利用SeekBar控制属性示例,适配屏幕解决方案

    需求为,让图片适配屏幕大小,并且可以用一个滑块来控制图片的旋转,用一个滑块来控制图片大小,核心语法思路,控制图片的大小, 核心语法为:mImageView.setLayoutParams(new Li ...

  5. 基于RocketMQ实现分布式事务

    背景 在一个微服务架构的项目中,一个业务操作可能涉及到多个服务,这些服务往往是独立部署,构成一个个独立的系统.这种分布式的系统架构往往面临着分布式事务的问题.为了保证系统数据的一致性,我们需要确保这些 ...

  6. gyroflow.xyz - 视频防抖 支持相机 gopro 不支持手机视频 - 软件推荐

    gyroflow.xyz - 视频防抖 支持相机 gopro 不支持手机视频 - 软件推荐 https://gyroflow.xyz/ https://github.com/gyroflow/gyro ...

  7. Nginx 打不开 80端口占用 netstat -aon|findstr "80" 看有没有80占用 有的话 net stop http

    Nginx 打不开 80端口占用 netstat -aon|findstr "80" 看有没有80占用 有的话 net stop http

  8. Docker 部署GitLabs 版本升级 13.9.x -> 15.3.x

    Gitlabs版本升级大版本不能直接跳级升级, 可以参考官方的升级路径.本人是从13.9.x需要升级到最新的15.3.x. 参考官方路径结合自己的实际情况成功升级. 13.9.0 -> 13.1 ...

  9. C++ 字面值的前缀和后缀

    一般字符字面值用前缀,数字字面值用后缀: --C++ Primer第五版2.1.3

  10. Miracast技术详解(三):RTP & MPEG2-TS

    目录 Miracast音视频流概述 抓包准备 RTP MPEG2-TS TS分组 适配域 PCR PID PSI PAT PMT PES 总结 Miracast音视频流概述 在上一篇文章中,我们已经成 ...