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.