java实现自定义表格渲染和编辑

 更新时间:2024年04月10日 14:16:13   作者:Mysticbinary  
这篇文章主要为大家详细介绍了java如何实现自定义表格渲染和编辑,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下

正常使用表格

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

// 创建 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实现自定义表格渲染和编辑的文章就介绍到这了,更多相关java自定义表格内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Springboot内置的工具类之CollectionUtils示例讲解

    Springboot内置的工具类之CollectionUtils示例讲解

    这篇文章主要介绍了Springboot内置的工具类之CollectionUtils,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-12-12
  • Maven dependencyManagement元素标签的具体使用

    Maven dependencyManagement元素标签的具体使用

    在Maven中dependencyManagement的作用其实相当于一个对所依赖jar包进行版本管理的管理器,本文主要介绍了Maven dependencyManagement元素标签的具体使用,感兴趣的可以了解一下
    2024-03-03
  • 常用的Java数据结构知识点汇总

    常用的Java数据结构知识点汇总

    这篇文章主要介绍了常用的Java数据结构知识点汇总,数据结构分线性数据结构和非线性数据结构,下面对此作详细介绍,需要的小伙伴可以参考一下,希望对你的学习或工作有所帮助
    2022-03-03
  • 一文详解Java如何创建和销毁对象

    一文详解Java如何创建和销毁对象

    Java由Sun Microsystems发明并在1995年发布,是世界上使用最广泛的编程语言之一。本文主要和大家介绍一下Java是如何创建和销毁对象的,希望对大家有所帮助
    2022-11-11
  • java学习教程之常量折叠详解

    java学习教程之常量折叠详解

    这篇文章主要给大家介绍了关于java学习教程之常量折叠的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用java具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-09-09
  • Java实现KFC点餐系统过程解析

    Java实现KFC点餐系统过程解析

    这篇文章主要介绍了Java实现KFC点餐系统过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • java.lang.NullPointerException出现的几种原因及解决方案

    java.lang.NullPointerException出现的几种原因及解决方案

    这篇文章主要介绍了java.lang.NullPointerException出现的几种原因及解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05
  • Springboot启动后立即某个执行方法的四种方式

    Springboot启动后立即某个执行方法的四种方式

    spring项目如何在启动项目是执行一些操作,在spring中能通过那些操作实现这个功能呢,下面这篇文章主要给大家介绍了关于Springboot启动后立即某个执行方法的四种方式,需要的朋友可以参考下
    2022-06-06
  • 详解springSecurity之java配置篇

    详解springSecurity之java配置篇

    这篇文章主要介绍了详解springSecurity之java配置篇,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java Socket编程(四) 重复和并发服务器

    Java Socket编程(四) 重复和并发服务器

    Java Socket编程(四) 重复和并发服务器...
    2006-12-12

最新评论