Ошибка редактирования ячеек JTable после изменения модели таблицы - PullRequest
0 голосов
/ 17 мая 2018

У меня есть список, который при нажатии удаляет удаляет таблицу и создает новую с новыми значениями.В этой функции я устанавливаю RowCount (0) для табличной модели, это вызывает проблему с model.addTableModelListener, где при получении выбранного столбца выводится -1 вместо столбца.

 public void SetList() {

    list.setModel(dlm);

    ClassesPanel.remove(list);
    dlm.removeAllElements();
    if(Classes != null)
    {
    for(int i = 0; i < Classes.length; i++) {
    dlm.addElement(Classes[i]);
    }

    }else {System.out.print("we null"); }
    //dlm.addElement("none");

    list.addListSelectionListener(new ListSelectionListener() {

        @Override
        public void valueChanged(ListSelectionEvent arg0) {
            try {
                if (!arg0.getValueIsAdjusting()) {
                    if(list.getSelectedValue().toString() != null) {
                    SelectedTab = list.getSelectedValue().toString();
                    }
                    try {
                        /// THIS IS WHERE I CREATE A NEW JTABLE /////
                        csvToArray(SelectedTab);
                        scrollPane_table.remove(table);
                        model.setRowCount(0);
                        table.setModel(model);
                        scrollPane_table.repaint();
                        table.repaint();        
                        SetTable();
                        model.fireTableDataChanged();

                    } catch (Exception e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    });



}

Этот код работает нормально, но у меня проблема в конце установки значений для новой таблицы.

 public void SetTable() {
    table = new JTable(model);

    Object[] columnsName = new Object[columnsNumber1];
    columnsName[0] = "Name";
    for(int i = 1; i < columnsNumber1; i++) {
        if(Assignments[i] != null)
        columnsName[i] = Assignments[i].toString();
    }

    Object[] rowData = new Object[columnsNumber1];
    model.setColumnIdentifiers(columnsName);

    if(Students != null) {
    for(int i = 0; i < StudentList.size(); i++){

        rowData[0] = Students[i];
        for( int j = 1; j < columnsNumber1; j++)
        {
            System.out.println(columnsNumber1+" Number of col");
            rowData[j] = Grades[j-1];
        }
          model.addRow(rowData);
    }
    }

    table.setModel(model);
    scrollPane_table.add(table);
    //This works before selecting another item on the list but not after.
    model.addTableModelListener(new TableModelListener() {

        int selectedRowIndex = table.getEditingRow();;

        public void tableChanged(TableModelEvent e) {
              System.out.println("something changed at "+ table.getSelectedColumn()+table.getColumnName(table.getSelectedColumn()));

          }
        });
}

Я не знаю, почему это приведет к ошибкепосле сброса модели в функции списка заданий.

1 Ответ

0 голосов
/ 17 мая 2018

Не создавайте новый JTable.

Все, что вам нужно сделать, это использовать:

model.setRowCount(0);

Это удалит все данные из модели.

TableModelListener по-прежнему будет добавлен в модель, поэтому вам не нужно его сбрасывать.

Все, что вам нужно сделать в методе settable(), это использовать метод addRow (...) для добавления данных в модель.

Или, если структура таблицы меняется (т. Е. У вас разные столбцы), то вы бы:

  1. создайте новую TableModel и добавьте ее в таблицу.
  2. добавить TableModelListener в TableModel

Вот и все, по-прежнему нет необходимости создавать новый JTable.

scrollPane_table.remove(table);
scrollPane_table.add(table)

Избавьтесь от приведенного выше кода. Никогда не пытайтесь добавлять / удалять компоненты из JScrollPane. Компоненты добавляются в JViewport JScrollPane. Если вам нужно заменить компонент в области просмотра, тогда вы просто используете:

scrollPane.setViewportView(...);

Edit:

Таким образом, вам нужно создать простой пример с JFrame, содержащим JTable и JButton с ActionListener, чтобы изменить модель таблицы.

Таким образом, базовый код будет выглядеть примерно так:

table = new JTable( new DefaultTableModel(3, 5) );
frame.add(new JScrollPane(table), BorderLayout.CENTER);

JButton button = new JButton("Change Model");
frame.add(button, BorderLayout.PAGE_END);
button.addActionListener( new ActionListener()
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        table.setModel( new DefaultTableModel(3, 7) );
    }
});
...