浅析JTable与TableModel、TableCellRenderer、TableCellEditor接口——使用JComboBox显示单元格的值
如同其它的Swing组件,JTable使用MVC(模型、试图、控制器)设计方式,将可视化组件(JTable实例)从其数据(TableModel实现)中分离出来。
·TableModel接口
1、TableModel为JTable提供
·显示的数据
·表格的维数
·表格中每一列所包含的数据类型
·应该显示的列标题
·是否允许编辑指定单元格的值
2、实现TableModel:
TableValues类
SimpleTableTest类
运行结果:
·实现TableCellRenderer(单元格渲染器)接口
1、使表格“性别”一列的单元格出现JComboBox组件
GenderRenderer类
2、把SimpleTableTest类的构造函数改变如下:
运行结果:
3、注意:渲染器实际上并没有像可视化组件添加到Container中那样添加到JTable实例中,即表格中不含有JComboBox实例。此时,是将唯一的JComboBox实例绘制(通过向paint()方法传递Graphics对象)到“性别”一列的每一个单元格所占用的区域中。
4、在TableValues添加如下代码(覆盖AbstractTableModel中的方法),使得JTable实例中单元格可以编辑:
然而此时对“性别”一列的单元格进行编辑,会出现如下情况:
这就得使用到单元格编辑器了。
·实现TableCellEditor(单元格编辑器)接口
1、
2、把SimpleTableTest类的构造函数中
后面加入:
运行结果:
3、还有一点别忘了再在TableValues加入如下代码(原因:看第4的最后一点)
4、GenderEditor类的工作流程:
1)、调用TableCellEditor接口中的getTableCellEditorComponent()方法初始化编辑
2)、编辑当前的单元格,再点击另一个单元格时,调用CellEditor中的stopCellEditing(),通过fireEditingStopped()调用到editingStopped()。
3)、在editingStopped方法中,JTable调用getCellEditorValue()取回单元格的值,并且把这个值传递给TableValues(TableModel)的setValueAt()