Executando um JInternalFrame em um Container

Cordiais saudações, pessoal do GUJ.

Estou com uma dúvida séria, um item de menu deve acionar uma classe que extende um JInternalFrame, a partir do evento de sua seleção no menu. Utilizando classes JPanel o código fica assim:

miGuiAbas.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        GuiAbas label = new GuiAbas();
        contentPane.removeAll();
        contentPane.add(label);
        contentPane.validate();
    }
});

Note que miGuiAbas é um item de um menu e esse trecho de código aciona a classe GuiAbas, que é uma classe extendida de JPanel. O objeto cotentPane é um Container que é limpo pelo método removeAll(), adiciona o objeto label (que é da clase GuiAbas) e com o método validate() o programa funciona. Mas agora eu quero acionar uma classe que, nada mais é do que uma janela do windows vazia e laranja, com minimizar, maximizar, fechar e alteração de tamanho com o mouse.

Como devo proceder?

Veja abaixo o código da classe GuiFrameInterno:

package cap08;

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

/**
 * @author Ronaldo R. Godoi
 */
public class GuiFrameInterno extends JInternalFrame {
    
    public GuiFrameInterno() {
        inicializarComponentes();
    }
    
    private void inicializarComponentes() {
        setTitle("Usando Frame Interno");
        setSize(300, 100);
        setResizable(true);
        setClosable(true);
        setMaximizable(true);
        setIconifiable(true);
        setBackground(Color.orange);
        setVisible(true);
    }
    
}

Assim eu fiz executar essa classe através de um evento de menu parecido com o evento mostrado no início deste tópico, exemplo do miGuiAbas. O Container vai aceitar a JInternalFrame. Porém não vai permitir que eu altere o tamanho da janela com o mouse, também não vai permitir que eu minimize a janela, ou maximize. A janela (usando Container) vai ter um tamanho fixo e só vai aceitar o comando de fechar.

Uma solução é declarar o objeto contentPane como JDesktopPane, ao invés de Container. Isso resolve meus problemas com o JInternalFrame que passa a funcionar completamente (minimizar, maximizar, alterar tamanho, etc) porém a classe do menu sofrendo essa alteração não permite que as outras classes que usam este menu sejam acionadas. Isto porque são classes que extendem a classe JPanel e não JInternalFrame. As classes JPanel não estão funcionando como o objeto contentPane sendo JDesktopPane. Essas classes (JPanel) precisam que esse objeto seja Container.

Assim, ou eu funciono apenas a janela de (JInternalFrame) ou eu funciono todos os outros exemplos de classes que extendem o JPanel.

E aí como eu resolvo isso, para funcional tanto JPanel como JInternalFrame?

Atenciosamente, grato,
Ronaldo

P.S.: Segue abaixo o código do menu com todos os tratamentos de eventos e nomes das classes que deixam de funcionar.

package cap08;

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

/**
 *
 * @author Ronaldo R. Godoi
 */
public class GuiMenuPrincipal extends JFrame {
    
    private JDesktopPane contentPane;
    private JMenuBar mnBarra;
    private JMenu mnArquivo, mnExemplos;
    private JMenuItem miSair, miBotao, miCaixaSelecao, miGuiRadio,
            miGuiLabel, miGuiLista, miGuiListaComFotos, miGuiCombo,
            miGuiAreaDeTexto, miGuiDialogoMensagem, 
            miGuiDialogoConfirmacao, miGuiDialogoOpcao, miGuiBarraRolagem,
            miGuiBarraProgresso, miGuiAbas, miGuiFrameInterno;
    
    public GuiMenuPrincipal() {
        inicializarComponentes();
        definirEventos();
    }
    
    private void inicializarComponentes () {
        setTitle("Menu Principal");
        setBounds(0, 0, 1000, 800);
        // contentPane = getContentPane() Essa linha não poderia ser comentário
        contentPane = new JDesktopPane(); // linha nova (não permite que outras classes funcionem)
        setContentPane(contentPane); // linha nova (não permite que outras classes funcionem)
        mnBarra = new JMenuBar();
        mnArquivo = new JMenu("Arquivo");
        mnArquivo.setMnemonic('A');
        mnExemplos = new JMenu("Exemplos");
        mnExemplos.setMnemonic('E');
        miSair = new JMenuItem("Sair", new ImageIcon("c:/icones/sair2.jpg"));
        miSair.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, ActionEvent.ALT_MASK));
        miBotao = new JMenuItem("Botao");
        miGuiRadio = new JMenuItem("Radio Button para sexo")
        miCaixaSelecao = new JMenuItem("Caixa Seleção");
        miGuiLabel = new JMenuItem("Formatação de Labels e Imagens");
        miGuiLista = new JMenuItem("Calcula valor com desconto");
        miGuiListaComFotos = new JMenuItem("Lista com Fotos");
        miGuiCombo = new JMenuItem("GUI Combo dos Estados do Sudeste");
        miGuiAreaDeTexto = new JMenuItem("GUI área de texto (teste de editor)");
        miGuiDialogoMensagem = new JMenuItem("Exemplos de JOptionPane.showMessageDialog");
        miGuiDialogoConfirmacao = new JMenuItem("Exemplos de JOptionPane.showConfirmDialog");
        miGuiDialogoOpcao = new JMenuItem("Exemplos de JOptionPane.showOptionDialog");
        miGuiBarraRolagem = new JMenuItem("Barra de Rolagem");
        miGuiBarraProgresso = new JMenuItem("Barra de Progresso");
        miGuiAbas = new JMenuItem("Abas em um JPanel");
        miGuiFrameInterno = new JMenuItem("GUI Frame Interno")
        mnArquivo.add(miSair);
        mnExemplos.add(miBotao);
        mnExemplos.add(miCaixaSelecao);
        mnExemplos.add(miGuiRadio);
        mnExemplos.add(miGuiLabel);
        mnExemplos.add(miGuiLista);
        mnExemplos.add(miGuiListaComFotos);
        mnExemplos.add(miGuiCombo);
        mnExemplos.add(miGuiAreaDeTexto);
        mnExemplos.add(miGuiDialogoMensagem);
        mnExemplos.add(miGuiDialogoConfirmacao);
        mnExemplos.add(miGuiDialogoOpcao);
        mnExemplos.add(miGuiBarraRolagem);
        mnExemplos.add(miGuiBarraProgresso);
        mnExemplos.add(miGuiAbas);
        mnExemplos.add(miGuiFrameInterno);
        mnBarra.add(mnArquivo);
        mnBarra.add(mnExemplos);
        setJMenuBar(mnBarra);
    }
    
    private void definirEventos() {
        miSair.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        
        miBotao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                // aqui vai o código para chamar o exemplo 8.3
                GuiBotao botao = new GuiBotao();
                contentPane.removeAll();
                contentPane.add(botao);
                contentPane.validate();
            }
        });
        
        miCaixaSelecao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiCaixaOpcao label = new GuiCaixaOpcao();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miGuiRadio.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiRadio label = new GuiRadio();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miGuiLabel.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiLabel label = new GuiLabel();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miGuiLista.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiLista label = new GuiLista();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });

        miGuiListaComFotos.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiListaComFotos label = new GuiListaComFotos();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miGuiCombo.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiCombo label = new GuiCombo();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });

        miGuiAreaDeTexto.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiAreaDeTexto label = new GuiAreaDeTexto();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });

        miGuiDialogoMensagem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiDialogoMensagem label = new GuiDialogoMensagem();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });

        miGuiDialogoConfirmacao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiDialogoConfirmacao label = new GuiDialogoConfirmacao();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miGuiDialogoOpcao.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiDialogoOpcao label = new GuiDialogoOpcao();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });

        miGuiBarraRolagem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiBarraRolagem label = new GuiBarraRolagem();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });

        miGuiBarraProgresso.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiBarraProgresso label = new GuiBarraProgresso();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miGuiAbas.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiAbas label = new GuiAbas();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
        miGuiFrameInterno.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                GuiFrameInterno label = new GuiFrameInterno();
                contentPane.removeAll();
                contentPane.add(label);
                contentPane.validate();
            }
        });
        
    }
    
    public static void abrir() {
        GuiMenuPrincipal frame = new GuiMenuPrincipal();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension tela = Toolkit.getDefaultToolkit().getScreenSize();
        frame.setLocation((tela.width - frame.getSize().width) / 2,
                (tela.height - frame.getSize().height) / 2);
        frame.setVisible(true);
    }
    
}

JInternalFrame só pode ser adicionado dentro de JDesktopPane.
Sempre leia a documentação HTML das classes que você utiliza.

1 curtida