JLayeredPane

Status
Nicht offen für weitere Antworten.

siroFranz

Bekanntes Mitglied
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.


Code:
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

Top Contributor
Code:
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

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

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

Top Contributor
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

Bekanntes Mitglied
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 ?

Code:
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

Top Contributor
moveTo... bezieht sich auf die Komponenten innerhalb einer Ebene.
Was du brauchst, ist eine Methode, die den Panels neue Ebenen zuordnet:
Code:
           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

Bekanntes Mitglied
ok das einzigste was mir noch nicht klar ist dieses:

Code:
LAYER_ONE = JLayeredPane.FRAME_CONTENT_LAYER + 1;
 

André Uhres

Top Contributor
siroFranz hat gesagt.:
ok das einzigste was mir noch nicht klar ist dieses:
Code:
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

Bekanntes Mitglied
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:

Code:
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

Top Contributor
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

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

siroFranz

Bekanntes Mitglied
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.
 

siroFranz

Bekanntes Mitglied
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

Top Contributor
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.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B viele JPanels auf JLayeredPane -> to SVG? AWT, Swing, JavaFX & SWT 15
S Swing JLayeredPane Anordnung funktioniert nicht AWT, Swing, JavaFX & SWT 2
S Swing JLayeredPane "Phänomen"? AWT, Swing, JavaFX & SWT 7
E Swing JPanel in JLayeredPane animieren AWT, Swing, JavaFX & SWT 7
R Swing Animation mit JLayeredPane? AWT, Swing, JavaFX & SWT 8
T JLayeredPane in JScrollBox AWT, Swing, JavaFX & SWT 2
GUI-Programmer Swing Problem mit JLayeredPane AWT, Swing, JavaFX & SWT 2
M JLayeredPane mit JPanel im Vordergrund, Hintergrundelemente sperren AWT, Swing, JavaFX & SWT 7
G JPanel in JLayeredPane AWT, Swing, JavaFX & SWT 8
D Probleme mit MouseWheelListener und JLayeredPane in Applet AWT, Swing, JavaFX & SWT 2
G Swing JLayeredPane Schach AWT, Swing, JavaFX & SWT 7
K JLayeredPane Elemente auf gleicher Position AWT, Swing, JavaFX & SWT 7
R JLayeredPane - JPanel mit variabler Form AWT, Swing, JavaFX & SWT 4
J Layer von JLayeredPane unsichtbar durchsichtig in den Hintergrund AWT, Swing, JavaFX & SWT 5
R JLayeredPane - Drag&Drop - mouseDragged AWT, Swing, JavaFX & SWT 6
J SWING Fenster mit mehreren JPanels (dank JLayeredPane) AWT, Swing, JavaFX & SWT 19
R Swing JLayeredPane - Wie JScrollPane einbauen? AWT, Swing, JavaFX & SWT 17
R Swing JLayeredPane - Drag&Drop Positionen vertauschen AWT, Swing, JavaFX & SWT 3
H Button auf Bild/ JLayeredPane in Jpanel AWT, Swing, JavaFX & SWT 15
G JLayeredPane moveToFront funktioniert nicht AWT, Swing, JavaFX & SWT 15
D jLayeredPane Ebenen mit dynamischer Größe AWT, Swing, JavaFX & SWT 2
B Ärger mit JLayeredPane :-( AWT, Swing, JavaFX & SWT 5
M JLayeredPane : Applet - Application AWT, Swing, JavaFX & SWT 4
V JLayeredPane wird nur 1x bezeichnet AWT, Swing, JavaFX & SWT 12
shiny_hair JLayeredPane - Wie funktioniert das mit den Layern? AWT, Swing, JavaFX & SWT 2
T JLayeredPane Problem - AWT und SWING Komponente AWT, Swing, JavaFX & SWT 6
M Scrollbare JLayeredPane AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben