Botão para chamar um novo form e depois retornar para o anterior

Eu quero que ao clicar no botão apareça uma nova tela para entrar com os dados do cadastro.
Pesquisando eu cheguei nesse link:

A sugestão é que eu use o seguinte código no botão:

NomeDaClasseDoSeuForm nomeVariavel = new NomeDaClasseDoSeuForm();
nomeVariavel.setVisible(true);
dispose();

Dessa forma ao pressionar o botão a tela de cadastro aparece e a tela de menu desaparece. O problema é que ao concluir o cadastro a tela de menu não volta.

A minha intenção é que durante o cadastro a tela de menu fique invisível ou que não seja possível interagir com os elementos até que o cadastro seja concluído ou cancelado.

Eu tentei colocar esse mesmo código na conclusão ou cancelamento do cadastro para chamar a tela de menu novamente mas recebo o seguinte erro.

Exception in thread “AWT-EventQueue-0” java.lang.StackOverflowError

1 curtida

Evite usar o dispose, o dispose serve para avisar o Java que vc não vai mais utilizar o componente, ou seja, se usar o dispose terá que usar o new caso queira abrir a tela novamente, mas se usar os setVisible terá que limpar o form toda vez que a tela for exibida, pois guardará os valores preenchidos anteriormente.

class TelaMenu {
  final TelaCadastro telaCadastro;

  public TelaMenu() {
    telaCadastro = new TelaCadastro();
  }

  void cadastro() {
    telaCadastro.atribuirTelaAnterior(this);
    setVisible(false);
    telaCadastro.limparForm();
    telaCadastro.setVisible(true);
  }
}

class TelaCadastro {
  Component anterior;
  void atribuirTelaAnterior(Component anterior) {
    this.anteior = anterior;
  }
  void concluir() {
    // validar
   setVisible(false);
   if (anterior != null) {
     anterior.setVisible(true);
   }
  }
  public void limparForm() {
    nomeTextField.setText("");
    idadeTextField.setText("");
  }
 // caso queira atualizar ou exibir os dados do cliente 
  public void preencherForm(Cliente cliente) {
    this.cliente = cliente;
    nomeTextField.setText(cliente.obterNome());
    idadeTextField.setText(cliente.obterIdade());
  }
}
1 curtida

Geralmente eu extendo JDialog ao invés de JFrame em subtelas pois forço o usuário a não clicar na tela que fica por traz … Mas no seu caso eu usuária o setVisible mesmo que ao fechar a subtela exibiria o Menu novamente.

Essa tela de “Cadastro de Telefones” eu fiz com JDialog … enquanto ela estiver aberta o usuário não pode mexer na tela de “Cadastro de Pessoas”.