Boa tarde a todos.
A dica do nosso amigo Leonhard32 está quase boa, e digo isto que faltou só um pequeno detalhe, pois com a dica dele voltamos ao mesmo problema da ocupação de memória.
Outra coisa que reparei é que não vi nenhum JDesktopPane declarado, pois JInternalFrames funcionam melhor com JDesktopPane que é um Panel container de JInternalFrames, ou seja, uma janela para JInternalFrames. Portanto declare um JDesktopPane no JFrame principal desta forma:
public class JFPrincipal extends JFrame {
....
private JDesktopPane mainpanel;
public JFPrincipal(){
......
mainpanel = new JDesktopPane();
setContentPane(mainpanel);
....
}
.....
}
Se a sua lógica é quando chamar um Frame, instânciá-lo na hora, e quando abrir outro e fechar o frame atual e retirá-lo da memória, ou seja, voce queira que só um Frame esteje em memória por vez, no momento em que o usa então vejamos:
public class JFPrincipal extends javax.swing.JFrame {
private void verificaTelas(){
if(jFEstoque!=null && jFEstoque.isVisible()){
jFEstoque.setVisible(false); // Este método coloca o frame invisível porém não o retira da memória.
mainpanel.remove(JFEstorque);
JFEstoque.dispose();
JFEstoque = null;
}
if(jFFluxoCaixa!=null && jFFluxoCaixa.isVisible()){
jFFluxoCaixa.setVisible(false);
mainpanel.remove(JFFluxoCaixa);
JFFluxoCaixa.dispose();
JFFluxoCaixa = null;
}
}
private void menuFluxoCaixaActionPerformed(java.awt.event.ActionEvent evt) {
verificaTelas();
if(jFFluxoCaixa==null){
jFFluxoCaixa = new JFFluxoCaixa();
mainpanel.add(jFFluxoCaixa);
jFFluxoCaixa.setVisible(true);
}
}
private void menuEstoqueActionPerformed(java.awt.event.ActionEvent evt) {
verificaTelas();
if(jFEstoque==null){
jFEstoque= new JFEstoque();
mainpanel.add(jFEstoque);
jFFluxoCaixa.setVisible(true);
}
}
private JFFluxoCaixa jFFluxoCaixa;
private JFEstoque jFEstoque;
}
Repare que no ActionPerformed de cada evento de JInternalFrame, estou invocando primeiramente o método verificaTelas(), isto porque, se for invocado depois de ter sido instanciado o JInternalFrame que voce quer abrir, este método o fechará depois, e voce não conseguiria ver o JInternalFrame.
Um abraço.