[RESOLVIDO]Exibir nova ArrayList dentro de um JTable tempo de execução

Tenho um Jtable que carrega com os dados vindo do banco de dados em um TableModel, porém quando estou buscando novas informações (através de um JtextField para filtrar), ele retorna os dados porém não consigo mostrar o nova List.

MainView

private JTable tableRequest;
private RequestMainTableModel tableModel;


public MainView() {
    initComponents();

}

private JTable getTableRequest() {
    tableRequest.setModel(null);
    
    tableRequest = new JTable();
    
    tableRequest.setModel(getTableModel());
    return tableRequest;
}


private RequestMainTableModel getTableModel() {
    boolean filter = false;

    String name = FieldFilter.getText();

    if (name.equals("")) {
        filter = true;
    }

    if (filter) {
        List<Request> requests = new RequestController().findAllRequest();
        tableModel = new RequestMainTableModel(requests);

        return tableModel;
    } else {
        List<Request> requests = new RequestController().findByName(name);

        tableModel = new RequestMainTableModel(requests);
        
        return tableModel;
    }
}

Table Model

import br.com.Empresa.sistema.Models.Request;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author Vin4h Criar um modelo de tabela para as requisições
 */
public class RequestMainTableModel extends AbstractTableModel {

    private final int originCompany = 0;
    private final int destinyCompany = 1;
    private final int status = 2;
    private final int data = 3;

    private List<Request> lines;

    public RequestMainTableModel() {
        lines = new ArrayList<Request>();
    }

    public RequestMainTableModel(List<Request> requestList) {
        lines = new ArrayList<Request>(requestList);
    }

    // Array com os nomes das colunas.
    private String[] column = new String[]{"Empresa Origem", "Empresa Destino", "Status", "Data"};

    @Override
    public int getRowCount() {
        return lines.size();
    }

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

    @Override
    public String getColumnName(int columnIndex) {
        return column[columnIndex];
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        switch (columnIndex) {
            case originCompany:
                return String.class;
            case destinyCompany:
                return String.class;
            case status:
                return String.class;
            case data:
                return Date.class;
            default:
                // Não deve ocorrer, pois só existem colunas
                throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        // Pega o request referente a linha especificada.
        Request request = lines.get(rowIndex);

        switch (columnIndex) {
            case originCompany:
                return request.getOrigincompany();
            case destinyCompany:
                return request.getDestinyCompany();
            case status:
                return request.getStatus();
            case data:
                return request.getCreatedAt();
            default:
                // Não deve ocorrer, pois só existem  colunas
                throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        // Pega o request referente a linha especificada.
        Request request = lines.get(rowIndex);

        switch (columnIndex) {
            case originCompany:
                request.setOrigincompany((String) aValue);
                break;
            case destinyCompany:
                request.setDestinyCompany((String) aValue);
                break;
            case status:
                request.setStatus((String) aValue);
            case data:
                request.setCreatedAt((Date) aValue);
            default:
                // Não deve ocorrer, pois só existem colunas
                throw new IndexOutOfBoundsException("columnIndex out of bounds");
        }

        fireTableCellUpdated(rowIndex, columnIndex); // Notifica a atualização da célula
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        return false;
    }

    // Retorna o request referente a linha especificada
    public Request getRequest(int indexLine) {
        return lines.get(indexLine);
    }

// Adiciona o request especificado ao modelo
    public void addRequest(Request request) {
        // Adiciona o registro.
        lines.add(request);

        // Pega a quantidade de registros e subtrai 1 para
        // achar o último índice. A subtração é necessária
        // porque os índices começam em zero.
        int lastIndex = getRowCount() - 1;

        // Notifica a mudança.
        fireTableRowsInserted(lastIndex, lastIndex);
    }

// Remove o requestda linha especificada.
    public void removeRequest(int indexLine) {
        // Remove o registro.
        lines.remove(indexLine);

        // Notifica a mudança.
        fireTableRowsDeleted(indexLine, indexLine);
    }

// Adiciona uma lista de request no final da lista.
    public void addListRequest(List<Request> request) {
        // Pega o tamanho antigo da tabela, que servirá
        // como índice para o primeiro dos novos registros
        int index = getRowCount();

        // Adiciona os registros.
        lines.addAll(request);

        // Notifica a mudança.
        fireTableRowsInserted(index, index + request.size());
        
    }

// Remove todos os registros.
    public void clear() {
        // Remove todos os elementos da lista.
        lines.clear();

        // Notifica a mudança.
        fireTableDataChanged();
    }

}

Você não precisa criar um novo TableModel a cada filtrada.
Declara o seguinte método no seu TableModel:

public void updateModel(List<Request> requestList) {
    lines = requestList;
    fireTableDataChanged();
}

Aí ao filtrar os dados, simplesmente chama esse método passando a nova lista de Requests.
Daí não precisa ficar setando um no TableModel na sua JTable.

1 curtida

Então, refatorei a classe MainView e funcionou irei postar ela aqui abaixo.

public class MainView extends javax.swing.JFrame {

private RequestMainTableModel tableModel;

/**
 * Creates new form MainView
 */
public MainView() {
    initComponents();
}

private JTable getTableRequest() {
    TableRequests.setModel(getTableModel());

    return TableRequests;
}

private RequestMainTableModel getTableModel() {
    boolean filter = false;

    String name = FieldFilter.getText();
    tableModel = new RequestMainTableModel();

    if (name.equals("")) {
        filter = true;
    }

    if (filter) {
        List<Request> requests = new RequestController().findAllRequest();
        tableModel.addListRequest(requests);

        return tableModel;
    } else {
        List<Request> requests = new RequestController().findByName(name);

        tableModel.addListRequest(requests);

        return tableModel;
    }
}