Download - LINGUAGEM DE PROGRAMAÇÃO VISUAL II
![Page 2: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/2.jpg)
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: GUICarro e GUITeste.
![Page 3: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/3.jpg)
Abrindo apenas um objeto por vez no menu
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.
![Page 4: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/4.jpg)
Projeto utilizado como exemplo
![Page 5: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/5.jpg)
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.
![Page 6: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/6.jpg)
Exemplo várias janelas abertas ao mesmo tempo
![Page 7: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/7.jpg)
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.
![Page 8: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/8.jpg)
Implementando a classe InternalFrameListener
![Page 9: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/9.jpg)
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".
![Page 10: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/10.jpg)
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.
![Page 11: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/11.jpg)
Implementando os Métodos abstratos
![Page 12: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/12.jpg)
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
![Page 13: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/13.jpg)
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 ("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.
![Page 14: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/14.jpg)
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("Not
supported yet.");". Após apagar os throws os métodos
ficarão conforme Figura a seguir:
![Page 15: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/15.jpg)
Métodos abstratos após aexclusão do conteúdo
![Page 16: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/16.jpg)
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.
![Page 17: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/17.jpg)
Exemplo de criação variáveis booleanas
![Page 18: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/18.jpg)
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:
private void abrirGuiCarro(){}
private void abrirGuiTeste(){}
![Page 19: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/19.jpg)
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:
![Page 20: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/20.jpg)
Adicionando objeto na lista de ouvidores
![Page 21: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/21.jpg)
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.
![Page 22: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/22.jpg)
Código dos métodos
![Page 23: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/23.jpg)
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:
![Page 24: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/24.jpg)
Método internalFrameClosed
![Page 25: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/25.jpg)
Método internalFrameClosed
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.
![Page 26: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/26.jpg)
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 flagGUITeste para false.
![Page 27: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/27.jpg)
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:
![Page 28: LINGUAGEM DE PROGRAMAÇÃO VISUAL II](https://reader036.vdocuments.mx/reader036/viewer/2022062802/56814598550346895db28bab/html5/thumbnails/28.jpg)
Abrindo apenas 1 janela