求救,Swing中我实现TableCellEditor给JTable的一列添加了一个编辑器
这跟你在 getEditorComponent 中返回的是不是同一个对象有关系。
首先,我们确实只需要同一个 Editor component,从 Cell Editor 的设计来看,它应该是一个 Stateless 无状态组件,也就是说每次一个生命周期完成之后,它的状态值不应该在下一次新的生命周期中被使用,而是应该完全重新重置状态。
Table 的一个 cycle 是这样的:
当表格刚显示时它会问每一行每一列 getCellRender 是什么,默认是得到一个 JLabel,它用这个 JLabel 赋值后显示出来,然后移动到下一个格式做同样的事情,这里的 JLabel 是同一个,只是在准备显示出来之前把当前格式的值更新上去。
当焦点落到某个格子时首先是询问 cell editor 这个格子是否 isEditable,如果不是,什么都不做,如果是的话,它的 getTableCellEditorComponent() 后设置值然后弹出来让用户输入新值。当验证值正确时会提交到 table model 中去,并且重新用 cell render 来显示它并关掉 cell editor。
这上面就是一个普通的生命周期。在 cell editor component 显示出来到用完了消失这个过程是完整的一次,它可以在这个周期内保持状态值,但在两个这样的周期之间它不应该交换状态值。
你希望每行编辑时看到的效果是不一样的,那么你应该做到 getTableCellEditorComponent 时来决定这个 JComponent 是什么样的,可以给每个不同的类型提供一个 cell editor component,然后在知道每行类型之后选择其中一个类型的 cell editor component 返回了。记得每次 getTableCellEditorComponent 时必须把跟数据有关系的状态重置,getTableCellEditorComponent 返回的 JComponent 在将要显示出来时应该是根据你设定的参数来显示的,这个过程是推迟了的因此它的参数需要记录在这个 JComponent 中,或者本身有一个 CardLayout 布局的多个不同的组件,在我们 getTableCellEditorComponent 时设定它当前要显示出来的组件是什么 。