Home >Java >javaTutorial >How to Get the Row Number of a JComboBox in a JTable After an ItemEvent?
How do I get the CellRow of the JComboBox in a JTable when an ItemEvent occurs?
You have a JTable with a column containing a JComboBox and an ItemListener attached to the JComboBox to respond to changes. However, the ItemListener lacks the ability to retrieve the row of the modified ComboBox. To operate on another column in the same row when the ComboBox changes, you require the row number.
Understanding the Issue
In the given code example, when a change is detected in the ComboBox, the ComboBoxListener retrieves the affected item. However, it does not provide a way to access the corresponding row in the JTable.
A Solution for Retrieving the CellRow
When you use a Combo Box as an editor, the TableCellEditor getTableCellEditorComponent() method provides the row as a parameter. Referencing the related example linked in the answer, you can retrieve the CellRow as:
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, ...)); //... }
Keeping Columns Synchronized
To maintain synchronization between dependent columns, you can override the model's getValueAt() method to update values dynamically based on related values in the same row. For instance, you could update the value of the "other column" in the model's setValueAt() method before raising the update event.
Example Implementation
The following code demonstrates these solutions:
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); } } });
This solution combines both approaches to synchronize dependent columns and retrieve the CellRow.
The above is the detailed content of How to Get the Row Number of a JComboBox in a JTable After an ItemEvent?. For more information, please follow other related articles on the PHP Chinese website!