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

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


Parte 1 - Criando o JFrame



Uma aplicação pode ser dividida em duas categorias: MDI e SDI. Aplicações SDI são compostas de várias telas diferentes, ou seja, cada opção do sistema abre em uma janela diferente. Já as aplicações MDI abrem todas as telas do sistema dentro de uma única janela, tornando a aplicação mais organizada. Para isso utilizaremos, além do JFrame, o JDesktopPane e o JInternalFrame.

Para criarmos uma aplicação MDI temos que criar um JFrame primeiramente. Ele será a janela em que os demais serão abertos. Vamos criar a classe pública Menu do tipo JFrame e implementar ActionListener para que possamos capturar eventos na barra de menus, que abrirá as janelas de cada módulo da aplicação.

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

public class Menu extends JFrame implements ActionListener {

   //cria barra de menu                            
   private JMenuBar     jmPrincipal     = new JMenuBar();

   //cria menu "cadastro" na barra de menu
   private JMenu        jmCadastro      = new JMenu("Cadastros");

   //cria item "cliente" dentro do menu "cadastro"
   private JMenuItem    jmCadCliente    = new JMenuItem("Cliente");
   private JMenuItem    jmCadFornecedor = new JMenuItem("Fornecedor");

   //cria objeto jdPane, do tipo JDesktopPane. Ele vai dentro d JFrame
   public  JDesktopPane jdPane          = new JDesktopPane();

   Tela telaCadCliente, telaCadFornecedor, telaCadProduto;

   //método main instancia o objeto menu A inicialização fica com o construtor da classe
   public static void main(String args[]) {
      Menu menu = new Menu();
   }

O código acima cria uma classe pública chamada Menu, onde colocamos uma barra de menu com a opção "cadastro" (JMenu) e com as opções "cliente" e "fornecedor" (JMenuItem).

Criamos também uma variável jdPane do tipo JDesktopPane e 3 variáveis: telaCadCliente, telaCadFornecedor e telaCadProduto. A variável jdPane será nosso JDesktopPane e as demais serão JInternalFrame. O JDesktopPane será colocado "dentro" do JFrame. Dentro dele serão colocados todos os JInternalFrame que criarmos.

As variáveis telaCadCliente, telaCadFornecedor e telaCadProduto serão do tipo JInternalFrame e serão colocadas dentro do JDesktopPane, fazendo com que elas sejam abertas dentro da janela principal da aplicação. Nossos JInternalFrame são do tipo Tela. Esse é o nome da classe que usaremos para instanciá-los, ou seja, criaremos uma classe do tipo JInternalFrame e instanciaremos quantas telas quisermos. Esse é o lado bom da orientação a objetos :) .

Abaixo temos o construtor da classe Menu que, entre outras tarefas, coloca o JDesktopPane dentro do JFrame.

//método construtor da aplicação
public Menu() {
   //"pegue o conteúdo do painel" - adiciona o jDesktopPane ao JFrame (janela principal
   getContentPane().add(jdPane);

   //adiciona o menu cadastro à barra de menus (jmPrincipal)
   jmPrincipal.add(jmCadastro);

   //adiciona o item cliente ao menu cadastro
   jmCadastro.add(jmCadCliente);

   //adiciona o item fornecedor ao menu cadastro
   jmCadastro.add(jmCadFornecedor);

   //"ajusta" a barra de menu dentro da janela principal
   setJMenuBar(jmPrincipal);

   //adiciona actionlistener ao item "cliente" do menu,
   //para que os eventos sejam tratados
   jmCadCliente.addActionListener(this);

   //adiciona o actionlistener ao item "fornecedor do menu
   jmCadFornecedor.addActionListener(this);

   setSize(800,600);
   setVisible(true);
}

Dica: deixe sempre o setVisible() por último. Assim ele só mostrará a tela quando terminar de criá-la, evitando muitos erros e comportamentos indesejáveis. :)

    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

Linux + Rails + Ruby + Mongrel + PostgreSQL + NetBeans 6 Preview

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

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

Preparando ambiente de desenvolvimento Android no Debian/Ubuntu

GCJ – Conhecendo o compilador Java Livre

  
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
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts