Abrir e fechar um JFrame

Boa tarde a todos do GUJ,

Eu fiz um projeto com vários JFrame. Toda vez que eu preciso abrir um JFrame, eu verifico se ele é null. Se ele for null, então eu crio uma instancia dessa janela:

NomeFrame nome = new NomeFrame();
nome.setvisible = true
etc...

Toda vez que eu fecho um JFrame eu uso o metódo this.dispose.

Até aqui tudo certo, sem problema. O problema é quando eu preciso abrir esse mesmo JFrame que acabei de fechar, pois neste momento o objeto não é mais nulo pois, já foi instanciado agora pouco.
Para abrir quando não é mais nulo, eu uso:

nome.setvisible = true;

A janela abre normal, mas os métodos que precisam ser acionados quando o JFrame se abre para dar um “REFRESH” na janela não é acionado.

Alguém já passou por isso? Tem alguma solução correta sem ser gambiarra?

Abraços.

hein ??

Você setou a propriedade “DefaultCloseOperation” como por exemplo DISPOSE_ON_CLOSE ou EXIT_ON_CLOSE ou HIDE_ON_CLOSE ??

Como está essa sua configuração ?

Calma… a resposta pra sua dúvida vem logo em seguida … tenha fé …

DISPOSE_ON_CLOSE

O problema tá justamente ai, pois Dispose significa que todos os recursos pra exibir aquela janela serão jogados fora. Pro seu caso, um hide _on close deve bastar.

Olá elissonandrade,
O hide_on_close também não joga fora o frame e por isso ele também não recarrega os métodos de inicialização do frame.

Talvez se eu deixasse o objeto nulo ao fechar a janela ele seria forçado a criar um novo objeto JFrame para assim recarregar os métodos de inicialização.

[quote=iamthelegend]Boa tarde a todos do GUJ,

Eu fiz um projeto com vários JFrame. Toda vez que eu preciso abrir um JFrame, eu verifico se ele é null. Se ele for null, então eu crio uma instancia dessa janela:

NomeFrame nome = new NomeFrame();
nome.setvisible = true
etc...

Toda vez que eu fecho um JFrame eu uso o metódo this.dispose.

Até aqui tudo certo, sem problema. O problema é quando eu preciso abrir esse mesmo JFrame que acabei de fechar, pois neste momento o objeto não é mais nulo pois, já foi instanciado agora pouco.
Para abrir quando não é mais nulo, eu uso:

nome.setvisible = true;

A janela abre normal, mas os métodos que precisam ser acionados quando o JFrame se abre para dar um “REFRESH” na janela não é acionado.

Alguém já passou por isso? Tem alguma solução correta sem ser gambiarra?

Abraços.[/quote]

Aqui abre normal fazendo dessa forma. Que tipo de métodos que você não está conseguindo utilizar? São os eventos dos componentes?

Se você precisa do JFrame zerado sempre que abri-lo, para que você guarda ele numa variável?

Ah, o poblema é que depois de fechar o Jframe, você usa o métood dispose, então não importa o método de fechamento, sempre vai jogar tudo fora. Nesse caso, você tem que para de chamar esse metodo depois de fechar a janela.

Se você quer dar o refresh, uma coisa que pode ajudar é a criar um windowlistenner para seu jframe. Dá uma pesquisada nesse tipo de listener.

Agradeço as respostas, vou tentar explicar mais detalhadamente.

O usuário abre a tela inicial do sistema e em seguida solicita a abertura da tela BANCO.
Eu uso o código abaixo para abrir um JFrame que o usuário solicitou:

Banco banco;

private void mostrarBanco(){
        if(banco == null){
            banco = new BancoView();
            banco.setVisible(true);
        }
        else{
            banco.setVisible(true);
            banco.setState(JFrame.NORMAL);
        }
    }

Como podem verificar, se a tela ainda não estive sido aberta ele da um new no JFrame e exibe isso para o usuário. O Jframe Banco executa os métodos dele que ficam no construtor sem nenhum problema.
Se o usuário minimizar a tela e tentar abrir a mesma tela novamente, ele não deixa, pois o objeto já esta instanciado e como podem ver, ele só manda um setVisible=true.
Quando um usuário fecha esse JFrame, eu uso o método this.dispose() (de dentro do novo frame).

A Janela fecha normal conforme eu gostaria.

O “problema” é quando eu abro novamente esse JFrame que foi encerrado. O JFrame abre novamente, mas não executa os métodos que eu coloco dentro do construtor.

public Banco() {
        initComponents();
        setLocationRelativeTo(null);
        consultarBanco();
        tFUsuarioLogado.setEditable(false);       
    }

Sendo assim, o método consultar saldo não é executado e consequentemente o usuário não “enxerga” a atualização do “consultarBanco”.

É isso que eu quis dizer que a tela não é atualizada…

Viny, existe outra forma de fazer isso?

O construtor só é chamado quando criado o objeto ou seja com você da um new SeuJFrame(). Então para resolver isso você pode sempre que quiser abrir o JFrame criar uma nova instancia para ele. Outra dica seria tirar a chamada do construtor e deixar esse método como public e sempre chama-lo toda vez que precisa-se usa-lo ex.:

seuJFrame.setVisible(true); seuJFrame.atualizar(); //atualiza dados

[quote=Ivan Alves]O construtor só é chamado quando criado o objeto ou seja com você da um new SeuJFrame(). Então para resolver isso você pode sempre que quiser abrir o JFrame criar uma nova instancia para ele. Outra dica seria tirar a chamada do construtor e deixar esse método como public e sempre chama-lo toda vez que precisa-se usa-lo ex.:

seuJFrame.setVisible(true); seuJFrame.atualizar(); //atualiza dados[/quote]

Entendi, seria uma opção mesmo hehe. Não consigo testar isso no momento.

Enquanto isso se alguém tiver mais alguma sugestão.