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: 80.089 ]

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


Parte 3 - A classe Tela



Essa é a classe do tipo JInternalFrame que usaremos para instanciar as demais.

Dois parâmetros são passados durante a instanciação. O primeiro é o título da janela. O segundo indica a classe pai dos objetos que serão instanciadas por essa classe.

Vejamos o código da classe Tela:

class Tela extends JInternalFrame {

   //classe pai dos objetos que serão instanciadas por essa classe
   private Menu telaPrincipal;

   //método construtor da tela
   public Tela(String titulo, Menu telaPrincipal) {

      //reescreve o método construtor da classe pai, ajustando o título da janela (neste caso)
      super(titulo,true,true,true,true);

      setSize(300,200);
      setVisible(true);

      this.telaPrincipal = telaPrincipal;

      telaPrincipal.jdPane.add(this);
   }

}

O título é usado no construtor pelo método super(), que sobrescreve o construtor da classe pai, alterando assim o título da página. Os quatro "true" ativam os botões minimizar/maximizar, restaurar e fechar de cada JInternalFrame.

Abaixo está o código completo e sem os comentários:

import java.awt.event.*;
import javax.swing.*;

public class Menu extends JFrame implements ActionListener {

   private JMenuBar jmPrincipal = new JMenuBar();
   private JMenu jmCadastro = new JMenu("Cadastros");
   private JMenuItem jmCadCliente = new JMenuItem("Cliente");
   private JMenuItem jmCadFornecedor = new JMenuItem("Fornecedor");

   public JDesktopPane jdPane = new JDesktopPane();

   Tela telaCadCliente, telaCadFornecedor, telaCadProduto;

   public static void main(String args[]) {
      Menu menu = new Menu();
   }

   public Menu() {
      getContentPane().add(jdPane);
      jmPrincipal.add(jmCadastro);
      jmCadastro.add(jmCadCliente);
      jmCadastro.add(jmCadFornecedor);
      setJMenuBar(jmPrincipal);
      jmCadCliente.addActionListener(this);
      jmCadFornecedor.addActionListener(this);
      setSize(800,600);
      setVisible(true);
   }

   public void actionPerformed(ActionEvent evt) {

      if (evt.getSource() == jmCadCliente) {
         if (telaCadCliente == null)
            telaCadCliente = new Tela("Cadastro de Cliente", this);

         jdPane.moveToFront(telaCadCliente);
      }

      if (evt.getSource() == jmCadFornecedor) {
         if (telaCadFornecedor == null)
            telaCadFornecedor = new Tela("Cadastro de Fornecedor", this);

         jdPane.moveToFront(telaCadFornecedor);
      }
   }
}

class Tela extends JInternalFrame {

   private Menu telaPrincipal;

   public Tela(String titulo, Menu telaPrincipal) {
      super(titulo);
      setSize(300,200);
      setVisible(true);

      this.telaPrincipal = telaPrincipal;
      telaPrincipal.jdPane.add(this);
   }
}

É isso aí. Espero que o artigo seja útil.
T+

Página anterior    

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

Trabalhando com a interface gráfica em Java

JABACO => Java + Visual Basic 6

GCJ – Conhecendo o compilador Java Livre

Desenvolvendo aplicações Web 2.0 com Java e AJAX (FrameWork DWR)

Preparando ambiente de desenvolvimento Android no Debian/Ubuntu

  
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