# JFrame() und getContentPane()



## HannsW (17. Sep 2009)

Bitte nicht schlagen, aber irgendwie habe ich ein Problem:

hat der Frame bereits ein Panel als Contentpane, oder muss ich es erst erzeugen?

Was ist korrrekt?

Var1:

```
.. 
   JFrame aFrame = new JFrame();
   JPanel contentPane = aFrame.getContentPane();
```
oder 
Var2:

Var1:

```
.. 
   JFrame aFrame = new JFrame();
   JPanel contentPane = new JPanel;
   aFrame.setContentPane(contentPane);
```


----------



## SlaterB (17. Sep 2009)

geht beides, das erste ist speicherschonender, warum ein vorhandenes JPanel ersetzen?
der Rückgabewert von  getContentPane() ist aber Container, könnte theoretisch was anderes als JPanel sein

zu bedenken ist, dass JPanel standardmäßig ein FlowLayout hat, 
während das ContentPane mit BorderLayout initialisiert wird


```
/**
     * Called by the constructor methods to create the default 
     * <code>contentPane</code>. 
     * By default this method creates a new <code>JComponent</code> add sets a 
     * <code>BorderLayout</code> as its <code>LayoutManager</code>.
     * @return the default <code>contentPane</code>
     */
    protected Container createContentPane() {
        JComponent c = new JPanel();
        c.setName(this.getName()+".contentPane");
        c.setLayout(new BorderLayout() {
            /* This BorderLayout subclass maps a null constraint to CENTER.
             * Although the reference BorderLayout also does this, some VMs
             * throw an IllegalArgumentException.
             */
            public void addLayoutComponent(Component comp, Object constraints) {
                if (constraints == null) {
                    constraints = BorderLayout.CENTER;
                }
                super.addLayoutComponent(comp, constraints);
            }
        });
        return c;
    }
```


----------



## HannsW (17. Sep 2009)

SlaterB hat gesagt.:


> geht beides, das erste ist speicherschonender, warum ein vorhandenes JPanel ersetzen?
> der Rückgabewert von  getContentPane() ist aber Container, könnte theoretisch was anderes als JPanel sein


d.h: solange Sun den JFrame nicht ändert, kann ich folgenden Code verwenden?

```
// contentPane ist JPanel !
    contentPanel = (JPanel) this.getContentPane();
```
oder muss ich vorsorglich ein try..catch verwenden, für den Fall, daß mal kein JPanel zurückkommt?


----------



## SlaterB (17. Sep 2009)

wenn dann wäre ein instanceof-Test angesagt, aber sowas muss man nicht abfangen,
so ein Fehler kann man dann korrigieren wenn er auftritt,

falls du ein sicheres Programm bauen willst, welches dann nicht mehr korrigiert werden kann,
setze doch lieber ein neues JPanel,

oder muss dich überhaupt interessieren ob es ein JPanel ist? jFrame.add() sollte in jedem Fall funktionieren


----------



## HannsW (17. Sep 2009)

SlaterB hat gesagt.:


> wenn dann wäre ein instanceof-Test angesagt, aber sowas muss man nicht abfangen,
> so ein Fehler kann man dann korrigieren wenn er auftritt,


war auch mein Gefühl


> falls du ein sicheres Programm bauen willst, welches dann nicht mehr korrigiert werden kann,
> setze doch lieber ein neues JPanel,


HAbe ich bis jetzt eigentlich immer gemacht



> oder muss dich überhaupt interessieren ob es ein JPanel ist? jFrame.add() sollte in jedem Fall funktionieren


Irgendwie beruhigt es mich doch, zu wissen was ich und womit mache.

Danke für Deine Hilfe:applaus:


----------

