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_练习
xxxxxxxxxxpackage 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(); }
}