JavaTable:可编辑表格数据可视化组件

发布时间:2023-05-18

一、介绍

JavaTable是一种可编辑表格数据可视化组件,提供分页、排序、搜索、过滤和编辑等强大的数据交互功能。这个组件能够轻易地嵌入任何Java Swing应用程序中,帮助用户以最可视化的方式展示和编辑大量数据。

二、特点

JavaTable有以下特点:

  • 支持各种数据类型,如整数、浮点数、文本、日期、下拉菜单等;
  • 能够自定义单元格的渲染和编辑器,以适应不同的应用场景;
  • 支持列头和行头的固定,方便查看大量数据;
  • 支持多级排序,能够按多个字段排序数据;
  • 支持查找和替换功能,能够高效地找到和修改数据;
  • 支持过滤功能,能够根据条件过滤数据;
  • 支持导出数据为Excel、CSV等格式,方便数据分析和交换;
  • 支持通过拖拽等方式快速编辑数据;
  • 支持数据校验,能够确保数据的正确性。

三、组件使用

以下是JavaTable组件的使用方法:

1. 创建JavaTable实例

// 创建JavaTable实例
JavaTable table = new JavaTable(data, columns);
// 添加JavaTable到容器中
JScrollPane scroll = new JScrollPane(table);
frame.add(scroll);

其中,data是二维数组,表示表格中的数据,columns是一维数组,表示表格中的列。

2. 自定义单元格渲染和编辑器

JavaTable默认使用默认渲染器和编辑器来渲染和编辑单元格。如果需要自定义渲染器和编辑器,可以覆盖相应的方法,如下所示:

// 自定义单元格渲染器
public class MyRenderer extends DefaultTableCellRenderer {
  public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
    Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
    // 自定义渲染器代码
    return c;
  }
}
// 自定义单元格编辑器
public class MyEditor extends DefaultCellEditor {
  public MyEditor() {
    super(new JTextField());
  }
  public Component getTableCellEditorComponent(
      JTable table, Object value, boolean isSelected, int row, int column) {
    Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column);
    // 自定义编辑器代码
    return c;
  }
}
// 应用自定义渲染器和编辑器
table.setDefaultRenderer(Integer.class, new MyRenderer());
table.setDefaultEditor(String.class, new MyEditor());

3. 事件处理

JavaTable支持各种鼠标和键盘事件,如单击、双击、按键等。可以通过添加事件监听器来处理这些事件,如下所示:

table.addMouseListener(new MouseAdapter() {
  public void mouseClicked(MouseEvent e) {
    // 处理鼠标单击事件
  }
});
table.addKeyListener(new KeyAdapter() {
  public void keyPressed(KeyEvent e) {
    // 处理键盘按键事件
  }
});

4. 分页、排序、查找和过滤

JavaTable提供分页、排序、查找和过滤功能,可以通过以下方法来激活这些功能:

// 分页
table.setPageSize(10); // 每页显示10行数据
table.setPage(1); // 显示第一页数据
// 排序
table.setSortable(true); // 开启排序功能
table.setSortOrder(1, SortOrder.DESCENDING); // 按第1列进行降序排列
// 查找
table.setSearchable(true); // 开启查找功能
table.search("keyword"); // 查找包含"keyword"的数据
// 过滤
table.setFilterable(true); // 开启过滤功能
table.setFilter(1, new MyFilter()); // 使用自定义过滤器过滤第1列数据

四、示例代码

以下是一个JavaTable的完整示例代码:

import java.awt.Component;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.*;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumnModel;
public class JavaTableExample extends JFrame {
  public JavaTableExample() {
    // 创建JavaTable实例
    String[] columns = {"序号", "姓名", "年龄", "性别"};
    Object[][] data = {
        {1, "张三", 28, "男"},
        {2, "李四", 30, "女"},
        {3, "王五", 25, "男"}
    };
    JavaTable table = new JavaTable(data, columns);
    // 添加JavaTable到容器中
    JScrollPane scroll = new JScrollPane(table);
    add(scroll);
    // 自定义单元格渲染器
    table.setDefaultRenderer(Integer.class, new MyRenderer());
    // 自定义单元格编辑器
    table.setDefaultEditor(String.class, new MyEditor());
    // 添加单击事件处理
    table.addMouseListener(new MouseAdapter() {
      public void mouseClicked(MouseEvent e) {
        int row = table.getSelectedRow();
        int col = table.getSelectedColumn();
        Object value = table.getValueAt(row, col);
        System.out.println("cell value: " + value);
      }
    });
    // 添加键盘事件处理
    table.addKeyListener(new KeyAdapter() {
      public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_ENTER) {
          int row = table.getSelectedRow();
          int col = table.getSelectedColumn();
          Object value = table.getValueAt(row, col);
          System.out.println("cell value: " + value);
        }
      }
    });
    // 分页
    table.setPageSize(2); // 每页显示2条数据
    table.setPage(1); // 显示第1页数据
    // 排序
    table.setSortable(true); // 开启排序功能
    table.setSortOrder(2, SortOrder.ASCENDING); // 按第2列进行升序排列
    // 查找
    table.setSearchable(true); // 开启查找功能
    table.search("李四"); // 查找包含"李四"的数据
    // 过滤
    table.setFilterable(true); // 开启过滤功能
    table.setFilter(3, new GenderFilter("女")); // 过滤性别为"女"的数据
    // 设置表格列宽自适应
    TableColumnModel cm = table.getColumnModel();
    for (int i = 0; i < cm.getColumnCount(); i++) {
      cm.getColumn(i).setPreferredWidth(100);
    }
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setLocationRelativeTo(null);
    setSize(500, 300);
    setVisible(true);
  }
  class MyRenderer extends DefaultTableCellRenderer {
    public Component getTableCellRendererComponent(
        JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
      Component c = super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
      // 自定义渲染器代码
      return c;
    }
  }
  class MyEditor extends DefaultCellEditor {
    public MyEditor() {
      super(new JTextField());
    }
    public Component getTableCellEditorComponent(
        JTable table, Object value, boolean isSelected, int row, int column) {
      Component c = super.getTableCellEditorComponent(table, value, isSelected, row, column);
      // 自定义编辑器代码
      return c;
    }
  }
  class GenderFilter implements JavaTable.Filter {
    private String gender;
    public GenderFilter(String gender) {
      this.gender = gender;
    }
    public boolean accept(Object value) {
      if (value == null) return false;
      return value.toString().equals(gender);
    }
  }
  public static void main(String[] args) {
    new JavaTableExample();
  }
}