Aula 7 Prof. Roberto Rosa [email protected] Bom, Conforme prometido, vamos tratar o "bug" que permite abrir várias janelas ao mesmo tempo no nosso sistema. Nesse sistema que utilizei para exemplo temos duas janelas e um Menu Principal que abrirá estas janelas, são elas: GUICarro e GUITeste. Para abrirmos somente uma janela teremos que implementar a classe InternalFrameListener Observação: GUI significa - Graphics User Interface (Interface gráfica para o usuário) A Figura a seguir mostra o projeto que utilizei para este tutorial. Atualmente podemos abrir quantas instâncias quisermos de cada objeto conforme Figura a seguir, porém, isto não é comum. O correto é abrir somente uma instância de cada janela. Vamos começar a tratar este bug. Bom para tratar esse erro, primeiramente abra a "Classe MenuPrincipal" e entre no código-fonte da classe, conforme Figura. Notem onde posicionei o cursor do teclado. Eles encontra-se no lado esquerdo do abre chave da Classe. Na Figura a seguir a chave está na cor amarela. Após posicionar o cursor no local correto, temos que implementar uma Classe abstrata chamada "InternalFrameListener". Para implementar uma classe utilizamos a palavra reservada "implements". Após implementar a Classe, acenderá uma lâmpada indicando que precisamos implementar todos os métodos abstratos dessa Classe. Clique na lâmpada e implemente todos os métodos abstratos. A lâmpada sumirá e aparentemente você não verá nada de novo. Para visualizar os métodos implementados vá até o final da Classe. A Figura a seguir demonstra qual opção devemos escolher após clicar na lâmpada. Após implementar a Classe e os métodos aparecerão métodos no final da Classe conforme Figura a seguir: Métodos abstratos implementdados Note que não tem código implementado nestes métodos, apenas uma exceção informando que ainda não tem suporte ("Not supported yet."). Obs.: Ao lado de cada método o próprio Netbeans coloca um ícone verde. Este ícone informa que estes métodos estão sendo sobrescritos, ou seja, eles existem também na Classe InternalFrameListener. Para não dar nenhum erro, vamos deletar todas essas exceções, ou seja, passe em cada método abstrato e apague o "throw new UnsupportedOperationException("Not supported yet.");". Após apagar os throws os métodos ficarão conforme Figura a seguir: O próximo passo é criar uma variável boolean para cada janela do nosso sistema. No nosso exemplo criaremos apenas 2 atributos(variáveis) na classe, são eles: flagGuiCarro = false flagGuiMotos = false Obs.: Note que estas variáveis estão recebendo "false" indicando que as janelas ainda estão fechadas. Após criar as flags (setando false para todas), vamos ajustar os métodos que são responsáveis por abrir as janelas, são eles: private void abrirGuiCarro(){} private void abrirGuiTeste(){} Quando esses métodos forem chamados eles instanciarão um objeto, colocarão a visibilidade para "true" (verdadeira) e o mais importante, eles setarão a "flag" para true indicando que a janela foi aberta. Após, o objeto que foi instanciado deve ser adicionado na "lista de ouvidores de Listeners", conforme a Figura: Obs.: O if testa se a flagGuiTeste "NÃO" está verdadeira, ou seja, testa se a janela já não está aberta. Se a janela estiver aberta, não acontece nada, caso contrário ele abre a janela. A partir de agora temos um problema, quando a janela abre a flag é passa a ser "verdadeira", porém, quando fechamos a janela ela não muda para "false". Precisamos fazer que essa flag mude para "false" quando a janela for fechada. Para isso vamos utilizar 1 (um) dos métodos abstratos que foram implementados, conforme Figura: O método que utilizaremos é o "public void internalFrameClosed(InternalFrameEvent ife){}". Esse método é responsável por pegar todos eventos de fechamento de qualquer janela InternalFrame. Notem que como parâmetro desse método entra um Evento de InternalFrame, exatamente o que necessitamos. OBS: Em algumas versões do Netbeans, JDK, sistema, o nome do objeto que entra no parâmetro do método muda de "ife" para "e". Quando entra esse evento a única coisa que precisamos fazer é testar qual foi o "InternalFrame" que foi fechado e então setar a flag da janela correspondente para "false". Para realizar esse teste utilizamos um "if" testando se "ife.getInternalFrame()" é uma instância de GuiTeste, se for, nós setamos a flagGuiCarro para false, caso contrário testamos se é uma instância de GUICarro, se for nós setamos a flagGUITeste para false. Após inserir os "ifs" no método "internalFrameClosed()" é só testar o código, eles já está funcionando. Ao abrir o projeto você notará que o sistema permitirá a abertura de apenas uma janela de cada objeto, conforme a Figura: