经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
java switch 自定义表格的渲染和编辑示例
来源:cnblogs  作者:Mysticbinary  时间:2024/4/10 15:14:43  对本文有异议


不管是什么编程语言,都已经内置好很多典型的前端组件给你使用,使用这些默认组件基本能完成80%的工作了,但是还是有些独特的需求完成不了,比如点击一个按钮,按钮按下要出现五彩斑斓的背景阴影,这种就需要对组件进行自定义了。

下面使用Java语言作演示,解决一个需要在一个表格里面嵌套一个复选框的功能,主要起一个抛砖引玉的效果。

正常使用表格

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

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

show:
image

自定义表格样式

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

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

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

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

数据准备:

  1. // 加载数据
  2. private Object[][] data = {
  3. {1, true, "file1.txt"},
  4. {2, false, "file2.pdf"},
  5. {3, true, "file3.doc"}
  6. };
  7. // 设置表格列名
  8. private String[] columnNames = {"ID", "Available", "File Name"};

自定义Model

  1. // 定义表格模型
  2. // FileTableModel 继承自 AbstractTableModel,用于自定义表格模型
  3. private class FileTableModel extends AbstractTableModel {
  4. @Override
  5. public int getRowCount() {
  6. // 返回表格中的行数,通过获取 data 数组的长度
  7. return data.length;
  8. }
  9. @Override
  10. public int getColumnCount() {
  11. // 返回表格中的列数,通过获取 columnNames 数组的长度
  12. return columnNames.length;
  13. }
  14. @Override
  15. public Object getValueAt(int rowIndex, int columnIndex) {
  16. // 返回指定单元格的值,通过访问 data 数组中相应的位置
  17. return data[rowIndex][columnIndex];
  18. }
  19. @Override
  20. public String getColumnName(int column) {
  21. // 返回指定列的列名,通过访问 columnNames 数组中相应的位置
  22. return columnNames[column];
  23. }
  24. @Override
  25. public Class<?> getColumnClass(int columnIndex) {
  26. // 指定哪些单元格可以编辑,这里设置只有第二列(columnIndex == 1)可以编辑
  27. return getValueAt(0, columnIndex).getClass();
  28. }
  29. @Override
  30. public boolean isCellEditable(int rowIndex, int columnIndex) {
  31. // 指定哪些单元格可以编辑,这里设置只有第二列(columnIndex == 1)可以编辑
  32. return columnIndex == 1;
  33. }
  34. @Override
  35. public void setValueAt(Object value, int rowIndex, int columnIndex) {
  36. // 设置指定单元格的值,并通知表格该单元格数据已经更新
  37. data[rowIndex][columnIndex] = value;
  38. fireTableCellUpdated(rowIndex, columnIndex);
  39. }
  40. }

渲染器代码:

  1. // 定义渲染器,用于渲染第二列的复选框
  2. // AvailableRenderer 是一个自定义的渲染器,用于渲染 JTable 中的复选框单元格
  3. // 它继承自 JCheckBox 并实现 TableCellRenderer 接口
  4. private class AvailableRenderer extends JCheckBox implements TableCellRenderer {
  5. // 构造函数,用于初始化渲染器
  6. public AvailableRenderer() {
  7. // 设置复选框在单元格中水平居中
  8. setHorizontalAlignment(SwingConstants.CENTER);
  9. }
  10. // 重写此方法,用于自定义渲染单元格的行为
  11. @Override
  12. public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
  13. // 根据传入的值设置复选框的选中状态
  14. setSelected((Boolean) value);
  15. // 将复选框设置为可用状态,以便能够正确渲染
  16. setEnabled(true);
  17. // 根据当前单元格是否被选中,设置复选框的背景色
  18. // 如果被选中,则使用表格的选中行背景色
  19. // 否则使用表格的默认背景色
  20. setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
  21. // 返回当前 JCheckBox 实例,作为渲染的组件
  22. return this;
  23. }
  24. }

编辑器代码:

  1. // 定义编辑器,用于编辑第二列的复选框
  2. private class AvailableEditor extends DefaultCellEditor implements ItemListener {
  3. private JCheckBox checkBox;
  4. private int editingRow;
  5. public AvailableEditor(JCheckBox checkBox) {
  6. super(checkBox);
  7. this.checkBox = checkBox;
  8. this.checkBox.addItemListener(this);
  9. }
  10. @Override
  11. public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
  12. editingRow = row; // 记录当前编辑的行号
  13. checkBox.setSelected((Boolean) value);
  14. return checkBox;
  15. }
  16. @Override
  17. public Object getCellEditorValue() {
  18. return checkBox.isSelected();
  19. }
  20. @Override
  21. public void itemStateChanged(ItemEvent e) {
  22. super.fireEditingStopped();
  23. System.out.println("-----"); // 打印"123"
  24. int id = (int) data[editingRow][0]; // 获取ID
  25. String fileName = (String) data[editingRow][2]; // 获取文件名
  26. System.out.println("ID: " + id + ", File Name: " + fileName);
  27. }
  28. }

shwo:
image

原文链接:https://www.cnblogs.com/mysticbinary/p/18124542

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号