---
title: 'Inselraus: Swings JRootPane und JDesktopPane'
url: 'https://tutego.de/blog/javainsel/2015/11/inselraus-swing-jrootpane-jdesktoppane'
markdown: 'https://tutego.de/blog/javainsel/2015/11/inselraus-swing-jrootpane-jdesktoppane.md'
date: '2015-11-25'
description: 'Unter den JComponent-Objekten gibt es einige ausgezeichnete, die als Container für andere Kinder fungieren. Wurzelkomponente der Top-Level-Komponenten (JRootPane) Die Komponenten JFrame, JDialog, JWindow, JApplet und JInternalFrame enthalten als einziges Kind den leichtgewichtigen Container JRootPa…'
taxonomy:
  category:
    - Swing
---

# Inselraus: Swings JRootPane und JDesktopPane

![Illustration einer tropischen Insel mit Palmen und einem hohen Berg](https://tutego.de/blog/javainsel/user/themes/tutego/images/insel-cover.jpg)# Java Blog für Programmierer

[Java Blog für Programmierer](https://tutego.de/blog/javainsel/)

## Inselraus: Swings JRootPane und JDesktopPane

25.11.2015 · [Christian Ullenboom](https://tutego.de/blog/javainsel/author/admin/)

Unter den JComponent-Objekten gibt es einige ausgezeichnete, die als Container für andere Kinder fungieren.

### Wurzelkomponente der Top-Level-Komponenten (JRootPane)

Die Komponenten JFrame, JDialog, JWindow, JApplet und JInternalFrame enthalten als einziges Kind den leichtgewichtigen Container JRootPane. Die Methode `getRootPane()` liefert dieses JRootPane-Objekt. Die JRootPane verwaltet eine Layered Pane, die wiederum Content-Pane und Menü aufnimmt, und eine Glass-Pane, die wie eine Glasscheibe über allen anderen Komponenten liegt. Sie kann Ereignisse abfangen oder in einer `paint(…)`-Methode etwas über alle Komponenten zeichnen.

Beispiel: Weise der Glass-Pane einen wartenden Cursor zu:

```java
Component c = getRootPane().getGlassPane();
 if( c != null )
   c.setCursor( Cursor.getPredefinedCursor( Cursor.WAIT_CURSOR ) );
```

### JDesktopPane und die Kinder von JInternalFrame

Die JDesktopPane ist eine Unterklasse von JLayeredPane und als Container für interne Fenster – also Objekte vom Typ JInternalFrame – gedacht. Mit internen Fenstern (engl. internal frames) lassen sich MDI-Applikationen implementieren, also GUI-Anwendungen, bei denen nicht das grafische Betriebssystem die Fenster verwaltet, sondern die eigene Anwendung.

Bevor ein JInternalFrame sichtbar wird, muss der Container erzeugt und sichtbar gemacht werden:

```java
JDesktopPane desktop = new JDesktopPane();
 container.add( desktop );
```

Jetzt können beliebig viele JInternalFrame-Objekte erzeugt und auf der JDesktopPane platziert werden. Der einfachste Konstruktor ist der Standard-Konstruktor, der einen nicht vergrößerbaren, nicht schließbaren, nicht maximierbaren und nicht zum Icon verkleinerbaren JInternal-Frame ohne Titel erzeugt. Der ausführlichste Konstruktor erlaubt eine genaue Parametrisierung:

```java
JInternalFrame iframe = new JInternalFrame( title, resizable, closeable,
   maximizable, iconifiable );
```

Zwar gibt es nun ein Exemplar, doch wäre es nach dem Aufsetzen auf den Container noch nicht sichtbar:

```java
iframe.setVisible( true );
```

Bis zur Vollständigkeit fehlen aber noch die Maße:

```java
iframe.setSize( /* width = */ 200, /* height = */ 100 );
```

Nun kann der iframe dem Container hinzugefügt werden:

```java
desktop.add( iframe );
```

In einem kompletten Programm kann das so aussehen:

```java
package com.tutego.insel.ui.swing;

 import javax.swing.*;
 import static java.lang.Math.random;

 public class JInternalFrameDemo {

   static void addInternalToDesktop( JDesktopPane desktop )
   {
     JInternalFrame iframe;
     iframe = new JInternalFrame( "Ein internes Fenster",  // title
                                  true,                    // resizable
                                  true,                    // closeable
                                  true,                    // maximizable
                                  true );                  // iconifiable

     iframe.setBounds( (int)(random() * 100), (int)(random() * 100),
                       100 + (int)(random() * 400), 100 + (int)(random() * 300) );
     iframe.add( new JScrollPane(new JTextArea()) );
     iframe.setVisible( true );

     desktop.add( iframe );
   }

   public static void main( String[] args ) {
     JFrame f = new JFrame();
     f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
     JDesktopPane desktop = new JDesktopPane();
     f.add( desktop );
     f.setSize( 500, 400 );
     addInternalToDesktop( desktop );
     addInternalToDesktop( desktop );
     addInternalToDesktop( desktop );
     f.setVisible( true );
   }
 }
```

Hinweis: Die Schnittstelle von JInternalFrame erinnert an JFrame, doch ist die Ereignisbehandlung anders. So besitzt JInternalFrame eine Methode `addInternalFrameListener(…)` an Stelle von `addWindowListener(…)`. Ein JInternalFrame empfängt keine WindowEvents, daher darf es `addWindowListener(…)` – wie es JFrame von `java.awt.Window` erbt – auch nicht besitzen.

Kategorien: [Swing](https://tutego.de/blog/javainsel/category/swing/)

[← Alle Beiträge](https://tutego.de/blog/javainsel/)

---

## Navigation

- Previous: [Inselraus: Swings Farbauswahldialog JColorChooser](https://tutego.de/blog/javainsel/2015/11/inselraus-swing-farbauswahldialog-jcolorchooser.md)
- Next: [Inselraus: Swings JLayeredPane](https://tutego.de/blog/javainsel/2015/11/inselraus-swing-jlayeredpane.md)
