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