一、介绍
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(); } }