出现什么这个是由当前的 cell editor/render 决定的。
先说说,当不是编辑状态时,格子中的数据显示出来的过程中”Rendering" 煊染,这时表格准备显示一个单元格之前会询问这个 Table 当前格子的 cell render 是什么,默认地在我们没有定制时它会回答“这个格子的 render 是 JLabel ”,这时就会用 JLabel 来显示数据,也就是显示成了灰色的文本,当我们定制过了 Render 之后假设我们希望是 checkbox 我们回答是 Checkbox 后需要我们把传入的 true/false/Y/N 值转换成 checkbox 的状态,同样道理如果是下拉框也是类似的转换过程。
再说说,当编辑状态时,当我们用鼠标点击一个单元格,表格接到事件后会询问当前单元格是否允许编辑,当不允许时什么都不做,当允许时,它会再询问当前单元格的 cell editor 是什么?我们回答 checkbox 时我们就把值转换成 checkbox 的选中与不选中的状态再返回它,这时表格就把一个 checkbox 显示出来了。
从上面两点,我们明白了,每次 table cell render 或 table cell editor 调用 getCellRender (table, row, column) 或 getCellEditor (table, row, column) 时我们根据 row / column 这两个坐标值知道是哪个单元格然后决定是用什么 render 或 editor 就可以了。
JTable table;
table.setCellEditor(xxx);
table.setDefaultRenderer(Object.class, yyy);
之后你的 xxx 和 yyy 就应该在下次 xxx.getCellEditor(table, row, column) 和 yyy.getCellRender(table, row, column); 时实现剩下的部分功能来返回期望的 cell editor 和 cell render 组件了。
默认的 table.setDefaultRender(Class, yyy); 是根据数据 class 来决定 render); 你可以在 boolean 类型的格子时把数据先转换成 boolean 类型,而在 String 格子把数据先转换成 String 类型而不是把所有数据都当成 String 或 Boolean,转换后的数据都放在Vector中再创建表格它就会知道显示成什么,但这依然不是根据条件定制的;完整意义上的定制依然是自己实现一个定制的 TableCellEditor 和 TableCellRenderer
你回答说 Cell Editor 是 checkbox 时表格中就会出现勾选框,回答 JTextField 时就是文本输入框。