[RESOLVIDO] O Que esta acontencendo exatamente dentro do metodo getValueAt?

Boa noite rapazeada, estou estudando o preenchimento de JTable e travei em uma parte que diferente das outras eu nao consegui achar uma explicacao “compreensivel” nos videos, forums ou pdfs por ai…

enfim, este e o meu codigo:

public class ModeloTabela extends AbstractTableModel{

private ArrayList linhas = null; //Armazenamos as linhas em um ArrayList (uma colecao de objetos, dados).
private String[] colunas = null; //Variavel para armazenas as colunas, cada coluna fica em um vetor "colunas[0]..."

//Metodo Construtor que recebe uma lista de linhas e uma sequencia de colunas.
public ModeloTabela(ArrayList lin, String[] col){
    setLinhas(lin); //Chama o "set" de linhas para atribuir a quantidade de linhas na variavel "linhas".
    setColunas(col); //O mesmo de cima porem com a quantidade de colunas
    
}

//Pega a quantidade de linhas, a variavel esta privada entao somente esta classe tem acesso
//por meio desse metodo "get".
public ArrayList getLinhas() {
    return linhas;
}

//Recebe a quantidade de linhas e "seta" na variavel String "linhas"
public void setLinhas(ArrayList linhas) {
    this.linhas = linhas;
}

//Pega a quantidade de colunas que vai ser armazenada na variavel no "set" abaixo.
public String[] getColunas() {
    return colunas;
}

//Recebe a quantidade de colunas e "seta" na variavel String "colunas"
public void setColunas(String[] colunas) {
    this.colunas = colunas;
}

//Pega o tamanho das colunas, a variavel coluna e um vetor de String logo
//usando o length voce pega o tamanho do vetor e se cada espaco e uma coluna
//logo o tamanho dele e a quantidade de colunas.
@Override
public int getColumnCount(){
    return colunas.length;
    //contar o numero de colunas
    //length = quantidade do numero de colunas
}

//Mesma logica das colunas acima, aqui eu pego o tamanho do vetor de linhas
//se tem 10 espacos, logo tem o tamanho 10, logo eu sei que tem 10 linhas :D
@Override
public int getRowCount(){
    return linhas.size();
    //contagem de quantas linhas tem no nosso array
}

//Pego o nome da coluna de acordo com o numero da coluna
@Override
public String getColumnName(int numCol){
    return colunas[numCol];
    //retorna o valor da coluna(logicamente seu nome).
    //pegar o valor do nome da coluna, logo pegar o nome da coluna.
}

//Nao consigo entender o que realmente esta acontecendo nesse metodo 
@Override
public Object getValueAt(int numLin, int numCol){
    Object[] linha = (Object[])getLinhas().get(numLin); //Essa parte fica tudo muito confuso, linha recebe um objeto e depois me perco...
    return linha[numCol];
}

}

getLinhas().get(numLin) pega um objeto no index numLin.
Depois nesse objeto é feito um cast para Object[] (array de Object).
A partir do array de object chamado de linha, o método retorna o valor que fica no index numCol desse array.

1 curtida

@RoinujNosde

Acho que estou compreendendo…

quando voce diz :

getLinhas().get(numLin) pega um objeto no index numLin .

Voce quer dizer que no caso, cada linha da jTable e um objeto? por exemplo o Numero, Nome, Job e Age na imagem a baixo seria um objeto nesse metodo “getValueAt”, logo esse metodo pega cada linha dessa?

image

entao realmente seria como uma batalha naval? ‘-’ kkk pior que ate pensei nisso antes…

O get pega a linha inteira.
O getValueAt pega um valor específico dentro dessa linha. (Ou seja, um valor da coluna tal e linha tal).

Aham kkk

1 curtida

Realmente esta fazendo bastante sentido, esse metodo ele e chamado implicitamente ne? quando o jTable e inicializado

mas minha duvida seguinte e… em que momento esse metodo recebe os argumentos que ele pede no parametro? “int numLin, int numCol”

analisei o codigo e nao vi em nenhum momento esses argumentos serem passados para esse metodo, segue o codigo que preenche o jTable:

Chamada do metodo :

preencherTabela("select * from cliente"); 

Codigo do preenchimento:

public void preencherTabela(String Sql) {
    //Crio uma nova Lista de dados chamada "dados"
    ArrayList dados = new ArrayList();
    //Crio um vetor com os nomes das colunas do jTable.
    String[] colunas = new String[]{"ID", "Nome", "Endereco", "Estado", "Telefone", "CPF", "RG", "E-Mail"};

    //Tratamento de erro para conexao
    try {
        //Abro a Conexao para executar os comandos dentro do banco.
        conex.getConnection();
        System.out.println("Conectando ao Banco de Dados...");
        System.out.println("Conectado com Sucesso!!!");
        //Executo a query que chamei no carregamento do Form "select * from cliente".
        conex.executaSql(Sql);
        
        conex.rs.first();
        do {
            dados.add(new Object[]{conex.rs.getInt("idClient"), conex.rs.getString("nomeCliente"), conex.rs.getString("endereco"), conex.rs.getString("uf"), conex.rs.getBigDecimal("telefone"), conex.rs.getBigDecimal("cpf"), conex.rs.getBigDecimal("rg"), conex.rs.getString("email")});

        } while (conex.rs.next());
    } catch (SQLException e) {
        //Exibe uma caixa de Mensagem com erro
        JOptionPane.showMessageDialog(null, "Erro ao preencher a tabela", "ERRO", JOptionPane.ERROR_MESSAGE);
    }
    ModeloTabela modelo = new ModeloTabela(dados, colunas);
    jTable1.setModel(modelo);
    //ID
    jTable1.getColumnModel().getColumn(0).setPreferredWidth(25);
    jTable1.getColumnModel().getColumn(0).setResizable(true);
    //Nome
    jTable1.getColumnModel().getColumn(1).setPreferredWidth(180);
    jTable1.getColumnModel().getColumn(1).setResizable(true);
    //Endereco
    jTable1.getColumnModel().getColumn(2).setPreferredWidth(140);
    jTable1.getColumnModel().getColumn(2).setResizable(true);
    //Estado
    jTable1.getColumnModel().getColumn(3).setPreferredWidth(60);
    jTable1.getColumnModel().getColumn(3).setResizable(true);
    //Telefone
    jTable1.getColumnModel().getColumn(4).setPreferredWidth(100);
    jTable1.getColumnModel().getColumn(4).setResizable(true);
    //CPF
    jTable1.getColumnModel().getColumn(5).setPreferredWidth(100);
    jTable1.getColumnModel().getColumn(5).setResizable(true);
    //RG
    jTable1.getColumnModel().getColumn(6).setPreferredWidth(100);
    jTable1.getColumnModel().getColumn(6).setResizable(true);
    //E-Mail
    jTable1.getColumnModel().getColumn(7).setPreferredWidth(200);
    jTable1.getColumnModel().getColumn(7).setResizable(true);

    //nao pode alterar a ordem
    jTable1.getTableHeader().setReorderingAllowed(false);
    //nao pode ser redimensionada
    jTable1.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
    //Selecionar apenas um dado na tabela por vez
    jTable1.setSelectionMode((ListSelectionModel.SINGLE_SELECTION));
    conex.fecharConexao();
}

Codigo dentro da classe “conex” :

public class Conexao {

public Statement stm;
public ResultSet rs;
public Connection conn;

public Connection getConnection() {
    try {
        String driver = "com.mysql.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/database";
        String username = "adriano";
        String password = "123adr";
        Class.forName(driver);

        conn = DriverManager.getConnection(url, username, password);
    } catch (SQLException | ClassNotFoundException e) {
        System.out.println("Falha ao Conectar!!!");
    }
    return conn;
}

public void fecharConexao() {
    try {
        conn.close();
    } catch (SQLException e) {
        System.out.println("Error: " + e);
    }
}
//Metodo que tem como parametro uma Query SQL recebida por um argumento na chamada
public void executaSql(String sql) {
    try {
        conn = getConnection(); //Abro a conexao para permitir a manipulacao do banco de dados.
        stm = conn.createStatement(); //criacao do objeto que executa instrucoes no banco de dados.
        rs = stm.executeQuery(sql); //executo a query armazenada em "sql" trazida por argumento na chamada.
        //stm.close();
    } catch (Exception e) {
        System.out.println("Falha ao executar a query!!!  --  "+e); //tratamento de erro caso nao funcione a query.
    }
}

}

Você respondeu sua própria dúvida:

O JTable deve fazer um for por baixo dos panos a partir dos valores de getColumnCount() e getRowCount(), e a cada iteração desse for, ele vai chamando o getValueAt.

1 curtida

esse jTable e cheio de maracutaia ‘-’

sobre o “voce respondeu sua propria duvida” entao o metodo preencherTabela da esse argumentos para o getValueAt, certo mas entao… onde exatamente ele e preenchido :thinking: ? em que linha pra ser mais especifico.

Não tem uma linha específica, começa aqui:
ModeloTabela modelo = new ModeloTabela(dados, colunas); o modelo está sendo criado
Os dados passados para esse modelo são usados nos métodos getColumnCount e getRowCount.
O JTable usa esses dois métodos para ir chamando o getValueAt.

1 curtida

Agradecido por tudo meu grandioso Nosde me ajudou muito mesmo, todo sucesso do mundo pra voce <3 :blush::sparkling_heart:

1 curtida