Erro ao invocar um metodo de outra classe (jInternalFrame)

package Telas;

import Model.Comprador;

/**
 *
 * @author Lucas
 */
public class TelaCadastroComprador extends javax.swing.JInternalFrame {
private TelaVisualizarComprador tela_visualizar_comprador;
    /**
     * Creates new form TelaCadastroComprador
     */
    public TelaCadastroComprador() {
        initComponents();
    }
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
    // TODO add your handling code here:
        
    Float i = Float.parseFloat(txtValor.getText());
    Comprador comprador = new Comprador();
    comprador.setNome(txtNome.getText());
    comprador.setRegiao(txtRegiao.getText());
    comprador.setCpf(ftxtCPF.getText());
    comprador.setValor(i);
    comprador.setTelefone(ftxtTelefone.getText());
        
    tela_visualizar_comprador.cadastrar(comprador.getRegiao(), comprador.getValor(), comprador.getNome(), comprador.getCpf(), comprador.getTelefone());
    }                                        
package Telas;

import Model.Comprador;
import java.util.Arrays;


import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Lucas
 */
public class TelaVisualizarComprador extends javax.swing.JInternalFrame {

    /**
     * Creates new form TelaVisualizarComprador
     */
    public TelaVisualizarComprador() {
        initComponents();
    }
    public void cadastrar(String regiao, Float valor, String nome, String cpf, String telefone){
      
        DefaultTableModel dtmComprador = (DefaultTableModel) jTComprador.getModel();
        Object[] dados = {regiao,valor,nome,cpf,telefone};
        dtmComprador.addRow(dados);
    }

O erro acontece na classe TelaCadastroComprador na ultima linha “tela_visualizar_comprador.cadastrar(parametros)”

eu sou iniciante e não entendi muito bem o erro apontado para this.tela_visualizar_comprador, ja que dei CTRL F e isso não existe no código, sobre ser null, eu não entendi já que no debug os parametros tem o valor certo.

para fins de informação, a lógica de conversa entre os forms eu adaptei desse vídeo → YouTube

Você somente declarou a dependência mas não a inicializou, precisa passar uma instância válida para conseguir chamar um método!

Exemplo:

TelaVisualizarComprador telaComprador = new TelaVisualizarComprador();
// Agora é possível invocar métodos da classe TelaVisualizarComprador
telaComprador.cadastrar( ... );

Jonathan, que erro bobo, fiquei encantado com o form e esqueci que ele é “apenas” uma classe como qualquer outra! Inicializei e consegui chamar o método, entretanto, o AddRow não está funcionando (já verifiquei que < Object[] dados = {…} recebeu e tem seus valores certinhos), Aliás, nenhum método da DTM está funcionando (Testei o removeRow e o addColumn). Acha que seria melhor eu criar um TableModel meu ou estou fazendo algo errado?

2- Essa é uma pergunta mais teórica, na Classe TelaCadastroComprador, você pode verificar que eu importei a classe Comprador, inicializei e usei seus getters & setters, porém, eu poderia não usá-la e apenas chamar o método passando txtField.getText(). Decidi usar e criar a classe Comprador pois estou estudando OOP e achei estranho não ter uma classe para ele, mas pensando bem, a classe TelaCadastroComprador já “é ela” e então não precisaria da classe Comprador (import Model.Comprador). O que você acha?

Sem saber qual o tipo de erro que está apresentando fica difícil de comentar sobre a possível causa de não estar funcionando como o esperado.

Sobre criar ou não seu próprio TableModel, no meu ponto de vista acho totalmente válido, é muito mais simples de manipular e você tem muito mais flexibilidade do que usar um simples DTM.

Dado que estamos falando da representação de um Comprador, eu tendo a acreditar que a melhor abordagem é ter uma classe única que represente este escopo do seu domínio, afinal, esta classe sim deveria ter a capacidade de representar um comprador único na sua estrutura, a classe TelaCadastroComprador, à grosso modo não representa um comprador, ela é somente uma um “driver” para entrada/saída de dados, pegou a ideia? Você poderia ter por exemplo N outros drivers como por exemplo: CLI, Fila, API e etc para tratar entrada e saída de dados sobre um Comprador, mas percebe que nenhuma delas deveria representar o mesmo?

Seria uma separação de responsabilidades, ficando algo parecido com:

O que estou listando abaixo é somente um mero exemplo, NÃO DEVE ser considerado como uma verdade absoluta e muito menos como uma recomendação a se seguir, toda implementação deve levar em consideração diversos fatores antes de decidir um padrão à se utilizar.

Entrada/saída de dados (driver):

  • Tela/jFrame
  • API
  • CLI

Domínio (entidades de negócio):

  • Comprador
  • Vendedor
  • Venda

Serviço/Caso de uso (camada de orquestração):

  • CompradorService (criação, atualização, deleção e busca) → abordagem por serviço
  • CriaCompradorUseCase (trata só criação) → abordagem por caso de uso
  • AtualizaCompradorUseCase (trata só atualização)

Driven (camada de persistência/envio de dados):

  • Banco de dados
  • Mensageria
  • API Externa

No mercado você pode encontrar várias aplicações que seguem este padrão, bem como variações mais robustas ou muito mais simplistas do que esta, somente listei à título de exemplo para contextualizar de forma visual minha opinião pessoal sobre o que me perguntou.

Que aula! Agora ficou mais claro sobre a arquitetura, obrigado.

Sobre o erro… :sweat_smile:

package Telas;

import Model.Comprador;
import java.util.Arrays;


import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Lucas
 */
public class TelaVisualizarComprador extends javax.swing.JInternalFrame {

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

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        jTComprador = new javax.swing.JTable();

        jTComprador.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "Regiao", "Valor", "Nome", "CPF", "Telefone"
            }
        ));
        jScrollPane1.setViewportView(jTComprador);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 381, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(7, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 285, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(0, 0, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        
    
    public void cadastrar(String regiao, Float valor, String nome, String cpf, String telefone){
        DefaultTableModel dtmComprador = (DefaultTableModel) jTComprador.getModel();
        Object[] dados = {regiao,valor,nome,cpf,telefone};
        System.out.println(Arrays.toString(dados));        
        dtmComprador.addRow(dados);
        
        
    }

    // Variables declaration - do not modify                     
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable jTComprador;
    // End of variables declaration                   
}

Sysout →
image

… não aparenta ter erro de sintaxe.

Ops, ignorar