BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #19159同步于 2011/6/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

请教:如何给同一列不同行的单元格添加不同的cellEditor

laiven
2011/6/28镜像同步5 回复
如题 实现这张图上第二列所显示的情况
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
zhhxxx机器人#1 · 2011/6/28
POI? swing?
laiven机器人#2 · 2011/6/28
swt/jface
zhhxxx机器人#3 · 2011/6/28
不懂
laiven2机器人#4 · 2011/6/30
想实现一个属性编辑器,用TreeViewer的多列功能,第一列为属性名,第二列为属性值。属性值中有的是文本,有的是复合属性,即要用下拉列表框实现的,请问如何在一列中实现呢?我看CellEditor都是针对一列的,如 CellEditor[] cellEditors = new CellEditor; cellEditors[0] = new TextCellEditor();//第一列为文本 cellEidtors[1] = new ComboBoxCellEditor();//第二列为下拉列表框 怎么能让一列中既有TextCellEditor又有ComboBoxCellEditor啊?其他方式也可以
fykhlp机器人#5 · 2011/6/30
jtable是显示和数据相分离的,它接收固定形式的数据,比如数字、字符串,然后允许你以不同的方式渲染出来。如数字50,你可以直接显示数字50,也可以将它当作一个范围为0-100的进度条的值从而在界面上显示一个已完成一半的进度条。cellEditor是简单的渲染器,无法实现你要的这种功能,你需要自定义自己的渲染器。 渲染器应该继承DefaultTableCellRenderer,然后实现里面的getTableCellRendererComponent函数。在这个函数里,你可以根据数据类型来返回不同的组件,如jlable或jcombox。函数返回的组件就是在table上显示出来的效果。 这里提供一个示例 //JTable渲染器 class MyTableCell extends DefaultTableCellRenderer { private static final long serialVersionUID = 1L; public MyTableCell() { } /* *参数table就是你绑定的table *value是当前单元格的值 *isSelected指示该单元格是否被选中 *hasFocus指该单元格是否有焦点 *row表示当前单元格的行,column表示当前单元格的列 */ public Component getTableCellRendererComponent(JTable table, Object value,boolean isSelected,boolean hasFocus, int row,int column) { JLabel label = new JLabel("",JLabel.center); JComboBox comboBox = null; if(value != null) { if(value instanceof String)//处理文本 { label.setText(value.toString); if(isSelected) { //do something } else { //do something } return label; } if(value instanceof String[])//处理复合属性,这里的复合属性类型要看你是怎么传递进来的 { //deal with JComboBox comboBox = new JComboBox((String[])value); if(isSelected) { //do something } else { //do something } return comboBox; } } return label;//值为null时返回空标签 } } ------------------------- 这样使用它 String[] title = new String[]{ "属性名", "属性值" }; DefaultTableModel dtm = new DefaultTableModel(title,0) { private static final long serialVersionUID = 1L; public boolean isCellEditable(int row, int column) { return false; } }; JTable tabel = new JTable(dtm); tabel.getColumnModel().getColumn(1) .setCellRenderer(new MyTableCell());