Exception when removing the last element from the ArrayList

-1

My Problem:

I have an ArrayList of an object that represents the number of rows in my JTable, of the model class. Well, all other methods are working, perfectly, the problem is remove () I have no idea why Exception is giving up the last element of the ArrayList. In the removal of the other elements it works, except the last, problem is the last.

The exception:

  

Exception in thread "AWT-EventQueue-0"   java.lang.IndexOutOfBoundsException: Index: 6, Size: 6

What I do not understand, because it informs me what index out then, and the right index. I tried in various ways, index -1, and other changes in trying to find out the reason and nothing, I searched the internet and nothing too.

Jtable Model code:

public class DisciplineModelTabel extends AbstractTableModel implements IEModelTable<Discipline> {

    private ArrayList<Discipline> rows;
    private Queue<Discipline> listRemoved;
    private String[] columns = new String[]{"ID", "Disciplinas"};

    private static final int COL_ID = 0;
    private static final int COL_NAME = 1;

    /**
     * Construtor: espera um objeto do tipo Discipline para 
     * instanciar a lista das Disciplinas.
     * @param disciplines - lista das disciplinas.
     */
    public DisciplineModelTabel(ArrayList<Discipline> disciplines) {
        this.rows = new ArrayList<>(disciplines);
        listRemoved = new LinkedList<>();
    }

    /**
     * Método que remove o ultimo elemento a entradar na fila.
     */
    @Override
    public void undoLastRemoved() {
        if(!listRemoved.isEmpty()) {
            Discipline discipline = listRemoved.poll();
            addDiscipline(discipline);
        }
    }

    /**
     * Método adiciona o elemento retirado da Jtable
     * para guardar na fila de deletados, para recuperação.
     */
    @Override
    public void addLastRemoved(Discipline discipline){
        listRemoved.add(discipline);
    }

    /**
     * Método que limpa a fila.
     */
    @Override
    public void clearlistRemoved() {
        if(!listRemoved.isEmpty())
            listRemoved.clear();
    }

    /**
     * @return - True para fila cheia false para não.
     */
    @Override
    public boolean isEmptyList() {
        return listRemoved.isEmpty();
    }

    /**
     * @return quantidade de linhas na tabela.
     */
    @Override
    public int getRowCount() {
        return this.rows.size();
    }

    /**
     * @return quantidade de colunas na tabela.
     */
    @Override
    public int getColumnCount() {
        return this.columns.length;
    }

    /**
     * Método que retorna os valores das linhas e colunas da tabela.
     * Instancia um objeto do tipo Disciplina e busca os valores de seus
     * atributos
     * @param rowIndex - Index da linha para retorno do valor.
     * @param columnIndex - Index da coluna para retorno do valor.
     * @return
     */
    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Discipline discipline = rows.get(rowIndex);

        if(columnIndex == COL_ID)
            return discipline.getId();
        else if (columnIndex == COL_NAME)
            return discipline.getName();

        return "";
    }

    /**
     * retorna o valor da linha selecionada da JTable
     * retornando-o em um objeto.
     * @param aValue - o item selecionado.
     * @param rowIndex - index da linha do item da Jtable
     * @param column - coluna do item selecionado.
     */
    @Override
    public void setValueAt(Object aValue, int rowIndex, int column) {
        Discipline discipline = rows.get(rowIndex);

        if (column == COL_ID)
            discipline.setId((Integer) aValue);
        else if (column == COL_NAME)
            discipline.setName(aValue.toString());
    }

    /**
     * Método que retorna o nome da coluna.
     * @param columnIndex - o index da coluna
     * @return - o nome da coluna.
     */
    @Override
    public String getColumnName(int columnIndex) {
        return columns[columnIndex];
    }

    /**
     * Método que retorna o tipo da coluna.
     * @return o tipo da coluna.
     */
    @Override
    public Class getColumnClass(int columnIndex) {
        if (columnIndex == COL_ID) {
            return Integer.class;
        }
        return String.class;
    }

    /**
     * Método que retonar o objeto de uma linha da JTable.
     * @param rowIndex - o index da linha selecionada.
     * @return O item (disciplina) da linha selecionada.
     */
    @Override
    public Discipline getDiscipline(int rowIndex) {
        return rows.get(rowIndex);
    }

    /**
     * Método que adiciona uma elemento a Jtable e
     * atualizá-a para mostrar o elemento nela.
     * @param discipline - A entidade disciplina adicionada.
     */
    @Override
    public void addDiscipline(Discipline discipline) {
        rows.add(discipline);
        int lastIndex = getRowCount() - 1;
        fireTableRowsInserted(lastIndex, lastIndex);

    }

    /**
     * Método que altera um item na Jtable e 
     * atualiza para mostrar a alteração na entidade.
     * @param rowIndex - o index da linha selecionada para alteração
     * @param marca - entidade que vai ser alterada.
     */
    @Override
    public void update(int rowIndex, Discipline marca) {
        rows.set(rowIndex, marca);
        fireTableRowsUpdated(rowIndex, rowIndex);
    }

    /**
     * Método que remove um item da JTable e também
     * atualizá-a removendo o item da JTable.
     * @param rowIndex - o index da linha do item que vai ser removido.
     */
    @Override
    public void remove(int rowIndex) {
        fireTableRowsDeleted(rowIndex, rowIndex);
        listRemoved.add(rows.get(rowIndex));
        rows.remove(rowIndex);      
    }

    @Override
    public String getArray() {
        String disciplines = "";

        for(int i = 0; i < rows.size(); i++) {
            disciplines += "index " + i + " nome: " + rows.get(i).getName() + "\n";
        }
        return disciplines;
    }

    /**
     * Método que habilida a edição na célula selecionada
     * @param rowIndex - linha selecionada.
     * @param columnIndex - coluna selecionada
     * @return retorna se Verdadeiro a célula pode ser editada falso para não.
     */
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }
}

Event that calls you to execute the list of processes:

btnOk.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            glassPanel.start();
            queue.executeProcess();
            model.clearlistRemoved();
            Thread performer = new Thread(new Runnable() {
                public void run() {
                    perform();
                }
            }, "Performer");
            performer.start();
            quit();
        }
    }); 

I'm using Pattern Commands to create a process queue and execute when the OK button is pressed (queues.executeProcess).

invoker code:

public class RemoveDiscipline implements IECommand {
    ControllerDiscipline controller;
    private int id;

    public RemoveDiscipline(int id){
        controller = new ControllerDiscipline();
        this.id = id;
    }

    @Override
    public void execute() {
        controller.removeDiscipline(id);
    }
}

Process queues code:

public class QueuesProcess {
    private Queue<IECommand> process;

    public QueuesProcess() {
        process = new LinkedList();
    }

    public void addProcess(IECommand process) {
        this.process.add(process);
    }

    public void removeProcess(IECommand process) {
        this.process.remove(process);
    }

    public void clearQueues() {
        this.process.clear();
    }

    public void executeProcess() {
        for(IECommand command : this.process)
            command.execute();

        process.clear();
    }
}

The problem triggers the rows.remove (rowIndex);

    
asked by anonymous 01.10.2016 / 17:28

1 answer

0

Well, I solved the problem with changing the API from arrayList to Vector, both are very similar and did not impact the performance of the application as much as they use the same interface, the methods have the same signature, so I have not changed at all ... I do not know what happened as I'm out of time, deadline for handing over the work, to seek resolution. Thanks for the help.

    
04.10.2016 / 17:50