JFrame e memoria

4 respostas
M

Estou fazendo um web browser e faco abrir um JFrame quando inicio o programa com instrucoes. Clicando no OK eu quero que o JFrame desapareca.

O metodo mais facil que achei foi o metodo hide(). Porem tenho perguntas:

  • usando esse hide eu so estou escondendo o JFrame certo?
  • Portanto estaria ainda utilizando memoria?
  • existiria outro metodo para fechar o pop up?

Obrigado GUJeiros

4 Respostas

dsiviotti

Você pode usar setVisible(), mas veja o código na classe Component:

public void setVisible(boolean b) {
    	show(b);
    }

Logo usar setVisible é usar show(), mas veja o código show() em Component:

public void show(boolean b) {
	if (b) {
	    show();
	} else {
            isPacked = false;
	    hide();
	}
    }

Quando se usa setVisible (false) você está usando hide(), assim não acho que faça diferença. Na verdade, o controle de memória é problema do Garbage Colector.
No tutorial da SUN normalmente usa-se setVisible(false), mas vale a pena você dar uma pesquisada.

E

Realmente, se você der apenas um setVisible(false) ou hide(), o objeto frame vai ficar na memória. Se você quiser “jogar fora” esse objeto depois de exibi-lo, você pode setar todas as referências dele para null, e aí o garbage collector faz a festa:

JFrame splashScreen = new JFrame();

/*
 * código que inicializa o frame
 * .........................................
 */

splashScreen.show();

/*
 * agora vc pode descartar o frame:
 */

splashScreen.hide();
splashScreen = null;
Hempx

eu fazeria isso…

setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );

ow de uma olhada em Interface WindowListener na API…

ow apenas chame o metádo dispose(); para fechar a janela…

dukejeffrie

Existe uma diferença entre show() e setVisible(true): um deles é deprecated (e faz tempo). Isso pq eles deixaram os componentes mais Bean-like, então vc lembra que se vc tá setando uma propriedade de um JComponent, vc deve gerar PropertyChangeEvents, e tem que prestar atenção em qual thread tá fazendo isso.

Os componentes Swing são lightweight, isto é, eles se desenham. Mas na AWT, existe uma correspondência entre um componente e algum recurso do SO, nem que seja um window handle.

O método dispose() libera esses recursos. Então, se vc não vai mais usar o JFrame, chame dispose() nele, e tenha certeza de que ele está livre pra coleta, assim ele será coletado assim que possível e pára de receber eventos do SO.

90% das vezes vc não vai notar diferença de performance nenhuma… mas saber que tá tudo bonitinho dentro é legal.

[]s

Criado 13 de março de 2004
Ultima resposta 14 de mar. de 2004
Respostas 4
Participantes 5