首页 > 编程语言 >java switch 自定义表格的渲染和编辑示例

java switch 自定义表格的渲染和编辑示例

时间:2024-04-10 11:12:50浏览次数:26  
标签:java 自定义 表格 示例 int columnIndex Override public

目录


正常使用表格

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

// 创建 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:
image

自定义表格样式

// 创建 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:
image

标签:java,自定义,表格,示例,int,columnIndex,Override,public
From: https://www.cnblogs.com/mysticbinary/p/18124542

相关文章

  • 基于Springboot+Vue的Java项目-月度员工绩效考核管理系统(附演示视频+源码+LW)
    大家好!我是程序员一帆,感谢您阅读本文,欢迎一键三连哦。......
  • 力扣78 子集 Java版本
    文章目录题目描述代码注意题目描述给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。示例1:输入:nums=[1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]示例2......
  • 力扣51 N皇后 Java版本
    文章目录题目描述代码题目描述按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n皇后问题研究的是如何将n个皇后放置在n×n的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数n,返回所有不同的n皇后问题的解决方案。每......
  • Java面试题-13Spring
    1、事务管理spring事务分为编程式事务和声明式事务Spring事务管理器的行为的重要组成部分。下面是对这些属性的简要解释:1.**value**:用于指定事务管理器的名称。如果应用中只有一个事务管理器,通常可以省略该属性。2.**propagation**:指定事务的传播机制,即在多个事务方法相互调......
  • java synchronized 还是用redis 锁 java的synchronized的实现原理
    synchronized是同步的意思,在java多线程中,我们一般会考虑共享数据的处理,共享数据的处理包含两块,第一是共享数据,第二是在多线程访问共享数据的时候,如果处理共享数据,保证数据的有效正确性。我们要保证线程A访问共享数据,对数据进行处理的时候,其他线程能够等待线程A访问完毕后,和线程A看......
  • 基于java+springboot+vue实现的农产品智慧物流系统(文末源码+Lw)23-239
    摘 要互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱,出错率高,信息安全性差,劳动强度大,费时费力等问题,采用农产品智慧物流系统可以有效管理,使信息管......
  • 基于java+springboot+vue实现的人事管理系统(文末源码+Lw)23-242
    摘 要使用旧方法对人事管理系统的信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运用在人事管理系统的管理上面可以解决许多信息管理上面的难题,比如处理数据时间很长,数据存在错误不能及时纠正等问题。这次开发的人事管理系统对字典管理、公告管理、绩效管理、......
  • IDEA打包JavaWeb项目
    1.File->ProjectStructure2.Artifacts->"+"->WebApplicationExploded->FromModules弹框选择对应Module,点击ok3."+"->WebApplicationArchive->For'xxx:warexploded'->最后点击"OK"4.Build->Build......
  • Java 动态代理给对象插入动态属性
    packagecom.gwm.gwmcenterbudget.projectbudget.client.api.dto;importcom.google.common.collect.Maps;importnet.sf.cglib.beans.BeanGenerator;importnet.sf.cglib.beans.BeanMap;importorg.apache.commons.beanutils.PropertyUtilsBean;importorg.slf4j.Logge......
  • 详解Java Chassis 3与Spring Cloud的互操作
    本文分享自华为云社区《JavaChassis3技术解密:与SpringCloud的互操作》,作者:liubao68。JavaChassis3一个很重要的设计原则:利用架构的韧性设计来解决兼容性问题。比如通过引入微服务网关,来解决不同语言、不同框架、遗留系统之间的互操作问题。本文在这个架构原则基础上,讨论......