title: how to minimize a panel inside a container
body: <p>I have three buttons close,min and max. <br>
  When i want to max it then it will take the shape of the main container and overlaps all the panel and when i close it then only that panel gets affected. But when i hit the min button it gets minimized to the task bar which i do not want. <br>
  I want it inside conatiner like that of internalFrame when you click the minimize the button then it gets minimized inside the main frame. </p>
  
  <p>here is the code</p>
  
  <pre><code>package Project;
  
  import java.awt.Color;
  import java.awt.Frame;
  import java.awt.GridLayout;
  import java.awt.event.ActionEvent;
  import java.awt.event.ActionListener;
  import java.awt.event.WindowAdapter;
  import java.awt.event.WindowEvent;
  import javax.swing.JButton;
  import javax.swing.JComponent;
  import javax.swing.JFrame;
  import javax.swing.JLabel;
  import javax.swing.JPanel;
  import javax.swing.SwingUtilities;
  import javax.swing.border.LineBorder;
  
  
  public class MinPanel {
  
      public MinPanel() {
          createAndShowGui();
      }
  
  
      public static void main(String[] args) {
          SwingUtilities.invokeLater(new Runnable() {
              @Override
              public void run() {
                  new MinPanel();
              }
          });
      }
  
      private void createAndShowGui() {
          JFrame frame = new JFrame();
          frame.setSize(300, 500);
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
          final JPanel mainPanel = new JPanel(new GridLayout(2, 2));
  
          for (int i = 0; i &lt; 4; i++) {
              final int num = i;
              OmniPanel op = new OmniPanel(mainPanel, frame) {
                  @Override
                  public JPanel createPanel() {
                      JPanel p = createSimplePanelInterface();
                      p.add(new JLabel("Panel " + (num + 1)));
                      return p;
                  }
  
                  @Override
                  void toPanel() {
                      super.toPanel();
                      System.out.println("Frame requested to be brought to panel");
                  }
              };
              mainPanel.add(op.getPanel());
          }
  
          frame.add(mainPanel);
  
          //frame.pack();
          frame.setVisible(true);
      }
  }
  
  abstract class OmniPanel {
  
      protected JFrame frame;
      protected JPanel panel;
      boolean maximized = false;
      private final JComponent owner;
      private final JFrame ownerFrame;
  
      public OmniPanel(JComponent owner, JFrame con) {
          this.owner = owner;
          initOmniPanel();
          this.ownerFrame = con;
      }
  
      private void initOmniPanel() {
          panel = createPanel();
          createFrame();
          frame.addWindowListener(new WindowAdapter() {
              @Override
              public void windowDeiconified(WindowEvent we) {
                  super.windowDeiconified(we);
                  toPanel();
              }
          });
      }
  
      public JPanel getPanel() {
          return panel;
      }
  
      public JFrame getFrame() {
          return frame;
      }
  
      public boolean goFrame() {
          frame.add(panel);
          frame.pack();
          frame.setState(JFrame.ICONIFIED);
          frame.setVisible(true);
          return true;
      }
  
      protected void createFrame() {
          frame = new JFrame();
          frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      }
  
      void toPanel() {
          frame.remove(panel);
          frame.dispose();
          owner.add(panel);
          owner.revalidate();
          owner.repaint();
      }
  
      public JPanel createSimplePanelInterface() {
          JPanel p = new JPanel();
          JButton close = new JButton("X");
          JButton minimize = new JButton("_");
          JButton maximize = new JButton("[]");
          p.add(close);
          p.add(minimize);
          p.add(maximize);
          close.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent ae) {
                  if (maximized) {
                      maximized = false;
                      ownerFrame.setGlassPane(new JComponent() {
                      });
                      ownerFrame.revalidate();
                      ownerFrame.repaint();
                  } else {
                      removePanelFromOwner();
                      getFrame().dispose();
                  }
              }
          });
          minimize.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent ae) {
                  if (maximized) {
                      maximized = false;
                     ownerFrame.setGlassPane(new JComponent() {
                      });
  
                      owner.add(panel);
                      owner.revalidate();
                      owner.repaint();
                      ownerFrame.revalidate();
                      ownerFrame.repaint();
                  } else {
                      removePanelFromOwner();
                      goFrame();
  
  
                  frame.setState(Frame.ICONIFIED);
                  }
              }
          });
          maximize.addActionListener(new ActionListener() {
              @Override
              public void actionPerformed(ActionEvent ae) {
                  if (maximized) {
                      return;
                  }
                  maximized = true;
                  removePanelFromOwner();
                  ownerFrame.setGlassPane(panel);
                  ownerFrame.revalidate();
                  ownerFrame.repaint();
                  panel.setVisible(true);//
              }
          });
          p.setBorder(new LineBorder(Color.black));
          return p;
      }
  
      private void removePanelFromOwner() {
          owner.remove(getPanel());
          owner.revalidate();
          owner.repaint();
      }
  
      abstract JPanel createPanel();
  }
  </code></pre>