Criar uma JTable sendo populada por um BD

Estou tentando criar uma JTable em um frame buscando as informações de uma tabela, mais ele dá erro na hora de adicionar os dados, esse é o erro: The method add(int, Maquina) in the type ArrayList is not applicable for the arguments (int, String, String, String, String), segue abaixo o codigo que criei.

criação do frame:

import java.awt.*;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.swing.*;
import ATM.atmMaquina;
import Classes.Maquina;
import Conexao.ConnectionFactory;

public class InternalFrameDois extends JInternalFrame {

/**
 * 
 */
public InternalFrameDois() throws SQLException {

    super("Cadastro de Máquina", true, true, true, true);

    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();

    Connection conn = null;
    PreparedStatement stmt = null;
    ResultSet rs = null;

    String sql = "";

    setSize(screenSize.width, screenSize.height);

    JPanel panel1 = new JPanel();
    panel1.setPreferredSize(new Dimension(screenSize.width, screenSize.height));
    panel1.setBackground(new Color(230, 220, 20));

    JLabel lblPesquisaMaquina = new JLabel();
    lblPesquisaMaquina.setText("Pesquisar: ");
    lblPesquisaMaquina.setBounds(10, 50, 70, 30);

    try {

        conn = ConnectionFactory.getConnection();

        sql = "SELECT * FROM maquina " + "WHERE maq_ativo = true " + "AND maq_delete <> '*';";
        stmt = conn.prepareStatement(sql);
        stmt.execute();

        rs = stmt.executeQuery(sql);

        ArrayList<Maquina> maquina = new ArrayList<>();

        while (rs.next()) {

            maquina.add(

                    rs.getInt("maq_codigo"),
                    rs.getString("maq_placa"),
                    rs.getString("maq_descricao"),
                    rs.getString("maq_ip"),
                    rs.getString("maq_mac")

            );
        }

        stmt.close();
        conn.close();

        atmMaquina mmdlMaquina = new atmMaquina(maquina);
        JTable tblMaquina = new JTable(mmdlMaquina);
        JScrollPane scpMaquina = new JScrollPane(tblMaquina);
        panel1.add(scpMaquina);

    } catch (Exception e) {
        System.out.println("Deu Erro !!!");
    }

    panel1.add(lblPesquisaMaquina);

    Container container1 = getContentPane();
    container1.add(panel1);
    pack();

    panel1.setLayout(null);

}

}

Criação da AbstractTable Model:

package ATM;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;
import Classes.Maquina;

public class atmMaquina extends AbstractTableModel {

private ArrayList<Maquina> maquina;

private String nmcFuncionario[] = {
        "Codigo",
        "Placa",
        "Descricao",
        "IP",
        "MAC"
};

private final int codigo = 0;
private final int placa = 1;
private final int descricao = 2;
private final int ip = 3;
private final int mac = 4;

public atmMaquina(ArrayList<Maquina> maquina) {
    this.maquina = maquina;
}

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

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

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

@Override
public String getColumnName(int indice) {
    return nmcFuncionario[indice];
}

@Override
public Class<?> getColumnClass(int columnIndex) {
    switch (columnIndex) {
        case codigo:
            return Integer.class;
        case placa:
            return String.class;
        case descricao:
            return String.class;
        case ip:
            return String.class;
        case mac:
            return String.class;
        default:
            return String.class;
    }
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {

    Maquina maquina = this.maquina.get(rowIndex);

    switch (columnIndex) {
        case codigo:
            return maquina.getMAQ_CODIGO();
        case placa:
            return maquina.getMAQ_PLACA();
        case descricao:
            return maquina.getMAQ_DESCRICAO();
        case ip:
            return maquina.getMAQ_IP();
        case mac:
            return maquina.getMAQ_MAC();
    }
    return null;
}

@Override
public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
    Maquina maquina = this.maquina.get(rowIndex);

    switch (columnIndex) {
        case codigo:
            maquina.setMAQ_CODIGO((int) aValue);
            break;
        case placa:
            maquina.setMAQ_PLACA(String.valueOf(aValue));
            break;
        case descricao:
            maquina.setMAQ_DESCRICAO(String.valueOf(aValue));
            break;
        case ip:
            maquina.setMAQ_IP(String.valueOf(aValue));
            break;
        case mac:
            maquina.setMAQ_MAC(String.valueOf(aValue));
            break;
    }
    fireTableDataChanged();
}

}

Criação da Classe Geters and Seters:

package Classes;

public class Maquina {
private int MAQ_CODIGO;
private String MAQ_PLACA;
private String MAQ_DESCRICAO;
private String MAQ_IP;
private String MAQ_MAC;

public Maquina(int MAQ_CODIGO, String MAQ_PLACA, String MAQ_DESCRICAO, String MAQ_IP, String MAQ_MAC) {

    this.MAQ_CODIGO = MAQ_CODIGO;
    this.MAQ_PLACA = MAQ_PLACA;
    this.MAQ_DESCRICAO = MAQ_DESCRICAO;
    this.MAQ_IP = MAQ_IP;
    this.MAQ_MAC = MAQ_MAC;

}

public int getMAQ_CODIGO() {
    return MAQ_CODIGO;
}

public void setMAQ_CODIGO(int mAQ_CODIGO) {
    MAQ_CODIGO = mAQ_CODIGO;
}

public String getMAQ_PLACA() {
    return MAQ_PLACA;
}

public void setMAQ_PLACA(String mAQ_PLACA) {
    MAQ_PLACA = mAQ_PLACA;
}

public String getMAQ_DESCRICAO() {
    return MAQ_DESCRICAO;
}

public void setMAQ_DESCRICAO(String mAQ_DESCRICAO) {
    MAQ_DESCRICAO = mAQ_DESCRICAO;
}

public String getMAQ_IP() {
    return MAQ_IP;
}

public void setMAQ_IP(String mAQ_IP) {
    MAQ_IP = mAQ_IP;
}

public String getMAQ_MAC() {
    return MAQ_MAC;
}

public void setMAQ_MAC(String mAQ_MAC) {
    MAQ_MAC = mAQ_MAC;
}

}

Por favor alguém poderia me ajudar, na hora que tento dar maquina.add ele dá aquele erro que descrevi lá em cima, pelo que pesquisei até agora o problema é algum argumento, mais ainda não consegui entender qual.

1 curtida

Boa tarde Anderson, o erro se a gente ler com calma, vê que você está tentando inserir vários argumentos separados, como elementos, em um ArrayList que foi definido para um objeto, no seu caso, um arrayList de ‘Maquina’. O método add espera que você passe um único objeto como argumento. Pra inserir um objeto ‘Maquina’ no seu arrayList, você deve instanciar esse cara dentro do while, para que a inserção seja feita do objeto completo, e não particionado. Segue um exemplo.

while (rs.next()) {
   Maquina maq = new Maquina(
       rs.getInt("maq_codigo"),
       rs.getString("maq_placa"),
       rs.getString("maq_descricao"),
       rs.getString("maq_ip"),
       rs.getString("maq_mac")
   );
   maquina.add(maq);
}

Thiago muito obrigado ele acabou com o erro muito obrigado mesmo, problema resolvido, mais ou menos, pois o erro não aparece mais, mais a tabela também não aparece no frame, mais muito obrigado mesmo.

Dê uma estudada nos layout managers e use um que atenda sua necessidade, não use layout null.

Obrigado pela ajuda estou estudando um que funcione, mais já consegui aparecer agora é comigo só falta fazer a tela ficar do jeito que quero, mais isso é comigo caso eu tenha alguma dívida coloco aqui, mais obrigado pela ajuda.