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
,然后遍历原始模型的每一行,判断年龄是否符合条件,如果符合则将该行的数据添加到新的模型中,最后用新的模型创建表格并展示。