更新:当我测试我的(可能不完整的)答案时,我遇到了一个非常好的 SO 问题,我认为这将比我能提供的帮助更好:将 JComboBox 放入 JTable
另一个更新:我再次阅读了您的问题,我意识到您要求的是特定行。我能想到的唯一方法是创建一个自定义 CellEditor,例如:
private static class MyCellEditor extends AbstractCellEditor implements TableCellEditor {
DefaultCellEditor other = new DefaultCellEditor(new JTextField());
DefaultCellEditor checkbox = new DefaultCellEditor(new JComboBox(new Object[] {"abc"}));
private DefaultCellEditor lastSelected;
@Override
public Object getCellEditorValue() {
return lastSelected.getCellEditorValue();
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
if(row == 0) {
lastSelected = checkbox;
return checkbox.getTableCellEditorComponent(table, value, isSelected, row, column);
}
lastSelected = other;
return other.getTableCellEditorComponent(table, value, isSelected, row, column);
}
}
在此示例中,自定义 CellEditor 实际上是两个编辑器,并且根据所选的行,特定的编辑器将获得调用(比喻和字面意义上的)。我承认这lastSelected
似乎有点做作,但老实说,我找不到更简单的方法来知道要返回哪个 Editor 值(因为getCellEditorValue
没有 args)。
为了使您的表格看起来“正确”,您可能还必须对渲染器做一些事情(因为渲染器可能知道也可能不知道将 JComboBox 的选定值显示为初始值)。这取决于您如何初始化实际表中的数据。
为了完整起见,我的原始答案如下:
您可以使用TableModel将 JComboBox 组件添加到行addRow
中,如下所示:如何在 JTable 中添加行?
另请参阅:http ://docs.oracle.com/javase/tutorial/uiswing/components/table.html
我认为主要问题是您将列编辑器/渲染器的想法与将存储在每一行中的实际数据混合在一起。