Jtable 对数据适配 (1) Jtable 与 TableModel AbstractTableModel模型 JTable适配数据方法 : JTable类可以将实现了TableModel抽象类的数据显示到图形界面中 类, AbstractTableModel 继承了 TableModel 类, 并实现了绝大部分方法, 我们可以定义一个类 去 继承 AbstractTableModel 类, 并实现我们感兴趣的方法 , 不必实现所有的方法了; 数据封装 : 创建一个类 继承 AbstractTableModel 类, 然后呢实现感兴趣的接口; (2) 实例 实现过程 : 使用JTable 绘制坦克相关数据, 需要创建一个 TankTableModel类 继承 AbstractTableModel 类, 然后将 Tank 类封装在 TankTableModel 中, 当做其成员变量; 使用对象适配的原因 : AbstractTableModel ; public class TankTableModel extends AbstractTableModel { private Tank tanks[]; private String names
而DefaultTableModel有事继承了AbstractTableModel,所以我们平时如果自定义model的话,都会去继承AbstractTableModel的。 我们在去源码里可以看见,我们会发现AbstractTableModel有事继承TableModel这个接口的。所以我们的所有方法都是源于他。 我们观察AbstractTableModel源码中注释发现,我们只需要继承AbstractTableModel类后只需要实现三个必须的方法,其他的方法根据需要实现public int getRowCount > getColumnClass(int columnIndex) { return Object.class; }源码中AbstractTableModel的getColumnClass 但是这个类不能反回控件需要和TableCellEditor结合使用,或者我们只是用另外一个基础类DefaultCellEditor,DefaultCellEditor和AbstractTableModel
如果需要使用自定义模型,则需要将其提供给JTable构造函数,如以下示例代码所示: JTable table = new JTable(new MyTableModel()); 要定义表模型,程序员需要创建一个扩展AbstractTableModel 类的类: class MyTableModel extends AbstractTableModel{ } 在表模型中,可以包括行和列名的数据,如前面的JTable示例所示。 为了确保表模型类是一个具体的类,您需要实现AbstractTableModel的以下三个方法: public int getRowCount(); public int getColumnCount() frame.setLocationRelativeTo(null); frame.setVisible(true); } } class MyTableModel extends AbstractTableModel
例如,要建立一个包含10行10列数字的表: TableModel dataModel = new AbstractTableModel(){ Public int getColumnCount(){返回 确定是使用AbstractTableModel还是DefaultTableModel的一个很好的经验法则是 将AbstractTableModel用作创建子类的基类 而在不需要子类化时使用DefaultTableModel removeTableModelListener(TableModelListener l); } JRE 中常用的已实现 TableModel 接口的类有两个: (1)javax.swing.table.AbstractTableModel 要创建一个具体的 TableModel 作为 AbstractTableModel 的子类,只需提供对以下三个方法的实现: public int getRowCount(); public int getColumnCount
metadata about a table in a jdbc database */ public class JDBCTableModel extends AbstractTableModel contents.length + " rows"); // close stuff results.close(); statement.close(); } // AbstractTableModel column) { return contents [row][column]; } // overrides methods for which AbstractTableModel
public String cMethod(String arg){ return arg.toUpperCase(); } } AbstractTableModel.java java.io.IOException; import java.io.Serializable; import java.util.HashMap; public class AbstractTableModel implements Serializable { private HashMap<String, IFn> __clojureFnMap; public AbstractTableModel Step5 搜索生成调用链 在gadget-chains.txt中找到了如下链: com/demo/model/AbstractTableModel.hashCode()I (0) com/demo this.cmd = (String) arg; return this + " test"; } } 结果: com/demo/model/AbstractTableModel.hashCode
从图中可以看到AbstractTableModel$ff19274a正好实现了hashCode方法,其中又调用了f.invoke方法,f是IFn对象,并且f能通过属性__clojureFnMap获取到。 FnCompose的一个对象,那么就能控制f.invoke走FnCompose.invoke方法,接着控制FnCompose.invoke中的f1、f2为FnConstant就能到达FnEval.invoke了(关于AbstractTableModel Payload使用JSON格式表示如下: { "@class":"java.util.HashMap", "members":[ 2, { "@class":"AbstractTableModel AbstractTableModel$ff19274a.hashcode与子方法IFn.invoke: •AbstractTableModel$ff19274a.hashcode的this(0参)传递给了 __clojureFnMap(0参)获取的,而f又为IFn.invoke()的this(0参),即AbstractTableModel$ff19274a.hashcode的0参传递给了IFn.invoke
new AgentClinet(); } } MyTabelModel.java package com.my.agent.client; import javax.swing.table.AbstractTableModel ; public class MyTabelModel extends AbstractTableModel{ private static final long serialVersionUID
import javax.swing.JTextField; 26 import javax.swing.plaf.OptionPaneUI; 27 import javax.swing.table.AbstractTableModel break; 157 } 158 } 159 160 } 161 162 // 定义一个自己的table类 163 class MyJTable extends AbstractTableModel
textLabel;// 标题显示标签 private JLabel InfoLabel;// 个人信息显示标签 private JTable daysTable; // 日表格 private AbstractTableModel BorderLayout.SOUTH);// 添加个人信息显示面板到日历面板南方(下方) InfoPanel.add(InfoLabel);// 添加信息标签文本标签到面板 daysModel = new AbstractTableModel
WIDTH = 600; private static final int HEIGHT = 300; } class InvestmentTableModel extends AbstractTableModel the rows so that the entries in a particular column are sorted. */ class SortFilterModel extends AbstractTableModel values, rendering and editing properties * for the planet data. */ class PlanetTableModel extends AbstractTableModel
命令执行载体:clojure.corecompfn__4727 反序列化载体:HashMap HashMap.readObject()反序列化各元素时,通过它的hashCode()得到hash值,而AbstractTableModel