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?

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
? 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 

1 curtida