JComboBox als Jtable CellEditor mit Overriden stopCellEditing modifiziert falsche Tabellenzelle

Ich habe eine benutzerdefinierte JTable mit einem benutzerdefinierten TableModel unter Verwendung einer JComboBox als Zelleneditor. Die ComboBox verfügt außerdem über ein benutzerdefiniertes ComboBox-Modell. Das ComboBox-Modell enthält mehrere Felder, die zum Aktualisieren der Daten hinter der JTable und anschließend zum Aktualisieren einer Datenbank verwendet werden.

Das Folgende ist ein einfaches Beispiel, um das Problem zu zeigen, auf das ich stoße. Schritte zum Reproduzieren:

Klicken Sie auf eine ZelleWählen Sie einen Wert aus der Dropdown-Liste ComboBoxKlicken Sie auf eine andere ZelleKlicken Sie zurück auf die erste ausgewählte Zelle

Die zweite Zelle erhält den Wert von der ersten.

Warum passiert dies? Warum ändert sich das ComboBox-Modell, bevor stopCellEditing vorhanden ist?

import javax.swing.DefaultCellEditor;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTable;
import javax.swing.table.DefaultTableModel;

public class TestComboCellEditor {

    public static void main(String[] args) {

        TestComboCellEditor test = new TestComboCellEditor();
        test.go();
    }

    public void go() {

        //create the frame
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // create and add a tabbed pane to the frame
        JTabbedPane tabbedPane = new JTabbedPane();
        frame.getContentPane().add(tabbedPane);
        //create a table and add it to a scroll pane in a new tab
        final JTable table = new JTable(new DefaultTableModel(new Object[]{"A", "B"}, 5));
        JScrollPane scrollPane = new JScrollPane(table);
        tabbedPane.addTab("test", scrollPane);

        // create a simple JComboBox and set is as table cell editor on column A
        Object[] comboElements = {"aaaaa1", "aaaaaa2", "b"};
        final JComboBox comboBox = new JComboBox(comboElements);
        comboBox.setEditable(true);
        table.getColumn("A").setCellEditor(new DefaultCellEditor(comboBox) {
            @Override
            public boolean stopCellEditing() {
                if (comboBox.isEditable()) {
                    DefaultComboBoxModel comboModel = (DefaultComboBoxModel) comboBox.getModel();
                    String selectedItem = (String) comboModel.getSelectedItem();
                    int selectedIndex = comboModel.getIndexOf(selectedItem);
                    if (!(selectedIndex == -1)) {
                        // the selected item exists as an Option inside the ComboBox
                        DefaultTableModel tableModel = (DefaultTableModel) table.getModel();
                        int selectedRow = table.getSelectedRow();
                        int selectedColumn = table.getSelectedColumn();
                        tableModel.setValueAt(selectedItem, selectedRow, selectedColumn);
                    } else if (selectedItem != null) {
                        // missing code - adding new info to a custom JComboBox model and to alter info inside a custom table model
                    }
                }
                return super.stopCellEditing();
            }
        });

        // pack and show frame
        frame.pack();
        frame.setVisible(true);

    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage