2013-02-14 11 views
5

ich habe vier interne frames und 3 tasten in es. Wenn ich die maximierung taste, maximiert aber es überlappt alle frames.Aber mein punkt ist, dass es die minimierten rahmen zeigen sollte. bitte den nachfolgenden Codewie zu minimieren jinternframe oben

package Project; 

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.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.plaf.basic.BasicInternalFrameTitlePane; 
import javax.swing.plaf.basic.BasicInternalFrameUI; 

public class Test { 

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

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        new Test(); 
       } catch (HeadlessException ex) { 
        //Logger.getLogger(MinPanel1.class.getName()).log(Level.SEVERE, null, ex); 
       } catch (PropertyVetoException ex) { 
        // Logger.getLogger(MinPanel1.class.getName()).log(Level.SEVERE, null, 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); 
     createAndAddInternalFrame(jdp, 400, 0); 
     createAndAddInternalFrame(jdp, 600, 0); 


     frame.setVisible(true); 
    } 

    private void createAndAddInternalFrame(final JDesktopPane jdp, int x, int y) throws PropertyVetoException { 
     final JInternalFrame jInternalFrame = new JInternalFrame("Test1", true, true, true, true); 
     jInternalFrame.setLocation(x, y); 
       final JInternalFrame jInternalFrame1 = new JInternalFrame("Test2", true, true, true, true); 
JPanel jp= new JPanel(); 
     JButton jb1 = new JButton("min"); 
     JButton jb2 = new JButton("[]"); 
     JButton jb3 = new JButton("X"); 

     jInternalFrame.setLayout(new GridLayout(2, 2,2,2)); 
     jInternalFrame1.add(jb1); 
     jInternalFrame.setSize(200, 200);//testing 
     jInternalFrame.setLayout(new GridLayout(2,2)); 

     JButton jb= new JButton("min"); 
     // jInternalFrame.add(jb); 
     // jInternalFrame.add(jb3); 
     //jInternalFrame.add(jb2); 
     jp.add(jb); 
     jp.add(jb2); 
     jp.add(jb3); 

     jInternalFrame.add(jp); 
     jb.addActionListener(new ActionListener() 
       { 


      @Override 
      public void actionPerformed(ActionEvent ae) { 
         try { 
          jInternalFrame.setIcon(true); 
         } catch (PropertyVetoException ex) { 
         } 

      } 


     }); 
     jb1.addActionListener(new ActionListener() 
       { 


      @Override 
      public void actionPerformed(ActionEvent ae) { 
         try { 
          jInternalFrame.setIcon(true); 
         } catch (PropertyVetoException ex) { 
         } 

      } 


     }); 
     jb2.addActionListener(new ActionListener() 
     { 


    @Override 
    public void actionPerformed(ActionEvent ae) { 
     try { 
       jInternalFrame.setMaximum(true); 

      } 
     catch(Exception e) 
     { 

     } 

    } 


});jb3.addActionListener(new ActionListener() 
{ 


@Override 
public void actionPerformed(ActionEvent ae) { 
     try { 
      jInternalFrame.dispose(); 
     } catch (Exception ex) { 
     } 

} 


}); 

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


     jInternalFrame.setVisible(true); 
     jInternalFrame1.setVisible(true); 

     jdp.add(jInternalFrame); 
       //jdp.add(jInternalFrame1); 

    } 
} 
+1

schlucken Keine Ausnahmen und weißen Raum sorgfältig mehr verwenden. – trashgod

+0

@trashgod ist das deine Antwort? –

+0

Sobald ich die NPE repariert hat, funktioniert es wie erwartet. – trashgod

Antwort

5

finden Sie könnten versuchen: JDesktopPane#setComponentZOrder(Component com, int i). As per docs:

Verschiebt die angegebene Komponente in den angegebenen z-Ordnung Index im Behälter. Die Z-Reihenfolge bestimmt die Reihenfolge, in der die Komponenten lackiert sind; die Komponente mit den höchsten z-Ordnungsfarben zuerst und die Komponente mit den niedrigsten z-Ordnungsfarben zuletzt. Wenn sich die Komponenten überlappen, überzieht die Komponente mit der unteren z-Reihenfolge die Komponente mit der höheren z-Reihenfolge.

...

Hinweis:

Nicht alle Plattformen unterstützen die z-Reihenfolge von Schwergewichts-Komponenten von einem Behälter in einen anderen ohne Aufruf removeNotify ändern. Es gibt keine Möglichkeit festzustellen, ob eine Plattform dies unterstützt, daher sollten Entwickler keine Annahmen treffen.

Dies ermöglicht es Ihnen, die Reihenfolge der JInternalFrame s innerhalb JDesktopPane enthaltenen einzustellen.

UPDATE:

Per meinem Kommentar:

Von dem, was ich sein, das Standardverhalten und doesnt sehen scheinen durch JDesktopPane#setComponentZOrder(Component com, int i) über com-fähig zu sein, wenn die JInternalFrameist iconified. es funktioniert gut, wenn seine in normalen Zustand

Lösung:

ich die Schicht empfiehlt Einstellung auf dem JInternalFrame maximiert wird angezeigt:

jb2.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent ae) { 
      try { 
       if (jInternalFrame.isMaximum()) {//restore 
        jInternalFrame.pack(); 
       } else {//maximize 
        jInternalFrame.setMaximum(true); 
       } 
       jdp.remove(jInternalFrame); 
       jdp.add(jInternalFrame, JDesktopPane.FRAME_CONTENT_LAYER); 
       jdp.revalidate(); 
       jdp.repaint(); 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 

     } 
    }); 

Wir müssen auch nicht vergessen, fügen Sie es zu dem DEFAULT_LAYER zurück, wenn es minimiert wird:

Hier

ist voll Code:

enter image description here

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.JPanel; 
import javax.swing.SwingUtilities; 
import javax.swing.plaf.basic.BasicInternalFrameTitlePane; 
import javax.swing.plaf.basic.BasicInternalFrameUI; 

public class Test { 

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

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

      } 
     }); 
    } 

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

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

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

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

     frame.setVisible(true); 
    } 

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

     JPanel jp = new JPanel(); 

     JButton jb = new JButton("min"); 
     JButton jb2 = new JButton("max/restore"); 
     JButton jb3 = new JButton("close"); 

     jInternalFrame.setLayout(new GridLayout(2, 2)); 

     jp.add(jb); 
     jp.add(jb2); 
     jp.add(jb3); 

     jInternalFrame.add(jp); 

     jb.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       try { 
        if (jInternalFrame.getLayer() == JDesktopPane.FRAME_CONTENT_LAYER) { 
         jdp.remove(jInternalFrame); 
         jdp.add(jInternalFrame, JDesktopPane.DEFAULT_LAYER); 
         jdp.revalidate(); 
         jdp.repaint(); 
        } 
        jInternalFrame.pack(); 
        jInternalFrame.setIcon(true); 
       } catch (PropertyVetoException ex) { 
        ex.printStackTrace(); 
       } 

      } 
     }); 
     jb2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       try { 
        if (jInternalFrame.isMaximum()) {//restore 
         jInternalFrame.pack(); 
        } else {//maximize 
         jInternalFrame.setMaximum(true); 
        } 
        jdp.remove(jInternalFrame); 
        jdp.add(jInternalFrame, JDesktopPane.FRAME_CONTENT_LAYER); 
        jdp.revalidate(); 
        jdp.repaint(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 

      } 
     }); 
     jb3.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent ae) { 
       try { 
        jInternalFrame.dispose(); 
       } catch (Exception ex) { 
        ex.printStackTrace(); 
       } 

      } 
     }); 

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

     jInternalFrame.pack(); 
     jInternalFrame.setVisible(true); 

     jdp.add(jInternalFrame); 
    } 
} 
+0

Was wäre der Wert von ich? –

+0

@sukant der Index im Container dh alles weniger als die Maxime sollte nach ihm malen –

+0

wenn ich den Indexwert als Null, dann nur funktioniert es .it Gibt Laufzeitfehler für andere Werte.Der Code läuft für Null-Wert, aber meine gewünschte Ausgabe kommt nicht.So fragte ich, was wäre der Wert von i –

4

Hier ist das Ergebnis von moveToBack() in der Maximierungsschaltfläche Handler aufrufen. Denken Sie auch daran, pack() auf dem internen Rahmen aufzurufen.

Nachtrag: Ich habe das Beispiel aktualisiert max, min und Symbol Schaltflächen aufzunehmen. Die Tasten verwenden Action zum einfacheren Testen, und die internen Frames haben unterschiedliche Namen. Siehe createToolBar(), um die L & F dynamisch zu ändern, z.B.

frame.add(createToolBar(frame), BorderLayout.NORTH); 

image

import java.awt.Dimension; 
import java.awt.event.ActionEvent; 
import java.beans.PropertyVetoException; 
import javax.swing.AbstractAction; 
import javax.swing.JButton; 
import javax.swing.JDesktopPane; 
import javax.swing.JFrame; 
import javax.swing.JInternalFrame; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

//* @see https://stackoverflow.com/a/14874924/230513 */ 
public class Test { 

    public Test() { 
     createAndShowGUI(); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new Test(); 
      } 
     }); 
    } 

    private void createAndShowGUI() { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final JDesktopPane jdp = new JDesktopPane() { 

      @Override 
      public Dimension getPreferredSize() { 
       return new Dimension(600, 400); 
      } 
     }; 
     for (int i = 0; i < 4; i++) { 
      createInternalFrame(jdp, 100 * i, 100 * i); 
     } 
     frame.add(jdp); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    private void createInternalFrame(final JDesktopPane jdp, int x, int y) { 
     final JInternalFrame jif = new JInternalFrame("Test" + x, true, true, true, true); 
     jif.setLocation(x, y); 
     JPanel jp = new JPanel(); 
     jp.add(new JButton(new AbstractAction("max") { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       try { 
        jif.setMaximum(true); 
        jif.moveToBack(); 
       } catch (PropertyVetoException e) { 
        e.printStackTrace(); 
       } 

      } 
     })); 
     jp.add(new JButton(new AbstractAction("min") { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       try { 
        jif.setMaximum(false); 
       } catch (PropertyVetoException e) { 
        e.printStackTrace(); 
       } 

      } 
     })); 
     jp.add(new JButton(new AbstractAction("icon") { 

      @Override 
      public void actionPerformed(ActionEvent ae) { 
       try { 
        jif.setIcon(true); 
       } catch (PropertyVetoException e) { 
        e.printStackTrace(); 
       } 
      } 
     })); 
     jif.add(jp); 
     jif.pack(); 
     jif.setVisible(true); 
     jdp.add(jif); 
    } 
} 
+0

Ich habe Ihre [sscce] (http://sscce.org/) neu strukturiert, um mich auf mein Verständnis des Problems zu konzentrieren und das Experimentieren zu vereinfachen. – trashgod

+0

+1 schön und viel einfacher als meins –

+0

@trashgod danke für diese schöne antwort –

Verwandte Themen