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

时间:2013-01-08 20:31:27

标签: java swing jtable tablemodel listselectionlistener

使用我创建的一些带有JTable的gui和DefualtTableModel的软件,名为validAcTableModel,当我启动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上的New Button并使用

  validAcTableModel.getDataVector().removeAllElements();

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

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

在删除所有元素后,总是在所选行上返回负数,然后在选择行时重新添加行。我将不胜感激。我正在为valueChanged使用ListSelectionListener。

2 个答案:

答案 0 :(得分:2)

  •   

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

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

  •   

    删除后,在所选行上始终返回负数   所有元素。

Integer -1 returns only if any row isn't selected from API

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
  • 后尽早获得更好的帮助

答案 1 :(得分:0)

要清除数据,请更改为方法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。