# JLayeredPane



## siroFranz (18. Feb 2007)

Hallo zusammen, 

versuche gerade etwas mit dem JLayeredPane zu basteln, find über die Forensuche, google und im Buch vin Guido Krüger echt nicht gutes, was mir weiterhelfen könnte :!: 
Möchte einfach nur, dass der mir zwei Ebenen übereinander anzeigt. Habe dazu zwei JPanel und den JLayeredPane.



```
import javax.swing.*;
import java.awt.*;

public class Ebene extends JFrame
{
    JLayeredPane ebene = new JLayeredPane();
    JPanel panelOne, panelTwo;
    
    public Ebene()
    {
        this.setSize(250, 250);
        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
        Container cp = this.getContentPane();
        cp.setLayout(new BorderLayout());
        ebene.add(panelOne = new JPanel(), ????);
        ebene.add(panelTwo = new JPanel(), ????);
        this.panelOne.setBackground(Color.RED);
        this.setVisible(true);
    }
}
```


Gruß


----------



## André Uhres (18. Feb 2007)

```
package basics;
/*
* Ebenen.java
*/
import javax.swing.*;
import java.awt.*;
public class Ebenen extends JFrame {
    JLayeredPane ebene;
    JPanel mainPanel, panelOne, panelTwo;
    public static Integer LAYER_ONE = JLayeredPane.FRAME_CONTENT_LAYER + 1;
    public static Integer LAYER_TWO = LAYER_ONE + 1;
    public Ebenen() {
        super("Ebenen");
        setSize(300, 250);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(this.EXIT_ON_CLOSE);
       
        panelOne = new JPanel();
        panelOne.setBounds(50, 50, 200, 200);
        panelOne.setBackground(Color.RED);
        panelOne.add(new JLabel("FRAME_CONTENT_LAYER + 1"));

        panelTwo = new JPanel();
        panelTwo.setBounds(100, 100, 200, 200);
        panelTwo.setBackground(Color.GREEN);
        panelTwo.add(new JLabel("FRAME_CONTENT_LAYER + 2"));
       
        ebene = getLayeredPane();
        ebene.add(panelOne, LAYER_ONE, 0);
        ebene.add(panelTwo, LAYER_TWO, 0);
       
        mainPanel = new JPanel();
        mainPanel.setBackground(Color.YELLOW);
        mainPanel.add(new JLabel("FRAME_CONTENT_LAYER"));
        add(mainPanel);
    }
    public static void main(final String[] args){new Ebenen().setVisible(true);}
}
```


----------



## siroFranz (18. Feb 2007)

:toll:  :toll:  spitze kann direkt wieterarbeiten
aber wieso klascht du auf den panel noch mal ein label drauf ? Edit: Hast ja noch Text drauf  

Versteh ich nicht: wieso macht man vom JLayeredPane kein neues Objekt und wieso wird der mainPanel dem ContentPane zugefügt und die einzelnen Ebenen nicht =?

Gruß


----------



## André Uhres (19. Feb 2007)

siroFranz hat gesagt.:
			
		

> ..Versteh ich nicht: wieso macht man vom JLayeredPane kein neues Objekt und wieso wird der mainPanel dem ContentPane zugefügt und die einzelnen Ebenen nicht =?..


Ein JFrame enthält eine komplexe Zusammenstellung von verschiedenen Containern:

*Rootpane* ist der Ausgangspunkt der Containerhierarchie. Er enthält die Container LayeredPane und GlassPane.

*LayeredPane* enthält eine ContentPane und optional eine MenuBar
*-MenuBar* ist eine an das Fenster gekoppelte Menüleiste mit den Menüpunkten, die als Menüs aufrufbar sind.
*-ContentPane* enthält die einzelnen Komponenten der Oberfläche (im Beispiel: mainPanel mit einem Label). 
Im "normalen" Programmieralltag wird nur die ContentPane verwendet.

*GlassPane* ist ein normalerweise durchsichtiger Container, der über allen anderen Containern liegt.

Daraus ersieht man, daß die ContentPane eine von vielen möglichen Ebenen im LayeredPane ist. 
Sie liegt innerhalb der LayeredPane in der sogenannten "FRAME_CONTENT_LAYER".
Weitere Ebenen gehören also logischerweise auch ins LayeredPane, nicht ins ContentPane.
Man muß von LayeredPane auch kein neues Objekt machen: es ist ja eins da und das genügt natürlich.
Siehe auch: http://www.galileocomputing.de/open...sel15_025.htm#Rxx747java15025040005511F021100


----------



## siroFranz (23. Feb 2007)

Hallo,

der soll beim Klick auf den "Back"-Button, die dem JLayeredPane hinzugefügten Komponenten einzelnd im Vordergrund darstellen.
Müsste ja mit movetoBack() gehn oder ?


```
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Ebenen extends JFrame implements ActionListener
{
    JLayeredPane ebene;
    JPanel mainPanel, panelOne, panelTwo;
    JButton btnBack;
    public static Integer LAYER_ONE = JLayeredPane.FRAME_CONTENT_LAYER + 1;
    public static Integer LAYER_TWO = LAYER_ONE + 1;
    
    public Ebenen() 
    {
        super("Ebenen");
        setSize(300, 300);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(this.EXIT_ON_CLOSE);
        Container cp = getContentPane();
        cp.setLayout(null);
       
        panelOne = new JPanel();
        panelOne.setBounds(0, 0, 300, 250);
        panelOne.setBackground(Color.RED);
        panelOne.add(new JLabel("FRAME_CONTENT_LAYER + 1"));

        panelTwo = new JPanel();
        panelTwo.setBounds(0, 0, 300, 250);
        panelTwo.setBackground(Color.GREEN);
        panelTwo.add(new JLabel("FRAME_CONTENT_LAYER + 2"));
       
        ebene = getLayeredPane();
        ebene.add(panelOne, LAYER_ONE, 0);
        ebene.add(panelTwo, LAYER_TWO, 0);
       
        cp.add(btnBack = new JButton("back"));
        btnBack.setBounds(5, 250, 100, 20);
        btnBack.addActionListener(this);
        this.setVisible(true);
    }
    
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == btnBack){
            ebene.moveToBack(panelOne);
        }
    }
}
```


----------



## André Uhres (24. Feb 2007)

moveTo... bezieht sich auf die Komponenten *innerhalb *einer Ebene. 
Was du brauchst, ist eine Methode, die den Panels *neue Ebenen *zuordnet:

```
ebene.setLayer(panelOne, LAYER_TWO);
            ebene.setLayer(panelTwo, LAYER_ONE);
```
Es könnte aber auch sein, daß JTabbedPane oder ein CardLayout für deine Zwecke geeigneter ist.


----------



## siroFranz (24. Feb 2007)

ok das einzigste was mir noch nicht klar ist dieses:


```
LAYER_ONE = JLayeredPane.FRAME_CONTENT_LAYER + 1;
```


----------



## André Uhres (24. Feb 2007)

siroFranz hat gesagt.:
			
		

> ok das einzigste was mir noch nicht klar ist dieses:
> 
> ```
> LAYER_ONE = JLayeredPane.FRAME_CONTENT_LAYER + 1;
> ```


Die ContentPane ist eine von vielen möglichen Ebenen im LayeredPane.
Sie liegt innerhalb der LayeredPane in der sogenannten "FRAME_CONTENT_LAYER". 
LAYER_ONE liegt also eine Ebene über der ContentPane.


----------



## siroFranz (24. Feb 2007)

so nochmal eine kurze Frage, habe links ein paar button in ein BorderLayout.WEST gepackt und möchte über diese Buttons, dass die jeweiligen Panels in das BorderLayout.CENTER reingeschmissen werden. Hab denen wie oben schon die Ebenen zugeteilt und dem layeredPane hinzugefügt.
Jetzt scheitert es wahrscheinlich wieder an einer Kleinigkeit
 :roll:  :roll: 


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class SQL extends JFrame implements ActionListener
{
    JPanel panelOne, panelEintrag, panelEintragLoeschen;
    JButton btnEintrag, btnEintragLoeschen, btnStruktur, btnAnzeige;
    JScrollPane scroller;
    JLayeredPane ebene;
    
    public SQL()
    {
        this.setSize(500, 500);
        this.setTitle("Database-Connector");
        this.setDefaultCloseOperation(this.EXIT_ON_CLOSE);
        Container cp = this.getContentPane();
        cp.setLayout(new BorderLayout());
        cp.add(this.scroller = new JScrollPane(panelOne = new JPanel()), BorderLayout.WEST);
        this.panelOne.setLayout(new GridLayout(4,1));
        this.panelOne.add(this.btnEintrag = new JButton(new ImageIcon("neu.jpg")));
        this.panelOne.add(this.btnEintragLoeschen = new JButton(new ImageIcon("loeschen.jpg")));
        this.panelOne.add(this.btnStruktur = new JButton(new ImageIcon("struktur.jpg")));
        this.panelOne.add(this.btnAnzeige = new JButton(new ImageIcon("datenbank.jpg")));
        this.btnEintrag.addActionListener(this);
        this.btnEintragLoeschen.addActionListener(this);
        this.btnStruktur.addActionListener(this);
        this.btnAnzeige.addActionListener(this);
        
        //-----------Ebenen für JLayeredPane -----------------------------------------------------------------------
        this.panelEintrag = new JPanel();
        this.panelEintrag.setBackground(Color.GREEN);
        this.panelEintragLoeschen = new JPanel();
        this.panelEintragLoeschen.setBackground(Color.RED);
        ebene = this.getLayeredPane();
        ebene.add(panelEintrag, JLayeredPane.FRAME_CONTENT_LAYER +1);
        ebene.add(panelEintragLoeschen, JLayeredPane.FRAME_CONTENT_LAYER +2);
        this.setVisible(true);
    }
    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == this.btnEintrag){
            
        }
        if(e.getSource() == this.btnEintragLoeschen){
        }
        if(e.getSource() == this.btnStruktur){
            
        }
        if(e.getSource() == this.btnAnzeige){
            
        }
    }
}
```


----------



## André Uhres (25. Feb 2007)

siroFranz hat gesagt.:
			
		

> ..Jetzt scheitert es wahrscheinlich wieder an einer Kleinigkeit..


Ich glaube, hier liegt wieder ein kleines Mißverständnis vor*. 
Nimm ein JTabbedPane, da kannst du Panels reinschmeissen. Die Buttons kommen automatisch.

*Man kann keine Panels, die auf verschiedenen Ebenen sind in ein Contentpane schmeissen, 
das im selben Layeredpane auf einer ganz anderen Ebene ist.


----------



## siroFranz (25. Feb 2007)

Ja das ist schon viellll einfacher, aber diese Tabs stören mich. Besteht keine Möglichkeit ein JLayeredPane hier zu benutzen?


----------



## André Uhres (25. Feb 2007)

siroFranz hat gesagt.:
			
		

> ..aber diese Tabs stören mich..


Begründung?


----------



## siroFranz (25. Feb 2007)

find das nicht schön möchte die ja nicht über die tabs koordinieren, sondern über die button oder hab ich mir überlegt über einen JTree.


----------



## André Uhres (25. Feb 2007)

http://www.java-forum.org/de/viewtopic.php?p=215970#215970


----------



## siroFranz (25. Feb 2007)

hat mir sehr weitergeholfen  :toll:  :toll:
aber wenn es schon so ein schickes Layout gibt, wozu kann man dann eigentlich noch JLayeredPane() nutzen?


----------



## André Uhres (26. Feb 2007)

siroFranz hat gesagt.:
			
		

> ..wozu kann man dann eigentlich noch JLayeredPane() nutzen?


Ich benutze es selten, eigentlich nur um ein halbdurchsichtiges Bild oder Wasserzeichen über den Contenpane zu legen.
Man könnte natürlich auch andere Sachen drüber legen, wie Paletten, Dialoge, Popups oder Komponenten die gerade mit  der Maus auf eine andere Position gezogen werden.


----------



## siroFranz (26. Feb 2007)

verstehe
fahr jetzt auf klassenfahrt nach amsterdam :lol: 

Gruß


----------

