Comment puis-je obtenir le CellRow de la JComboBox dans une JTable lorsqu'un ItemEvent se produit ?
Vous avez une JTable avec une colonne contenant un JComboBox et un ItemListener attaché au JComboBox pour répondre aux modifications. Cependant, ItemListener n’a pas la capacité de récupérer la ligne du ComboBox modifié. Pour opérer sur une autre colonne de la même ligne lorsque la ComboBox change, vous avez besoin du numéro de ligne.
Comprendre le problème
Dans l'exemple de code donné, lorsqu'un changement est détecté dans le ComboBox, le ComboBoxListener récupère l'élément affecté. Cependant, il ne fournit pas de moyen d'accéder à la ligne correspondante dans la JTable.
Une solution pour récupérer la CellRow
Lorsque vous utilisez une Combo Box comme éditeur , la méthode TableCellEditor getTableCellEditorComponent() fournit la ligne en tant que paramètre. En faisant référence à l'exemple associé lié dans la réponse, vous pouvez récupérer le CellRow comme :
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, ...)); //... }
Garder les colonnes synchronisées
Pour maintenir la synchronisation entre les colonnes dépendantes, vous pouvez remplacer la méthode getValueAt() du modèle pour mettre à jour les valeurs de manière dynamique en fonction des valeurs associées dans la même ligne. Par exemple, vous pouvez mettre à jour la valeur de « l'autre colonne » dans la méthode setValueAt() du modèle avant de déclencher l'événement de mise à jour.
Exemple d'implémentation
Le code suivant démontre ces 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); } } });
Cette solution combine les deux approches pour synchroniser les colonnes dépendantes et récupérer le CellRow.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!