当前位置:首页 > 行业动态 > 正文

defaulttablemodel api

DefaultTableModel 是 Java Swing 中用于表格模型的类,提供数据存储和事件通知功能。

DefaultTableModel API 详解

一、

DefaultTableModel 是 Java Swing 库中用于创建和管理表格模型的类,它继承自AbstractTableModel,为表格提供了数据存储和操作的基本功能,是构建表格组件(如JTable)时常用的数据模型类,通过使用DefaultTableModel,可以方便地对表格中的数据进行增删改查等操作,并且能够自动处理与表格视图之间的数据同步。

二、构造方法

1、DefaultTableModel():创建一个默认的表格模型,没有列名和行数据,需要后续手动添加列名和行数据。

2、 :使用给定的二维数组data 作为行数据,一维数组columnNames 作为列名来创建表格模型。

Object[][] data = {
    {"John", "Doe", 25},
    {"Jane", "Smith", 30}
};
Object[] columnNames = {"First Name", "Last Name", "Age"};
DefaultTableModel model = new DefaultTableModel(data, columnNames);

这将创建一个包含两行三列数据的表格模型,列名分别为“First Name”、“Last Name”和“Age”。

三、常用方法

1、获取数据相关方法

:获取指定单元格(由行号row 和列号column 确定)中的数据对象。

 Object value = model.getValueAt(0, 1); // 获取第一行第二列的数据

getRowCount():返回表格模型中的行数。

getColumnCount():返回表格模型中的列数。

2、设置数据相关方法

:设置指定单元格(由行号row 和列号column 确定)的数据为aValue

 model.setValueAt("New Age", 0, 2); // 将第一行第三列的数据设置为“New Age”

:向表格模型中添加一行数据,rowData 是一个包含该行各列数据的数组。

 model.addRow(new Object[]{"Alice", "Green", 28});

:在指定行号row 的位置插入一行数据,rowData 是新行的数据数组。

:删除指定行号row 所在的行。

setDataVector(Vector<? extends Vector> dataVector, Vector<Object> columnIdentifiers):设置表格模型的数据向量和列标识符向量,用于批量更新表格数据和列名。

3、列操作相关方法

:返回指定列中所有单元格数据的通用Class 对象,通常用于确定该列数据的类型,以便在渲染表格时选择合适的渲染器。

 Class<?> columnClass = model.getColumnClass(0); // 获取第一列的数据类型

getColumnName(int column):返回指定列的列名。

setColumnIdentifiers(Vector<Object> columnIdentifiers):设置表格模型的列标识符向量,即列名列表。

4、事件监听相关方法

addTableModelListener(TableModelListener l):为表格模型添加一个监听器,当表格数据发生变化时,监听器会收到通知并执行相应的操作。

 model.addTableModelListener(new TableModelListener() {
        @Override
        public void tableChanged(TableModelEvent e) {
            // 处理表格数据变化的逻辑
            System.out.println("Table data changed!");
        }
    });

四、示例代码

以下是一个简单的使用DefaultTableModel 创建和操作表格的示例:

import javax.swing.;
import javax.swing.table.DefaultTableModel;
public class TableModelExample {
    public static void main(String[] args) {
        JFrame frame = new JFrame("DefaultTableModel Example");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(400, 300);
        // 创建表格模型
        Object[][] data = {
            {"John", "Doe", 25},
            {"Jane", "Smith", 30}
        };
        Object[] columnNames = {"First Name", "Last Name", "Age"};
        DefaultTableModel model = new DefaultTableModel(data, columnNames);
        // 创建表格并设置模型
        JTable table = new JTable(model);
        // 添加按钮用于添加行数据
        JButton addButton = new JButton("Add Row");
        addButton.addActionListener(e -> {
            model.addRow(new Object[]{"Tom", "Brown", 22});
        });
        // 布局设置
        frame.setLayout(new BorderLayout());
        frame.add(new JScrollPane(table), BorderLayout.CENTER);
        frame.add(addButton, BorderLayout.SOUTH);
        frame.setVisible(true);
    }
}

在这个示例中,创建了一个包含两行数据的表格模型,并将其设置为JTable 的数据模型,同时添加了一个按钮,点击按钮后会在表格中添加一行新的数据。

五、相关问答FAQs

1、问题:如何修改DefaultTableModel 中某一行的多个单元格数据?

回答:可以使用循环结合setValueAt 方法来修改一行中的多个单元格数据,要修改第i 行的多个单元格数据,可以这样写:

Object[] newRowData = {"New Value 1", "New Value 2", "New Value 3"};
for (int j = 0; j < newRowData.length; j++) {
    model.setValueAt(newRowData[j], i, j);
}

i 是行号,newRowData 是包含新数据的数组,j 是列号。

2、问题:如何在DefaultTableModel 中根据条件筛选数据并显示在表格中?

回答:可以通过遍历原始数据,将符合条件的数据添加到一个新的DefaultTableModel 中,然后将这个新的模型设置为表格的数据模型,假设有一个包含人员信息的表格模型,要筛选出年龄大于 25 岁的人员并显示在表格中,可以这样做:

DefaultTableModel filteredModel = new DefaultTableModel(columnNames, 0);
for (int i = 0; i < model.getRowCount(); i++) {
    int age = (Integer) model.getValueAt(i, 2); // 假设年龄在第三列
    if (age > 25) {
        filteredModel.addRow(new Object[]{model.getValueAt(i, 0), model.getValueAt(i, 1), model.getValueAt(i, 2)});
    }
}
JTable filteredTable = new JTable(filteredModel);
// 将 filteredTable 添加到界面中展示即可

这里首先创建了一个新的空的DefaultTableModel,然后遍历原始模型的每一行,判断年龄是否符合条件,如果符合则将该行的数据添加到新的模型中,最后用新的模型创建表格并展示。