JTable kann nicht immer den richtigen rowIndex für die innere ComboBox erhalten

Ich habe einJTable welches seine eine Spalte Zelle istJComboBox. Aber wenn Sie versuchen, die Zeilenanzahl zu ermitteln, wenn Sie auf die Tabelle klickenJComboBox Ich habe festgestellt, dass der Zeilenindex immer einen Fehlerwert zurückgibt (immer der letzte Klick-Zeilenindex).

public class TableComboBoxTest extends JFrame {

    private JTable table;
    private DefaultTableModel tableModel;
    private Object[][] tableCells;
    private final String[] TABLE_COLUMNS = {"No.1"};
    private final String[] YES_NO_SELECTION = {"Yes", "No"};

    public TableComboBoxTest() {
        Container pane = getContentPane();
        pane.setLayout(new BorderLayout());
        tableModel = new DefaultTableModel(tableCells, TABLE_COLUMNS);

        table = new JTable(tableModel);

        DefaultCellEditor cellEditor = null;

        JComboBox selA = new JComboBox(YES_NO_SELECTION);
        cellEditor = new DefaultCellEditor(selA);
        cellEditor.setClickCountToStart(1);
        table.getColumn(TABLE_COLUMNS[0]).setCellEditor(cellEditor);

        JScrollPane jsp = new JScrollPane();
        jsp.getViewport().add(table, null);
        pane.add(jsp, BorderLayout.CENTER);

        TableCellEditor tce = null;
        addRow("Yes");
        outputDefaultSelection(0, 0);

        addRow("No");
        outputDefaultSelection(1, 0);

        System.out.println("");

        selA.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                if (e.getStateChange() == ItemEvent.SELECTED) {
                    JComboBox cb = (JComboBox) e.getSource();
                    String sel = (String) cb.getSelectedItem();
                    int rowIndex = table.getSelectedRow();
                    rowIndex = table.convertRowIndexToModel(rowIndex);

                    if (rowIndex == -1) {
                        return;
                    }

                    outputDefaultSelection(rowIndex, 0);
                    System.out.println("Select: " + sel + " at " + rowIndex);
                }
            }
        });
    }

    private void addRow(String v1) {
        Vector<String> vec = new Vector<String>();
        vec.add(v1);

        tableModel.addRow(vec);
        tableModel.fireTableDataChanged();
    }

    private void outputDefaultSelection(int row, int col) {
        TableCellEditor tce = table.getCellEditor(row, col);
        System.out.println("Default " + row + "-" + col + " Selection: " + tce.getCellEditorValue());
        System.out.println("Default " + row + "-" + col + " Value: " + table.getModel().getValueAt(row, col));
    }

    public static void main(String[] args) {
        TableComboBoxTest stt = new TableComboBoxTest();
        stt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        stt.setSize(200, 100);
        stt.setVisible(true);
    }
}
Default 0-0 Selection: Yes
Default 0-0 Value: Yes
Default 1-0 Selection: Yes
Default 1-0 Value: No*

Wenn Sie auf die erste Zeile klicken und "Ja" auswählen, wird kein Änderungsereignis ausgelöst. Wenn Sie auf die zweite Zeile klicken, ändern Sie den Ereignisauslöser! und Zeilennummer ist falsch: 0

Default 0-0 Selection: No
Default 0-0 Value: Yes
Select: No at 0*

Wenn Sie weiterhin auf die erste Zeile klicken, ändern Sie den Ereignisauslöser! und Zeilennummer ist falsch: 1

Default 1-0 Selection: Yes
Default 1-0 Value: No
Select: Yes at 1

Wie kann ich die richtige Klickzellennummer erhalten?

Und für den Prozess itemStateChanged habe ich auch festgestellt, dass beim Klicken auf den Wert der Zelle der Wert der Standardspalte ("Ja") nicht ausgelöst wird. Wenn der Zellensatzwert jedoch auf "Nein" gesetzt ist, wird durch Klicken darauf ein Änderungsereignis ausgelöst. Das heißt, die Modelldaten unterscheiden sich von den standardmäßig ausgewählten Daten. Wie können sie konsistent gemacht werden?

Vielen Dank ~

Antworten auf die Frage(1)

Ihre Antwort auf die Frage