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:
Download

LINGUAGEM DE PROGRAMAÇÃO VISUAL II