2009-07-08 8 views
2

Wenn ich ein Layout auf JFrame mit setLayout setze und es dann mit getLayout abrufen, dann bekomme ich einen anderen LayoutManager. Was geht hier vor sich??Warum ist das JFrame-Layout nicht das, das ich einstelle?

public class Lay { 
    public static void main(String[] args) { 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       java.awt.Container container = 
        new javax.swing.JFrame(); 
        //new javax.swing.JPanel(); 
       java.awt.LayoutManager layout = 
        new java.awt.GridLayout(); 
       container.setLayout(layout); 
       layout = container.getLayout(); 
       System.err.println(layout); 
      } 
     }); 
    } 
} 

Gibt

java.awt.BorderLayout[hgap=0,vgap=0] 

aber wenn ich JFrame mit JPanel ersetzen ich

java.awt.GridLayout[hgap=0,vgap=0,rows=1,cols=0] 

Antwort

11

Vom Java API for JFrame:

public void setLayout(LayoutManager manager) 

Setzt die LayoutManager. Überschrieben, um den Anruf an die contentPane bedingt weiterzuleiten. Weitere Informationen finden Sie unter RootPaneContainer.

Und von der RootPaneContainer Seite:

Diese Schnittstelle dient als Marker für Swing-GUI-Builder, die Komponenten wie JFrame behandeln müssen, die ein einzelnes JRootPane enthalten, speziell. Der Einfachheit halber JFrame, JDialog, JWindow, JApplet und JInternalFrame, standardmäßig vor, standardmäßig sind alle Anrufe an die add, remove und setLayout Methoden, zum contentPane. Das heißt, Sie können auch anrufen:

rootPaneContainer.add(component); 

statt:

rootPaneContainer.getContentPane().add(component); 

A JRootPane eine gemeinsame Komponente ist, dass alle Schwergewichts-Komponenten wie eine native OS-Fenster angezeigt verwenden. Es behandelt die Menüleiste, schließen/minimieren/maximieren Schaltflächen usw. JFrame versucht, die Tatsache zu verbergen, dass JRootPane die echte Arbeit von Ihnen tut, aber in diesem Fall machte es nur die Dinge mehr verwirrend.

+0

Zweiter vor mir. Gut gemacht, mein Herr! – basszero

+1

Für die Begründung hinter dem getContentPane-Zeug erklärt Hans Muller: http://weblogs.java.net/blog/hansmuller/archive/2005/11/jframeadd_conte.html – McDowell

+0

mit anderen Worten: setLayout() wird in JFrame überschrieben, während getLayout() ist nicht ... –