Добавление строк в модель, но не добавление. Получение исключения arrayindex за пределы границ

Я пытаюсь создать пустую таблицу с 5 столбцами и добавить в нее строки. Я создал отдельный класс tablemodel, который расширяет AbstractTableModel.

Класс:

public class MyTableModel extends AbstractTableModel 
 {
    private String[] columnNames = {"Name",
                                    "Size",
                                    "Directory",
                                    "Last Modified Time",
                                    "Readable"};

    Object[][] data=new Object[][]{

    };

    public int getColumnCount() 
    {
        return columnNames.length;
    }
    public String getColumnName(int col) 
    {
        return columnNames[col];
    }
    public Class getColumnClass(int c) 
    {
        return getValueAt(0, c).getClass();
    }
    public boolean isCellEditable(int row, int col) 
    {
            if (col < 1) 
        {
            return false;
        } 
        else 
        {
            return false;
        }
    }

    public void setValueAt(Object value, int row, int col) 
    {
        data[row][col]=value;

    }
    public void updateJarTable(Object[] row)

    {
        setValueAt(row[0],0,0);
        fireTableDataChanged();
        setValueAt(row[1],0,1);
        fireTableDataChanged();
        setValueAt(row[2],0,2);
        fireTableDataChanged();
        setValueAt(row[3],0,3);
        fireTableDataChanged();
        setValueAt(row[4],0,4);
        fireTableDataChanged();
    }
    @Override
    public int getRowCount() {
        // TODO Auto-generated method stub
        return data.length;
    }
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        // TODO Auto-generated method stub
        return data[rowIndex][columnIndex];
    }
}

После этого я создаю таблицу и применяю к ней эту табличную модель как:

table=new JTable(new MyTableModel());   

когда я нажимаю кнопку, должна быть добавлена ​​новая строка.

submit.addActionListener(new ActionListener () {
public void actionPerformed(ActionEvent e)
{
Object[] row={"col1","col2","col3","col4","col5"};
model1.updateJarTable(row);
table.revalidate();
}
}); 

Где модель1:

private MyTableModel model1=new MyTableModel();

Но когда я запускаю его, я получаю ArrayIndexOutofBoundsException в методах: updateJarTable и setValueAt

Я не знаю, где я ошибся. пожалуйста, помогите мне найти его. Спасибо !


person Pranesh    schedule 27.03.2014    source источник
comment
Лучше использовать DefaultTableModel, чем изобретать велосипед, реализуя собственную модель таблицы.   -  person StanislavL    schedule 27.03.2014


Ответы (3)


Найдите минутку и посмотрите на свой код...

Сначала делаешь...

table=new JTable(new MyTableModel());   

Тогда вы делаете...

model1.updateJarTable(row);

Как model1 связано с моделью, которую вы присвоили таблице?

Попробуйте использовать...

table=new JTable(model1);   

вместо этого просто убедитесь, что model1 инициализирован ДО того, как вы примените его к таблице, и что вы не переназначите его позже (сделав что-то вроде model1 = MyTableModel() снова...

ArrayIndexOutofBoundsException сводится к тому, что у вас есть пустой массив

Object[][] data=new Object[][]{};

0 строк, 0 столбцов.

Вам нужно либо воссоздать массив для размещения новых данных, что не так просто, либо использовать более динамичную структуру данных, например java.util.List, или просто использовать DefaultListModel, которая делает это.

Обновлено с помощью модели на основе списка

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.table.AbstractTableModel;

public class MyTableModel extends AbstractTableModel {

    private String[] columnNames = {"Name",
        "Size",
        "Directory",
        "Last Modified Time",
        "Readable"};

    List<List> rows;

    public MyTableModel() {
        rows = new ArrayList<>(25);
    }

    @Override
    public int getColumnCount() {
        return columnNames.length;
    }

    @Override
    public String getColumnName(int col) {
        return columnNames[col];
    }

    @Override
    public Class getColumnClass(int c) {
        // Don't do this, what happens if the cell value is null??
        return getValueAt(0, c).getClass();
    }

    @Override
    public boolean isCellEditable(int row, int col) {
        if (col < 1) {
            return false;
        } else {
            return false;
        }
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        List columns = rows.get(row);
        columns.set(col, value);
        fireTableCellUpdated(row, col);
    }

    public void updateJarTable(Object[] row) {
        List columns = new ArrayList(row.length);
        columns.addAll(Arrays.asList(row));
        rows.add(columns);
        fireTableRowsInserted(rows.size() - 1, rows.size() - 1);
    }

    @Override
    public int getRowCount() {
        // TODO Auto-generated method stub
        return rows.size();
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        List columns = rows.get(rowIndex);
        return columns.get(rowIndex);
    }
}

Или вы могли бы просто сделать...

String[] columnNames = {"Name",
    "Size",
    "Directory",
    "Last Modified Time",
    "Readable"};
DefaultTableModel model = new DefaultTableModel(columnNames, 0);
//...
Object[] row={"col1","col2","col3","col4","col5"};
model.addRow(row);

И избавь себя от проблем...

person MadProgrammer    schedule 27.03.2014
comment
Да, отличная находка. я менял и пробовал. снова я получаю то же исключение !! - person Pranesh; 27.03.2014
comment
Я новичок в java и не использовал List или Vector. Подскажите, пожалуйста, как заменить строки в методах SetValueAt и GetValueAt, если я использую список или вектор? - person Pranesh; 27.03.2014

Кажется, ваша проблема в следующих строках:

Object[][] data=new Object[][]{

};

У вас есть массив Object[0][], потому что вы не можете установить для него значение и поймать ArrayIndexOutOfBoundsException.

1) Вы можете указать размер вашего массива.

2) Или хранить данные в List например.

3) Программно расширить массив, если это необходимо, при установке значений.

Также попробуйте DefaultTableModel.

person alex2410    schedule 27.03.2014
comment
Если я использую список вместо двумерного массива, как мне изменить строку в методах SetValueAt и GetValueAt? - person Pranesh; 27.03.2014

Я уже разместил ответ в том же контексте.

Пожалуйста, найдите его здесь ">как добавить массив в Jtable при нажатии кнопки java.

Используйте DefaultTableModel и метод простого вызова addRow(), чтобы добавить новую строку.

person Braj    schedule 27.03.2014
comment
@braj Даже я пробовал это, прежде чем приступить к созданию нового класса. Но этот метод addRow() не сработал. Моя таблица не обновлялась. Не знаю, почему! - person Pranesh; 27.03.2014
comment
Пожалуйста, взгляните на пример кода, размещенный по указанной ссылке. - person Braj; 27.03.2014
comment
@Braj, да, на самом деле я видел именно этот пост вчера, когда начал с этого. Пытался реализовать. Но не сработало. Вот и перешел к этому методу! - person Pranesh; 27.03.2014
comment
Где вы столкнулись с проблемой? Вы получаете какие-либо исключения? или что-то другое. Пожалуйста, предоставьте некоторую информацию. - person Braj; 27.03.2014