返回信息流如题 实现这张图上第二列所显示的情况
这是一条镜像帖。来源:北邮人论坛 / java / #19159同步于 2011/6/28
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖
请教:如何给同一列不同行的单元格添加不同的cellEditor
laiven
2011/6/28镜像同步5 回复
订阅后,新回复会通过你的通知中心匿名送达。
5 条回复
想实现一个属性编辑器,用TreeViewer的多列功能,第一列为属性名,第二列为属性值。属性值中有的是文本,有的是复合属性,即要用下拉列表框实现的,请问如何在一列中实现呢?我看CellEditor都是针对一列的,如
CellEditor[] cellEditors = new CellEditor;
cellEditors[0] = new TextCellEditor();//第一列为文本
cellEidtors[1] = new ComboBoxCellEditor();//第二列为下拉列表框
怎么能让一列中既有TextCellEditor又有ComboBoxCellEditor啊?其他方式也可以
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());