Java: Usando JInternalFrame de forma elegante

Neste artigo mostro uma forma de usar o JInternalFrame dentro de um JDesktopPane de forma simples e elegante para criar aplicações MDI, onde todas as telas do sistema abrem dentro de uma única janela.

[ Hits: 82.208 ]

Por: Leandro Correa dos Santos em 25/10/2008 | Blog: http://resenhasdefilmes.com.br


Parte 2 - Eventos do Menu



É 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.

Página anterior     Próxima página

Páginas do artigo
   1. Parte 1 - Criando o JFrame
   2. Parte 2 - Eventos do Menu
   3. Parte 3 - A classe Tela
Outros artigos deste autor

Iniciar no Linux sem medo

Live Helper - Crie um Live-CD/DVD Debian CD/DVD

Leitura recomendada

Introdução ao Mundo Java

Redirecionamento de páginas e domínios com Jetty Rewrite Handler

Funções Completas - Comunicação entre aplicações Android e FTP

Trabalhando com a interface gráfica em Java (parte 2)

Configurando e-Gen + Tomcat + JSDK

  
Comentários
[1] Comentário enviado por renangomes em 25/10/2008 - 16:43h

Cara, realmente esse seu método ai de usar os JinternalFrame É bem mais elegante do que a forma altamente desorganizada que eu aprendei. Muito boa sua dica, vou dá uma melhorada nos meus códigos apartir de agora =)
Abraço.
Website: http://www.distribuicoeslinux.com.br

[2] Comentário enviado por f_Candido em 25/10/2008 - 23:32h

Muito bom o artigo, bem explicado, mas também vai direto ao assunto.

Parabéns

[3] Comentário enviado por fredcrs em 07/11/2008 - 09:12h

Olha muito bom o artigo, me ajudou bastante, mas quanto aos ouvintes dos eventos fazer o que você fez não é a melhor prática de OO.
O ideal segundo o livro Java! Use a Cabeça, é implementar uma classe interna para cada evento, inves de usar event.getSource() com o if.
Assim se houver uma alteração no código basta apenas alterar uma das classes internas.
Ate mais!

[4] Comentário enviado por nukelinux em 17/12/2008 - 15:15h

Realmente, fredcrs, essa não é a melhor forma de implementar eventos, mas é a forma mais simples.
A idéia desse artigo é apenas mostrar uma forma de utilizar o JInternalFrame de forma mais eficiente, por isso deixei a implementação dessa forma. Nada impede que o código seja adaptado para utilizar classes internas no tratamento de eventos. Na verdade, também considero a melhor solução.
Eu busquei fazer o tutorial do jeito mais simples, para que seja apenas um "ponto de início", aberto a mudanças e melhorias.

[5] Comentário enviado por staltux em 01/02/2009 - 08:03h

só uma coisa...
se eu crio uma tela ....fecho ela...e tento criar dnovo...nao cria pela segunda vez...
acho que teria de colocar para setar a tela como null quando ela é fechada...nao seria isso?
estranho...quando a janela é fechada o objeto nao é destruido? isso ja deveria bastar para dar um nullPointerExeption, logo deveria bastar para setar a tela como null...fiquei boiando agora...

[6] Comentário enviado por nukelinux em 02/02/2009 - 13:44h

tenta chamar o método setDefaultCloseOperation no construtor da tela da seguinte forma:

public janela(){

super("janela");
setSize(320,200);
setVisible(true);

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

[7] Comentário enviado por hugoramone em 01/03/2009 - 22:08h

eu usava de outra forma, como já comentei com o nuke, realmente neste exemplo não abre mais de uma vez, mesmo usando o setdefault aqui em cima.

[8] Comentário enviado por nukelinux em 02/03/2009 - 13:12h

a melhor forma de fazer isso é implementar o tratamento de eventos na janela. Para isso, podemos utilizar o WindowEvent para realizar uma tarefa quando a janela é fechada. Nesse link há um exemplo de utilização disponibilizado pela sun:

http://java.sun.com/docs/books/tutorial/uiswing/events/windowlistener.html

vou implementar esse código em breve...

[9] Comentário enviado por senhoritaDani em 09/09/2009 - 11:39h


Parabéns pelo artigo esse código me ajudou muito !!
Sou estudante do curso de Sistemas de Informação e tenho muita dificuldade com java!!
Obrigada!!

[10] Comentário enviado por informatos em 02/08/2012 - 00:27h

desculpa a minha ignorancia mas eu tambem sou novato em java e estou tentando chamar nesse menu principal um outro form de fora dessa classe que eu ja tinha criado, o form entra mas nao fica igual aos demais, tem alguma configuração para isso?

[11] Comentário enviado por franckiteixeira1 em 05/06/2015 - 09:26h

Ajuda por favor ..... Não sei muito sobre java.... mais e copiei o codigo ai de cima .... Para tenta aprende ... esta funcionando , mais como faço para implementa ... Tipo assim ...

a JInternalFrame abre ai la dentro tenho uma fomulario de cadastro .

[12] Comentário enviado por nukelinux em 05/06/2015 - 12:57h


franckiteixeira1 vc tem q colocar os elementos do formuário e o layout para organizar eles dentro do JInternalFrame.
Aqui tem um exemplo de como criar esse formulário. Basta adaptar: http://www.vivaolinux.com.br/script/Agenda-em-Java


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts