swing表格的自定义TableModel
TableModel和监听器 与JList、JTree类似的是,JTable采用了TableModel来保存表格中的所有状态数据:与ListModel类似的是,TableModel也不强制保存该表格显示的数据。虽然在前面程序中看到的是直接利用一个二维数组来创建JTable对象,但也可以通过TableModel对象来创建表格
自定义TableModel步骤:
1、自定义类,继承AbstractTableModel抽象类,重写下面几个方法:
方法 | 作用 |
---|---|
int getColumnCount() | 返回表格列的数量 |
int getRowCount() | 返回表格行的数量 |
Object getValueAt(int rowIndex, int columnIndex) | 返回rowIndex行,column列的单元格的值 |
String getColumnName(int columnIndex) | 返回columnIndex列的列名称 |
boolean isCellEditable(int rowIndex, int columnIndex) | 设置rowIndex行,columnIndex列单元格是否可编辑 |
setValueAt(Object aValue, int rowIndex, int columnIndex) | 设置rowIndex行,columnIndex列单元格的值 |
2、创建自定义类对象,根据该对象,创建JTable对象
swing表格的自定义TableModel_练习
xxxxxxxxxx
package ch30;
import javax.swing.*;
import javax.swing.table.AbstractTableModel;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
public class a_33_0swing_表格_自定义TableModel {
JFrame jf = new JFrame("TableModel演示");
//我们前几节课都是使用了两个数组来封装数据,这节课就来学习使用TableModel来封装数据
//创建一维数组,存储标题
Object[] titles = {"姓名", "年龄", "性别"};
//创建二维数组,存储数据
Object[][] data = {
new Object[]{"张三", 18, "男"},
new Object[]{"李四", 17, "男"},
new Object[]{"小华", 19, "女"},
new Object[]{"小红", 16, "女"},
new Object[]{"王五", 15, "男"},
};
//如何通过Vector来创建JTable,如下
private Vector titlesV = new Vector();//存储标题
private Vector<Vector> dataV = new Vector<>();//存储数据
//组装视图
public void init(){
//把写好的一维数组里面的数据放到Vector集合里面
for (int i = 0; i < titles.length; i++) {
titlesV.add(titles[i]);
}
//把写好的二维数组里面的数据放到Vector集合里面
for (int i = 0; i < data.length; i++) {
Vector t = new Vector<>();
for (int j = 0; j < data[i].length; j++) {
t.add(data[i][j]);
}
dataV.add(t);
}
//下面那行是之前的写法,如何用TableModel来写呢,首先我们需要创建一个自定义TableModel,即MyTableModel(名字是自己取的)类
//JTable jTable = new JTable(dataV, titlesV);
//当自定义好TableModel之后即MyTableModel类,用下一行来创建JTable
MyTableModel myTableModel = new MyTableModel();
JTable jTable = new JTable(myTableModel);
jf.add(new JScrollPane(jTable));
//如果还想要获取用户点击了那一行,如下
JButton btn = new JButton("获取选中行数据");
//给按钮注册监听事件
btn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//获取用户选中的列号
int selectedColumn = jTable.getSelectedColumn();
//获取用户选中的行号
int selectedRow = jTable.getSelectedRow();
System.out.println("当前选中行的索引:"+selectedRow);
System.out.println("当前选中列的索引:"+selectedColumn);
//获取当前选中行的第一个单元格的值
Object value = myTableModel.getValueAt(selectedRow, selectedColumn);
System.out.println("当前选中行的第一个单元格的内容:"+value);
}
});
//把按钮添加到窗口的南部
jf.add(btn, BorderLayout.SOUTH);
jf.pack();
jf.setVisible(true);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//自定义TableModel为MyTableModel,通过重写AbstractTableModel里面的方法来实现
private class MyTableModel extends AbstractTableModel{
//获取行的数量
public int getRowCount() {
return dataV.size();
}
//获取列的数量
public int getColumnCount() {
return titlesV.size();
}
//获取某个单元格的内容
public Object getValueAt(int rowIndex, int columnIndex) {
return dataV.get(rowIndex).get(columnIndex);
}
//获取列的名称
public String getColumnName(int column) {
return (String) titlesV.get(column);//需要的是String类型,我们的column是Object类型,解决:把column强转为String
}
//当前单元格是否可编辑
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
}
public static void main(String[] args) {
new a_33_0swing_表格_自定义TableModel().init();
}
}