# Layer von JLayeredPane unsichtbar durchsichtig in den Hintergrund



## javaianer (29. Jun 2009)

Ist es möglich und wenn ja wie, einen Layer einer JLayeredPane zu "verstecken"?

Wichtig nur ein Layer (eine Ebene) der JLayeredPane nicht die gesamte JLayeredPane soll verschwinden.

Die Möglichkeit, den Inhalt eines Layers auszulesen, einen Layer zu kopeiren oder Layer mit einander zu vertauschen, würde mir auch schon helfen.

Es muss auch nicht unbedingt der ganze Layer "versteckt" werden, mir reicht auch ein Index (FRAME_CONTENT_LAYER +1) samt Inhalt.


----------



## byte (30. Jun 2009)

Du kannst Dir alle Komponenten eines Layers holen mit JLayeredPane#getComponentsInLayer(int) und diese dann mit Component#setVisible(boolean) unsichtbar machen.


----------



## javaianer (30. Jun 2009)

Edit: Allgemein, wie macht man das was es fast in jdem Spiel gibt die Ansicht wechseln (Spielfeld <-> Optionen) hin und her?!

Wow, super Forum!

Klappt wunderbar, aber anscheinend für meine Sache zu umständlich.

Also es soll so sein:
Ein Anwendungsfenster (JFrame, wegen Titelleiste und Symbol in Taskleiste) soll erstmal in einem Container (bisher JPANEL mit JLabell) ein Spielfeld sein, da sich hier städig was bewegt, darf dieses JPanel nicht im folgenden neu augebaut werden, sondern es muss immer das gleiche angezeigt werden. So wenn nun der Benutzer auf einen Button klickt soll ein neuer Container (bisher JPanel) angezeigt werden, alles in diesem soll das JLabel verdecken. Wenn aber nun der Benutzer auf zurück zum Spielfeld klcikt, soll halt das neue JPanel verschwinden (das darf zerstört werden) und das Spielfeld wieder angezeigt werden.

Kurz gesagt, wie es in jedem Spiel ist. (Spielfeld und Optionen-Bildschirm);

Zusatz: ich brauch JLayeredPane, wegen Hintergrundbild.

Also das von dir geschriebene funktioniert, aber da ich mit bis zu 3 Layern arbeite, ist das sehr umständlich alles erst zu verstecken und dann wieder anzuzeigen, ich glaube ich werde statt mit JPanels einfach mit JWindow arbeiten. Diese sind nicht in der Taskleiste zu sehen, sind nicht verschiebbar und haben eine eigene JLayeredPane.

Aber wenn man dann das JFrame verschiebt, verschiebt sich dann das JWindow mit? Das ist mir wichtig. Oder kann ich auch JInternalFrame undecorated setzen (setUndecorated() habe ich nciht hier für gefunden)?

Oder reicht es aus das Spielfeld als Singleton zu entwerfen?


----------



## byte (30. Jun 2009)

Wenn sowieso immer nur eine Ebene gleichzeitig angezeigt wird, dann guck Dir mal das CardLayout an.

Das Vorgehen ist da folgendes:

- Container definieren und CardLayout zuweisen
- dem Container verschiedene Komponenten als Cards hinzufügen (Spielfeld, Optionen, ...)
- Du kannst dann einfach zwischen den verschiedene "Cards" hin und herschalten


----------



## javaianer (30. Jun 2009)

Es ist echt nicht einfach CardLayout mit JLayeredPane zu kombinieren. JPanel besitzt leider nicht die Methode getLayeredPane();
Und ich brauch das für meinen Container.
Ich dachte ich könnte einem JPanel eine JLayeredPane übergebn, aber leider geht das nicht.

Hatte es so versucht:


```
class GameView extends JFrame {

  public JLayeredPane getGameViewLayer() {
    return getLayerPane(),
  }

class MyContainer extends JPanel {

  public MyContainer() {
    JLayeredPane jlp = new GameView().getGameViewLayer();
  }
```

Aber anstatt das ich nun in MyContainer eine JLayeredPane benutzen kann, benutze ich exakt die selbe aus GameView!

Ich glaube das geht nur mit JInternalFrame, aber ich muss den kompeltten Rahemn davon wegbekommen!


----------



## javaianer (30. Jun 2009)

Hab JInternalFrame genommen.
Um Titelleiste wegzubekommen:

```
BasicInternalFrameUI ui = (BasicInternalFrameUI) getUI();
        ui.setNorthPane(null);
```
Um Rahemen wegzubekommen:

paint Methode von dem JInternalFrame überschreiben:

```
public void paintComponent(Graphics g) {
           setBorder(null);
        }
```

Bei mir entsteht aber dadurch, dass immer wieder einer neuer JInternalFrame gezeigt wird, so ein Wackeleffekt, da jedesmal der Rahemn neu auf null gesetzt werden muss.

So wackelt nichts mehr! *freu*
paint Methode von dem JInternalFrame überschreiben:

```
public void paintComponent(Graphics g) {
           setBorder(null);
           setBounds(0, 0, breite, höhe);
        }
```


----------

