当 ItemEvent 发生时,如何获取 JTable 中 JComboBox 的 CellRow?
您有一个 JTable,其列包含JComboBox 和附加到 JComboBox 的 ItemListener 以响应更改。但是,ItemListener 缺乏检索修改后的 ComboBox 行的能力。要在 ComboBox 更改时对同一行中的另一列进行操作,您需要行号。
理解问题
在给定的代码示例中,当更改在 ComboBox 中检测到该项目时,ComboBoxListener 会检索受影响的项目。但是,它没有提供访问 JTable 中相应行的方法。
检索 CellRow 的解决方案
当您使用组合框作为编辑器时,TableCellEditor getTableCellEditorComponent() 方法提供行作为参数。参考答案中链接的相关示例,您可以将 CellRow 检索为:
public void itemStateChanged(ItemEvent e) { // Get the table cell editor TableCellEditor editor = table.getCellEditor(); // Get the row of the cell being edited int row = table.convertRowIndexToModel(editor.getTableCellEditorComponent(table, ...)); //... }
保持列同步
要保持依赖列之间的同步,您可以覆盖模型的 getValueAt() 方法根据同一行中的相关值动态更新值。例如,您可以在引发更新事件之前更新模型的 setValueAt() 方法中“其他列”的值。
示例实现
以下代码演示了这些解决方案:
import javax.swing.table.DefaultTableModel; //... // Override getValueAt() to keep columns synchronized @Override public Object getValueAt(int row, int col) { if (col == DEPENDENT_COL) { return "C2:" + this.getValueAt(row, ITEM_COL); } else { return super.getValueAt(row, col); } } //... // Attach a new ItemListener combo.addItemListener(new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { // Get the table cell editor TableCellEditor editor = table.getCellEditor(); // Get the row and update the other column int row = table.convertRowIndexToModel(editor.getTableCellEditorComponent(table, ...)); model.setValueAt("C2:" + e.getItem(), row, DEPENDENT_COL); } } });
此解决方案结合了两种方法来同步依赖列并检索细胞行。
以上是如何在 ItemEvent 之后获取 JTable 中 JComboBox 的行号?的详细内容。更多信息请关注PHP中文网其他相关文章!