Destruir JInternalFrame

Ae Galerinha!! Blza?

Então estou com um probleminha com esse JInternalFrame.
Aprendi a mexer com ele ontem, só que eu abro ele normal, fecho ele, e abro dinovo, dae ele num abre, fiz uns testes, ele fica aberto, tipo num é destruido, como faço pra destruir ele quando clicar no “X”?

Ta de seguinte forma:

Classe inicial tem um JMenuBar que tem um JMenuItem chamado Funcionario, dae ele abre o JInternalFrame que esta numa outra classe (outro arquivo).

Aqui estão as classes:
Classe Inicial
http://pastebin.com/m1b5ab0fd

Classe addFuncionarios
http://pastebin.com/m3ed339e9

Agradeço desde já!

jhoey, olhando por auto o seu códgio, vejo que voce está dando uns vacilos.

if(event.getSource() == Sair){ dispose(); }
Vc tá dando dispose em quê mesmo?No seu JFrame???
Consideradno que vc tem uma váriavel desse tipo:
addFuncionarios consulta; que extende JInternalFrame, e implementa InternalFrameListener, eu faria assim na sua classe Inicial:

[code]
//método responsável pela criação da tela de consulta de dados
private void exibirConsulta(ActionEvent evt) {
if (consulta == null) {
// inicia frame interno
consulta = new addFuncionarios(this);
// adiciona o internalFrame no DesktopPane
desktop.add(consulta);
}
// Exibe o frame
consulta.setVisible(true);
}

//é público para poder ser executado por outra classe
public void fecharConsulta(ActionEvent evt) {
// verifica se há uma referencia válida para o objeto
if (consulta != null) {
// libera o objeto
consulta.dispose();
consulta = null;
}
} [/code]
E na sua addFuncionarios poria um construtor assim:

public addFuncionarios (Inicial i){//recebe uma referência da classe Inicial super("Funcionarios blablabla SA..."); this.i=i; iniciarSeusComponentes();//chama o método... }
Isso amarra a sua internalframe a sua classe Inicial.
E não use nomes de classes em minúsculas!!!
Bem-vindo ao GUJ. :wink:

Brigado pelo Bem-Vindo.

O dispose(); é no JFrame mesmo, tem um JMenuItem chamado Sair, num ta com as nomeações corretas :frowning:

Mas eu quero que quando ele saia destrua ele, e se o usuário apertar no JMenuItem pra abrir ele denovo, se ele estiver aberto ele dar um moveToFront();
Se estiver fechado “null” montar ele novamente.

Agradeço a ajuda.

[code]import javax.swing.*;
/**

  • Classe que verificia se um JInternalframe está ou não está instanciado na tela.

  • Deste modo é possível instanciar somente uma janela de cada tela.

  • @version 1.0 20 Feb 2009

  • @author VAGNER
    */
    public class VerificaFrame{

    public VerificaFrame() {
    }

    /**

    • Método que faz a verificação
    • @param jDesktopPane jDesktopPane da aplicação
    • @param frame Frame a ser verificado
    • @return valor True se o Frame estiver instanciado
      */
      public static Boolean verificaFrame(JDesktopPane jDesktopPane,JInternalFrame frame) { //construtor recebe o JDesktopPane e o JInternalFrame que deseja verififcar
      Boolean valor = false;
      JInternalFrame[] results;
      results = jDesktopPane.getAllFrames(); // Retorna rodos os frames em um vetor
      for (int i = 0 ; i < results.length ; i++){
      if( results[i].equals(frame) ){ //se o frame pesquisado estiver na tela, retornar true
      valor = true;
      break;
      }
      }
      return valor;
      }

} [/code]

Criei essa classe para verificar se um JInternalFrame está ou não aberto, desse modo ele não permite que você abra duas instancias do mesma tela.
Antes de você instanciar o JInternalFrame, coloque um if e use o método verificarframe para checkar se ele está ou não aberto. Depois você instancia ele normal e adiciona ao JDesktopPane da aplicação!

VagnerMG, valeu pela classe… estava procurando isso mesmo.

Agora só uma dúvida, como que faço para exibir o JInternalFrame que já existe?
Consegui verificar, mas se ele estiver atrás de outros JInternalFrame, ou até mesmo minimizado, como faço para reposicionar ele novamente no centro da tela, na frente dos outros frames?

Obrigado.
Alexander

Olá amigo

no seu frame principal coloca assim:

static FrameClientes frameClientes;
    protected void createFrameClientes() throws PropertyVetoException, Exception {

        if (frameClientes == null) {
            frameClientes = new FrameClientes();
            frameClientes.setVisible(true); 
            desktop.add(frameClientes);
            frameClientes.pack();
            desktop.getDesktopManager().maximizeFrame(frameClientes);
        } else {
            frameClientes.setVisible(true);
        }
        try {
            frameClientes.setSelected(true);
        } catch (java.beans.PropertyVetoException e) {
        }
    }

já no teu internal frame assim:

public void FecharForm() throws Exception {
     this.dispose();
     FramePrincipal.frameClientes = null;
}

ao clicar novamente no menu menu que deseja ele irá verificar se já está instanciado, caso positivo, exibirá.

Silvio Guedes

Silvio, funcionou direitinho, só tenho uma dúvida, para funcionar tive que colocar no netbeans a opção defaultCloseOperation como HIDE, então entendo que ele somente está escondendo a tela, e não fechando ela.

Quero saber agora onde e como invoco o método FecharForm()?
Estou usando o netbeans e as ferramentas dele, não estou escrevendo o código todo.

Mais uma vez obrigado.

Olá amigo

ok. Crie um botão fechar e ajuste o evento para ele. No lugar de botoesRodaPe.jButtonFechar.addActionListener coloque:

SeubotãojButtonFechar.addActionListener

public void inicializarEventosBotoes() throws Exception {
       
//  Button Fechar
    botoesRodaPe.jButtonFechar.addActionListener(new java.awt.event.ActionListener() {
    public void actionPerformed(java.awt.event.ActionEvent evt) {
        jButtonFecharActionPerformed(evt);
    }
    });
}
public void jButtonFecharActionPerformed(java.awt.event.ActionEvent evt) {                                                       
// TODO add your handling code here:
  try {
      FecharForm();
  } catch (Exception ex) {                                                    
      Logger.getLogger(SeuFrameo.class.getName()).log(Level.SEVERE, null, ex);
  }
}

Silvio Guedes

Silviogs, pelo botão conforme vc passou eu consegui, agora como faço isso pelo botão padrão de fechamento da janela [X] ? Qual evento e onde está esse evento?

Senão vou ter que desabilitar isso e permitir que seja fechado somente pelo botão que eu colocar.

Obrigado novamente.