當 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中文網其他相關文章!