2013-02-14 6 views
3

세 개의 버튼이 닫고, 최소와 최대가 있습니다.
내가 최대로하고 싶을 때 주 컨테이너의 모양을 취하고 모든 패널을 겹쳐서 닫으면 그 패널 만 영향을받습니다. 하지만 min 버튼을 누르면 작업 표시 줄이 최소화됩니다.
버튼을 최소화하고 메인 프레임 내부에서 최소화되면 internalFrame과 같은 conatiner 내부에 삽입하고 싶습니다. 여기 컨테이너 내부의 패널을 최소화하는 방법

코드입니다

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

내가 생각하는 진정한 internalframe 주장을 다음 버튼을 추가하고 싶지 않아 그 similair 방법은 당신의 마지막 질문에 설명되어 있습니다, 내가 사용하고자하는 BoxLayout (최소, 최대 및 기본 크기를 받아 들일) 또는 GridBagLayout – mKorbel

+0

@ mKorbel 어떤 종류의 레이아웃을 사용해야합니다. 나는 패널 최소화하려는 컨테이너에있는 작업 표시 줄에 아닙니다.이 코드를 실행하고 무슨 뜻인지 이해할 것입니다 –

+0

아이콘 화 된 패널이 최상위 프레임에 추가되는 이유가 있습니까? 'frame.setState (Frame.ICONIFIED)'는 'taskbar'에 대한 플랫폼 의존 메커니즘 일뿐입니다. – oliholz

답변

3

내가 buttons.If을 internalframe를 만든 다음 추가 할 제안 당신이

import java.awt.Dimension; 
import java.awt.GridLayout; 
import java.awt.HeadlessException; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyVetoException; 
import javax.swing.JButton; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.SwingUtilities; 
import javax.swing.plaf.basic.BasicInternalFrameTitlePane; 
import javax.swing.plaf.basic.BasicInternalFrameUI; 

public class MinPanel { 

    public MinPanel() throws HeadlessException, PropertyVetoException { 
     createAndShowGUI(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        new MinPanel(); 
       } catch (HeadlessException ex) { 
       } catch (PropertyVetoException ex) { 
       } 

      } 
     }); 
    } 

    private void createAndShowGUI() throws HeadlessException, PropertyVetoException { 
     JFrame frame = new JFrame(); 
     frame.setResizable(true); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 

     final JDesktopPane jdp = new JDesktopPane() { 
      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(400, 400); 
      } 
     }; 

     frame.setContentPane(jdp); 
     frame.pack(); 

     createAndAddInternalFrame(jdp, 0, 0); 
     createAndAddInternalFrame(jdp, 200, 0); 

     frame.setVisible(true); 
    } 

    private void createAndAddInternalFrame(final JDesktopPane jdp, int x, int y) throws PropertyVetoException { 
     final JInternalFrame jInternalFrame = new JInternalFrame("Test1", false, false, false, false); 
     jInternalFrame.setLocation(x, y); 

     jInternalFrame.setLayout(new GridLayout(2, 2)); 
     jInternalFrame.setSize(200, 200);//testing 
     JButton jb = new JButton("min"); 
     jInternalFrame.add(jb); 
     jb.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       try { 
        jInternalFrame.setIcon(true); 
       } catch (PropertyVetoException ex) { 
       } 

      } 
     }); 
     BasicInternalFrameTitlePane titlePane = (BasicInternalFrameTitlePane) ((BasicInternalFrameUI) jInternalFrame.getUI()).getNorthPane(); 
     jInternalFrame.remove(titlePane); 


     jInternalFrame.setVisible(true); 
     jdp.add(jInternalFrame); 
    } 
} 
+0

+1 아 그렇습니다 정확히 제가 제안했던 것입니다 ... –

+0

OP가 무슨 일이 일어나는지 보여주기 위해 답을 편집했습니다 (즉, JInternalFrame을 작게 만들고 x 및 y 매개 변수를 허용하는 createAndAddInternalFrame을 만드십시오). 기분 전환하시기 바랍니다 –

+0

@DavidKroukamp 감사합니다. –

관련 문제