Heim >Java >javaLernprogramm >Wie erhalte ich die Zeilennummer einer JComboBox in einer JTable nach einem ItemEvent?
Wie erhalte ich die CellRow der JComboBox in einer JTable, wenn ein ItemEvent auftritt?
Sie haben eine JTable mit einer Spalte, die ein enthält JComboBox und ein an die JComboBox angehängter ItemListener, um auf Änderungen zu reagieren. Allerdings fehlt dem ItemListener die Möglichkeit, die Zeile der geänderten ComboBox abzurufen. Um eine andere Spalte in derselben Zeile zu bearbeiten, wenn sich die ComboBox ändert, benötigen Sie die Zeilennummer.
Verstehen des Problems
Im angegebenen Codebeispiel bei einer Änderung in der ComboBox erkannt wird, ruft der ComboBoxListener das betroffene Element ab. Es bietet jedoch keine Möglichkeit, auf die entsprechende Zeile in der JTable zuzugreifen.
Eine Lösung zum Abrufen der CellRow
Wenn Sie ein Kombinationsfeld als Editor verwenden , stellt die Methode TableCellEditor getTableCellEditorComponent() die Zeile als Parameter bereit. Wenn Sie sich auf das entsprechende Beispiel beziehen, das in der Antwort verlinkt ist, können Sie die CellRow wie folgt abrufen:
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, ...)); //... }
Spalten synchron halten
Um die Synchronisierung zwischen abhängigen Spalten aufrechtzuerhalten, können Sie Überschreibungen vornehmen die getValueAt()-Methode des Modells, um Werte basierend auf verwandten Werten in derselben Zeile dynamisch zu aktualisieren. Beispielsweise könnten Sie den Wert der „anderen Spalte“ in der setValueAt()-Methode des Modells aktualisieren, bevor Sie das Aktualisierungsereignis auslösen.
Beispielimplementierung
Der folgende Code demonstriert diese Lösungen:
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); } } });
Diese Lösung kombiniert beide Ansätze, um abhängige Spalten zu synchronisieren und die CellRow abzurufen.
Das obige ist der detaillierte Inhalt vonWie erhalte ich die Zeilennummer einer JComboBox in einer JTable nach einem ItemEvent?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!