JTable zawsze nie może uzyskać poprawnego rowIndex dla wewnętrznego ComboBox

mamJTable która jest jego komórką z jednej kolumnyJComboBox. Ale kiedy próbujesz uzyskać liczbę wierszy po kliknięciu tabeliJComboBox Znalazłem indeks wiersza zawsze zwracający wartość błędu (zawsze jest to indeks wiersza ostatniego kliknięcia).

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*

Gdy klikniesz na pierwszy wiersz i wybierzesz „Tak”, wyzwalacz nie zmieni zdarzenia. Gdy klikniesz na drugi wiersz, zmień wyzwalacz zdarzenia! a numer wiersza jest nieprawidłowy: 0

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

Po kliknięciu pierwszego wiersza zmień wyzwalacz zdarzenia! a numer wiersza jest nieprawidłowy: 1

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

Jak mogę uzyskać prawidłowy numer komórki?

W przypadku procesu itemStateChanged znalazłem również, jeśli wartość zestawu komórek jest taka sama, jak w przypadku domyślnej wartości kolumny („Tak”), po kliknięciu zdarzenie nie będzie wyzwalane. Jeśli jednak komórka ustawi wartość na „Nie”, kliknij ją, aby spowodować zdarzenie zmiany. Oznacza to, że dane modelu są różne w przypadku domyślnie wybranych danych. Jak je ujednolicić?

Dzięki ~

questionAnswers(1)

yourAnswerToTheQuestion