Pessoal,
Estou utilizando JInternalFrame em uma aplicação e aindei pesquisando sobre
isso na net (google), onde encontrei algums comentários sobre problemas
com liberação de memória apos dar um dispose() nesse tipo de objeto.
Parece que o Garbage Colector não remove o JInternalFrame da memória
por estar ligado ao container e a eventos, etc.
Tenho uma situação onde uma classe JFrame instancia um JInternalFrame,
armazenando em um objeto dessa classe.
No JInternalFrame, quando o usuário finaliza o componente, tenho um
simples dispose(), que não altera a referência da classe JInternalFrame
para null, como eu esperava que fizesse.
A conseqüência disso é que na classe JFrame a referência da classe
JInternalFrame também não fica null.
Então, quando verifico se a classe JInternalFrame é null para cria-la
(a fim de criar apenas uma instância) ela sempre retorna a
referência anterior, ao invés de null, evitando que uma nova instância
de JInternalFrame seja criada e não trazendo a anterior, pois teóricamente
teria sido removida com o dispose().
Voltando ao assunto da pesquisa que fiz com o google:
https://lists.xcf.berkeley.edu/lists/advanced-java/1999-November/003014.html
http://www.javahelp.org/JInternalFrame_not_disposing-[telefone removido]-a.html
http://www.google.com.br/search?q=jinternalframe+dispose&hl=pt-BR&lr=&ie=UTF-8&start=10&sa=N
Citação retirada do primeiro link acima:
“Yes, JInternalFrames r not garbage collected properly, First of all remove
all the listeners frm the components, use ‘removeAll()’ method for every
container added on the internalframe even frm the ‘Container’ which u get
thru
getContentPane() method then dispose and set it to null, minimise the use of
anonymous classes. It will be better if u check the code thru OptimizeIt it
will help u know which classes r not getting GC.”
Achei que isso ficou um pouco vago e gostaria que alguém com mais
experiência na utilização destes componentes expressasse sua
opinião.
Será que utilizando no JInternalFrame a seqüência:
getContentPane().remove(this);
removeAll();
dispose();
estaria correto? Seria necessário tudo isso?
Existe uma forma de finalizar o JInternalFrame (nele mesmo) e transformar
sua referência em null a fim de reutilizar a referência deste objeto na
classe JFrame para criar uma nova instância quando necessário?
Outras sugestões?
[]'s
Robert
