É aqui que está o "pulo do gato". O menu de nosso
JFrame apenas irá chamar nossos JInternalFrames para que sejam abertos dentro do JDesktopPane. Uma tarefa simples, porém nos deparamos com a seguinte situação:
O usuário abre a tela de cadastro de clientes. Em seguida abre a janela de cadastro de fornecedores, que fica a frente da anterior. Logo depois ele deseja abrir a janela de cadastro de clientes novamente e se esquece de que ela já está aberta, então, uma segunda janela de cadastro de cliente é aberta. Isso faz com que o sistema fique desorganizado, ocupando espaço desnecessário de memória etc.
Para tratarmos esse tipo de evento vamos usar a seguinte lógica:
Se a tela já estiver aberta, apenas mova-a para frente das outras janelas, mas se a janela não existir, então crie uma. Para isso utilizaremos o código abaixo:
//tratamento dos eventos de menu
public void actionPerformed(ActionEvent evt) {
//se o evento capturado for uma chamada vinda do item cliente do menu...
if (evt.getSource() == jmCadCliente) {
//se não for null, a tela já está visível, tendo apenas que ser "levada pra frente"
if (telaCadCliente == null)
//instancia a tela de cadastro de clientes
telaCadCliente = new Tela("Cadastro de Cliente", this);
//independente da tela estar visível ou não, a tela é movida para frente
jdPane.moveToFront(telaCadCliente);
}
// mesmo anterior, porém, ocorre quando o evento vêm do item fornecedor do menu...
if (evt.getSource() == jmCadFornecedor) {
if (telaCadFornecedor == null)
telaCadFornecedor = new Tela("Cadastro de Fornecedor", this);
jdPane.moveToFront(telaCadFornecedor);
}
}
Um simples teste if colocado dentro do evento realiza um teste lógico e descobre se a tela ainda não foi criada (se seu valor for null, ela ainda não existe). Caso a tela não exista, ela é criada através da instanciação de um objeto, mas se a tela já existir, ela é apenas movida para frente, com o uso da função jdPane.moveToFront().
O título da janela é passado como parâmetro na instanciação de cada JInternalFrame. O parâmetro this indica a tela principal para o JInternalFrame.