【发布时间】:2011-05-18 01:04:34
【问题描述】:
我有一个使用 Object[][] 数组填充的 DefaultTableModel。
现在我想添加一个带有复选框的列并执行相应的操作。
当我将复选框添加到 Object[][] 数组并查看它时,会显示文本
'javax.swing.JCheckBox[,0,0,0x0....',如何让它显示一个复选框并向其添加操作?
【问题讨论】:
我有一个使用 Object[][] 数组填充的 DefaultTableModel。
现在我想添加一个带有复选框的列并执行相应的操作。
当我将复选框添加到 Object[][] 数组并查看它时,会显示文本
'javax.swing.JCheckBox[,0,0,0x0....',如何让它显示一个复选框并向其添加操作?
【问题讨论】:
【讨论】:
JTable 具有用于布尔值的默认复选框渲染器/编辑器。只需让您的TableModel#getColumnClass 为给定列返回Boolean.class。
【讨论】:
不,您不能将 swing 组件作为模型对象 [] 数组提供。那应该注册为列上的单元格编辑器。
默认情况下,DefaultTableModel 支持复选框作为存储布尔类类型值的列的编辑器。
因此,在数组中传递 Boolean.TRUE/Boolean.FALSE 对象并将表设置为可编辑。然后表格会自动为您呈现复选框。
是否需要为每个类类型注册编辑器
【讨论】:
如何让它显示一个复选框
查看乌伦的回答
并向其添加操作?
使用 TableModelListener。比如:
public void tableChanged(TableModelEvent e)
{
if (e.getType() == TableModelEvent.UPDATE)
{
int row = e.getFirstRow();
int column = e.getColumn();
if (column == ?)
{
TableModel model = (TableModel)e.getSource();
Boolean value = (Boolean)model.getValueAt(row, column));
if (value.booleanValue())
// add your code here
}
}
}
【讨论】:
table.getModel.addTableModelListener(...);
您也可以只获取类,而不是对每个返回类型进行硬编码。这是覆盖方法的示例:
//create the table
DefaultTableModel tableModel = new DefaultTableModel(data, columnNames)
//override the method
{
public Class<?> getColumnClass(int colIndex) {
return getValueAt(0, colIndex).getClass();
}
然后,当您创建表时,您可以这样初始化它:
data[i][12] = new Boolean(false);
这使得该框看起来没有勾选:)
【讨论】: