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).
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.
O dispose(); é no JFrame mesmo, tem um JMenuItem chamado Sair, num ta com as nomeações corretas
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.
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?
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.
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.