Chamar instância em outra classe

A dúvida é a seguinte. Tenho dois jFrames (Cadastro e Relatório). No Cadastro eu salvo os dados nas variáveis e insiro dentro de uma ArrayList. O problema é que não sei a forma correta de ‘chamar’ o objeto salvo dentro da ArrayList no Relatorio. Quando imprimo o Relatorio, ele aparece em branco, porque na hora de instanciar tenho que dar um new Cadastro().getProf();

Resumindo, dentro do ArrayList tenho um Objeto x e preciso ‘enviá-lo’ para outra classe sem zerá-lo.

O seu problema é que no relatório não aparece nada, está em branco?

Uma opção é incluir no construtor um parâmetro para receber esse ArrayList, ou um método público que deverá ser invocado junto da instanciação do novo form.

Sim.
No jFrame Relatorio eu chamo da seguinte forma:

ModeloTabela modelo = new ModeloTabela();
Professor p = new Cadastro().getProf();

public Relatorio() {
    initComponents();
    modelo.addRow(p);
           
    jTable.setModel(modelo);
}

Esse método getProf() fica dentro do Cadastro e me retorna uma variável do tipo Professor que eu coloco dentro de uma ArrayList.

De que forma eu faço isso?

Por que precisa criar um novo objeto de Cadastro?
Se você já tem um objeto Cadastro, utilize ele, não crie um novo.

Como você está querendo trocar mensagens entre telas, o mais simples é criar uma classe responsável por manter as instâncias das telas, aí suas telas usam essa classe para obter instâncias das outras, sem fazer new OutraTela() desnecessariamente.

Programa de exemplo:

import java.awt.Rectangle;

import javax.swing.JFrame;

public class Exemplo {

	public static void main(String[] args) {
		try {
			Exemplo programa = new Exemplo();
			programa.executar();
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}

	private void executar() {
		Tela1 tela1 = Telas.getTela1();
		Tela2 tela2 = Telas.getTela2();

		tela1.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		tela2.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

		Rectangle r1 = tela1.getBounds();
		tela1.setLocation(r1.x - r1.width / 2, r1.y);

		Rectangle r2 = tela2.getBounds();
		tela2.setLocation(r2.x + r2.width / 2, r2.y);

		tela1.setVisible(true);
		tela2.setVisible(true);
	}
}

Classe que mantém as intâncias das telas:

public final class Telas {

	private static Tela1 tela1;
	private static Tela2 tela2;

	public static Tela1 getTela1() {
		if (tela1 == null) {
			tela1 = new Tela1();
		}
		return tela1;
	}

	public static Tela2 getTela2() {
		if (tela2 == null) {
			tela2 = new Tela2();
		}
		return tela2;
	}

	private Telas() {}
}

Tela hipotética 1:

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

@SuppressWarnings("serial")
public class Tela1 extends JFrame {

	private JTextArea campoTexto;

	Tela1() {
		super("Tela 1");

		campoTexto = new JTextArea("Texto da tela 1");
		JScrollPane painelTexto = new JScrollPane(campoTexto);

		JButton botao = new JButton("Enviar pra Tela 2");
		botao.addActionListener(event -> enviarPraTela2());
		JPanel painelBotoes = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		painelBotoes.add(botao);

		JPanel painelPrincipal = (JPanel) getContentPane();
		painelPrincipal.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
		painelPrincipal.setLayout(new BorderLayout());
		painelPrincipal.add(painelTexto, BorderLayout.CENTER);
		painelPrincipal.add(painelBotoes, BorderLayout.SOUTH);

		setSize(400, 300);
		setLocationRelativeTo(null);
	}

	public String getConteudo() {
		return campoTexto.getText();
	}

	public void setConteudo(String texto) {
		campoTexto.setText(texto);
	}

	private void enviarPraTela2() {
		Tela2 tela2 = Telas.getTela2();
		tela2.setConteudo(this.getConteudo());
	}
}

Tela hipotética 2:

import java.awt.BorderLayout;
import java.awt.FlowLayout;

import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

@SuppressWarnings("serial")
public class Tela2 extends JFrame {

	private JTextArea campoTexto;

	Tela2() {
		super("Tela 2");

		campoTexto = new JTextArea("Texto da tela 2");
		JScrollPane painelTexto = new JScrollPane(campoTexto);

		JButton botao = new JButton("Enviar pra Tela 1");
		botao.addActionListener(event -> enviarPraTela2());
		JPanel painelBotoes = new JPanel(new FlowLayout(FlowLayout.RIGHT));
		painelBotoes.add(botao);

		JPanel painelPrincipal = (JPanel) getContentPane();
		painelPrincipal.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10));
		painelPrincipal.setLayout(new BorderLayout());
		painelPrincipal.add(painelTexto, BorderLayout.CENTER);
		painelPrincipal.add(painelBotoes, BorderLayout.SOUTH);

		setSize(400, 300);
		setLocationRelativeTo(null);
	}

	public String getConteudo() {
		return campoTexto.getText();
	}

	public void setConteudo(String texto) {
		campoTexto.setText(texto);
	}

	private void enviarPraTela2() {
		Tela1 tela1 = Telas.getTela1();
		tela1.setConteudo(this.getConteudo());
	}
}
1 curtida

Muito obrigado.