Como garanto que tirei da memoria o JInternalFrame quando fecho ele?

6 respostas
jomello_br

Olá amigos, pela primeira vez, estou tentando desenvolver um programa Desktop pelo JAVA :slight_smile:

Mas como estou acostumado com o Delphi, eu pergunto?

Criei um JDesktopFrame com um JMenu que chama dentro dele um form JInternalFrame, quando clico no botão X (Close) ele fecha esse meu form ou somente “esconde ele” e deixa ele na memoria?

Se sim, qual o comando para eu dar um Destroy nele e claro quando clicar no menu ele recriar ele novamente?

Desde já agradeço qualquer ajuda

Abraços

Jomello

6 Respostas

Trebloc

Você pode definir assim:

JInternalFrame meuFrame = ...;
meuFrame.setDefaultCloseOperation(JInternalFrame.DISPOSE_ON_CLOSE);
...

Esse método setDefaultCloseOperation define qual ação será tomada quando o frame for fechado. Todas as ações possíveis você pode encontrar aqui:

http://java.sun.com/javase/6/docs/api/javax/swing/WindowConstants.html

O DISPOSE_ON_CLOSE, no caso, diz que a janela deverá ser destruída quando for fechada. Se isso não estiver acontecendo, mas ela estiver sumindo, provavelmente está definido como HIDE_ON_CLOSE, que apenas esconde a janela, sem destruí-la. :wink:

E as WindowConstants são compatíveis com todos os tipos de frames existentes, creio eu.

Opcionalmente, você pode usar o método dispose juntamente com um ouvinte:

JInternalFrame meuFrame = ...;
meuFrame.addInternalFrameListener(
    new InternalFrameAdapter()
    {
        @Override
        public void internalFrameClosed(InternalFrameEvent e)
        {
            // removeAll();
            dispose();
        }
    }
);

Isso significa que, quando a janela for fechada, também deverá ser destruída.

ViniGodoy

O dispose libera os recursos do JInternalFrame relacionados ao sistema de janelas. Entretanto, todos os objetos java criados para representar a janela ainda existem.

Para liberar um JFrame, JDialog ou JInternalFrame da memória você:
a) Fecha ele com dispose();
b) Define sua variável para null.

A lógica é a mesma de qualquer objeto java. Para haver garbage collection de um objeto qualquer, inclusive janelas, nenhuma referência pode estar apontando para essa janela.

Muito cuidado com listeners, em aplicações gráficas. Alguns deles podem apontar para usa janela também. Não é o caso de listeners de botões, mas se você tiver threads que atualizam a tela periodicamente, por exemplo, pode ser necessário parar essa thread também.

Trebloc

Vini, no caso dos listeners, quando o frame sofre dispose, eles também são disponibilizados para o Garbage Collector, não?

ViniGodoy

Não, eles fazem parte da parte java do código. O dispose só vai liberar os recursos da janela junto ao SO.
A parte Java fica intacta.

jomello_br

Obrigado amigos, pela grande ajuda :slight_smile:

Vini, eu li os itens sobre o Jtable, mas fiquei com uma duvida.

Como faço para criar um JTable com paginação e Master/Detail?

Eu tenho uma tabela de 1 milhão de registros ok.

Abraços

Jomello

ViniGodoy

No Swing padrão não tem nada pronto para isso. :cry:

Criado 16 de abril de 2010
Ultima resposta 19 de abr. de 2010
Respostas 6
Participantes 3