Visual – JDesktopPane – JInternalFrame – Multiple Document Interface – Java

Publicado: 2 de maio de 2014 em Java

Em interface gráfica do usuário (GUI), uma interface de documentos múltiplos, ou MDI, acrônimo para Multiple Document Interface é um método de organização de aplicações gráficas em janelas que residem em uma única janela, a janela principal da aplicação. A única exceção são possíveis janelas modais da aplicação.

Com múltiplas interfaces de documentos, uma única barra de menu e / ou barra de ferramentas é compartilhado entre todas as janelas filho, reduzindo a desordem e uma utilização mais eficiente do espaço na tela. As janelas filho de um aplicativo pode ser ocultada / mostrada / minimizada / maximizada como um todo. Os autores de aplicações multi-plataforma podem fornecer a seus usuários um comportamento consistente da aplicação entre plataformas.

Interface de Múltiplos Documentos

Interface de Múltiplos Documentos

JDesktopPane

É um recipiente utilizado para criar uma interface de documentos múltiplos ou uma área de trabalho virtual. Você cria objetos JInternalFrame e adicioná-los ao JDesktopPane. A classe JDesktopPane estende o  JLayeredPane para gerenciar os quadros internos potencialmente sobrepostos. Ele também mantém uma referência a uma instância de DesktopManager que é definido pela classe UI para o Look and Feel da aplicação.

JInternalFrame

Um objeto leve que fornece muitas das características de uma estrutura nativa, incluindo arrastar, fechar, mostrar um ícone, redimensionar, exibir títulos, e também possui suporte para uma barra de menus.

Exemplo:

Neste exemplo criamos um formulário MDI básico e um menu.

Java

Classe – Janela Pai


import javax.swing.JDesktopPane;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JMenuBar;
import javax.swing.JFrame;
import javax.swing.KeyStroke;

import java.awt.event.*;
import java.awt.*;


public class FormularioMdi extends JFrame implements ActionListener
{
	// Declara componetes
    JDesktopPane painel;

    public FormularioMdi() 
    {
    	// herda classe
    	super("Java - Formularios - MDI - JFrame / JDesktopPane / JInternalFrame");
        
    	// Define tamanho da janela principal
        int bordas = 50;
        Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();
        setBounds(bordas, bordas, tela.width  - bordas *2 , tela.height - bordas *2);
        
        // Cria painel principal
        painel = new JDesktopPane(); 
        painel.setBackground(Color.LIGHT_GRAY);
                
        setContentPane(painel);
        setJMenuBar(createMenuBar());        
    }

    protected JMenuBar createMenuBar()
    {
    	// Cria barra de menu
        JMenuBar barra = new JMenuBar();
        
        // Cria menu
        JMenu menu = new JMenu("Formularios");        
        barra.add(menu);

        // Cria itens dos menus
        JMenuItem item = new JMenuItem("Novo");
        item.setActionCommand("novo");
        item.addActionListener(this);
        menu.add(item);

        //Cria segundo item
        item = new JMenuItem("Sair");
        item.setActionCommand("sair");
        item.addActionListener(this);
        menu.add(item);

        return barra;
    }

    
    public void actionPerformed(ActionEvent e) 
    {
    	// Cria eventos do menu
        if (e.getActionCommand() == "novo")
        { 
            criaFormulario();
        } 
        else 
        {
            sair();
        }
    }

    protected void sair() 
    {
    	// Fecha sistema
        System.exit(0);
    }
    
    protected void criaFormulario()
    {
    	// Cria formulario filho
    	FormularioFilho frame = new FormularioFilho();
        frame.setVisible(true); 
        
        // Adiciona janela filho na janela pai
        painel.add(frame);
        try 
        {
        	// Seta foco
            frame.setSelected(true);
        }
        catch (java.beans.PropertyVetoException e)        
        {
        	
        }
    }
       
    
    private static void criaGUI() 
    {     
    	// Decora barra da janela
    	JFrame.setDefaultLookAndFeelDecorated(true);

    	// Cria formulario filho     
        FormularioMdi formulario = new FormularioMdi();
        formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
        // Exibe formulario
        formulario.setVisible(true);
    }

    public static void main(String[] args)
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
            public void run() 
            {
            	// Chama GUI
                criaGUI();
            }
        });
    }
}

Classe – Janela Filho

import java.awt.Container;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

public class FormularioFilho extends JInternalFrame
{   
	// Declara componentes
	JLabel rotulo;
	JTextField campo;
	JButton botao;
	
	// Declara variaveis
	static int formulario = 0;
    static int posicao = 30;
    
    public FormularioFilho()
    {    	
    	// Herda da classe filho
    	super("Formulario Filho - Instancia :" + (++formulario), true, true, true, true);

    	// Cria painel
        setContentPane(criaPainel());
    	pack();
        
    	// Define posição do formulario
        setLocation(posicao * formulario, posicao * formulario);        
        
    }
    
    public Container criaPainel()
    {
    	// Cria painel
    	JPanel painel = new JPanel(); 
    	
    	// Define layout
    	painel.setLayout(new BoxLayout(painel, BoxLayout.PAGE_AXIS));
		painel.setBorder(BorderFactory.createEmptyBorder(20,20,20,20));
		
		// Cria componentes
		rotulo = new JLabel("Digite Seu nome:");
		campo = new JTextField();
		botao = new JButton("Ok");
		
		// define tamanho do campo
		campo.setPreferredSize(new Dimension(300,20));
		
		// Adiciona componentes ao painel	
		painel.add(rotulo);		
		painel.add(Box.createVerticalStrut(10));
		painel.add(campo);
		painel.add(Box.createVerticalStrut(20));
		painel.add(botao);
    	
    	return painel;
    }
    
    private static void criaGUI() 
    {
    	// Cria GUI (Janela Filho)
        JFrame.setDefaultLookAndFeelDecorated(true);
     
        FormularioMdi formulario = new FormularioMdi();
        formulario.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     
        // Exibe formulario
        formulario.setVisible(true);
    }

    public static void main(String[] args)
    {
        javax.swing.SwingUtilities.invokeLater(new Runnable()
        {
            public void run() 
            {
            	// Chama GUI
                criaGUI();
            }
        });
    }
}
comentários
  1. Rene disse:

    Ola. estou aprendendo java. Gostaria de saber como faço a barra inferior da janela onde aparece um botão correspondente a cada janela aberta? E como ao fechar a janela retirar esse botão da barra?

    • Olá Rene,

      O que vc procura se chama Status Bar, infelizmente o Java Swing não possui uma barra de status nativa, você precisa implementa-la,

      Você pode procurar por Status Bar no Google que achará varios exemplos de como implementa-la e como usar em janelas filhas, como não é um recutso nativo do Swing e sempre seguimos as documentações oficiais, não temos um exemplo neste blog.

      Espero ter ajudado,
      Abraço.

Deixe um comentário