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.
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();
}
});
}
}



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.
Muito obrigado pela dica Ricardo, vou pesquisar.