删除所有行然后重新加载JTable中的行会导致getSelectedRow返回-1



当使用一些软件时,我已经创建了一个带有JTable的gui,其中包含一个名为validAcTableModel的DefualtTableModel,当我初始化validAcTable时,这是我使用的逻辑:

    ListSelectionModel cellSelectModel = validAcTable.getSelectionModel();
    cellSelectModel.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    cellSelectModel.addListSelectionListener(new ListSelectionListener() {
        @Override
        public void valueChanged(ListSelectionEvent e) {
            if (d == 0) {
                    suggestedAcTable.clearSelection();
                d = 1;
            } else {
                String selectedAcData = null;
                String selectedSentData = null;
                String selectedDefData = null;
                String selectedBoolean = null;
                validAcTable.revalidate();
                int[] selectedRow = validAcTable.getSelectedRows();
                for (int i = 0; i < selectedRow.length; i++) {
                    selectedAcData = validAcTable.getValueAt(selectedRow[i], 0).toString();
                    selectedDefData = validAcTable.getValueAt(selectedRow[i], 1).toString();
                    selectedBoolean = validAcTable.getValueAt(selectedRow[i], 2).toString();
                    selectedSentData = getSentence((String) validAcTable.getValueAt(selectedRow[i], 0));
                    if (selectedSentData == null) {
                        selectedSentData = "";
                    }
                }
                Acronym acr = new Acronym(selectedAcData, selectedSentData, selectedDefData, false);
                changedAcList.add(acr);
                //String has a white space....need to redo this...
                currentAccTextField.setText(selectedAcData);
                currentSentenceTextArea.setText(selectedSentData);
                currentDefTextArea.setText(selectedDefData);
                if (selectedBoolean != null) {
                    if (selectedBoolean.equals("true")) {
                        acceptAccButton.setEnabled(false);
                        validLabel.setText("Definition is valid in document");
                    } else {
                        acceptAccButton.setEnabled(true);
                        validLabel.setText("Definition is not valid");
                    }
                }
                d = 0;
            }
        }
    });

当我点击GUI上的新建按钮并使用

  validAcTableModel.getDataVector().removeAllElements();

当我尝试重新加载表并选择一个项目并使用:

获取selectedRow时
  private void acceptAccButtonActionPerformed(java.awt.event.ActionEvent evt) { 
       if (validAcTable.getSelectedRow() >= 0) {
             StringBuilder acDocText = new StringBuilder();
             String acNameDefthmlText = "";
       }
  }

这总是在删除所有元素后对所选行返回一个负数,然后在我选择一行时重新添加行。我将感激你的帮助。我使用ListSelectionListener的valueChanged.

  • 当我尝试重新加载表并选择一个项目并获得selectedRow使用

以编程方式将选择设置为所需的行。setRowSelectionInterval(int index0, int index1);

  • 总是在删除后返回所选行的负值所有元素

仅当API 中的any row isn't selected返回

Integer -1

public int getSelectedRow()
Returns the index of the first selected row, -1 if no row is selected.
Returns:
    the index of the first selected row

  • 为获得更好的帮助,尽快发布SSCCE

要清除数据,请更改方法javax.swing.table.DefaultTableModel.setRowCount(int);

((DefaultTableModel) validAcTable.getModel()).setRowCount(0);

要重新填充模型,使用:

javax.swing.table.DefaultTableModel.setDataVector(Vector, Vector);
javax.swing.table.DefaultTableModel.setDataVector(Object[][], Object[])

请记住使用模型的相同实例。

使用DefaultTableModel中的辅助方法。它们将启动用于更新UI的适当事件。

最新更新