280 likes | 361 Views
Prof. Roberto Rosa robertorsci@gmail.com. LINGUAGEM DE PROGRAMAÇÃO VISUAL II. Aula 7. Abrindo apenas um objeto por vez no menu.
E N D
Prof. Roberto Rosa robertorsci@gmail.com LINGUAGEM DE PROGRAMAÇÃO VISUAL II Aula 7
Abrindo apenas um objeto por vez no menu • 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: GUICarroe GUITeste.
Abrindo apenas um objeto por vez no menu • Para abrirmos somente uma janela teremos que implementar a classe InternalFrameListener • Observação: GUI significa - GraphicsUser Interface (Interface gráfica para o usuário) • A Figura a seguir mostra o projeto que utilizei para este tutorial.
Abrindo apenas um objeto por vez no menu • 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.
Abrindo apenas um objeto por vez no menu • 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.
Abrindo apenas um objeto por vez no menu • 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".
Abrindo apenas um objeto por vez no menu • 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.
Implementando os Métodos abstratos • 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
Implementando os Métodos abstratos • Note que não tem código implementado nestes métodos, apenas uma exceção informando que ainda não tem suporte ("Notsupportedyet."). 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.
Implementando os Métodos abstratos • 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("Notsupportedyet.");". Após apagar os throws os métodos ficarão conforme Figura a seguir:
Criando variáveis • 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.
Ajustando os métodos • 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: • privatevoidabrirGuiCarro(){} • privatevoidabrirGuiTeste(){}
Ajustando os métodos • 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:
Adicionando objeto na lista de ouvidores • 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.
FLAG • 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:
Método internalFrameClosed • O método que utilizaremos é o • "publicvoidinternalFrameClosed(InternalFrameEventife){}". • 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.
Método internalFrameClosed • 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 flagGUITestepara false.
Método internalFrameClosed • 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: