Zwei JPanel übereianderlegen

Pascale07

Mitglied
Ich habe es jetzt länger versucht, aber keinen Erfolg gehabt. Ich versuche in einem JFrame zwei JPanel einzufügen, die übereinanderliegen. Kann mir bitte jemand einen Simplen Code geben, in dem ein großes rotes JPanel ist, über dem ein kleines blaues JPanel liegt. Am besten mit möglichkeit diese zu wechseln. (Falls das überhaupt möglich ist)
Danke
 

KonradN

Super-Moderator
Mitarbeiter
Da wäre ja eigentlich die Frage, was Du alles versucht hast - dann könnte man da besser ansetzen und Du hättest mehr davon, da Du dann deutlich mehr lernen würdest, als wenn man einfach nur fertigen Code vorgibt.

Und die Fragestellung ist auch sehr ungenau. Sollen sich die JPanel nur überlappen und eine der beiden soll im Vordergrund sein?
Oder sollen die JPanel das JFrame ausfüllen und Du willst zwischen den JPanel umschalten können?

Letzteres ist über ein CardLayout problemlos möglich:
Java:
package de.kneitzel;

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

public class PanelSwitcher {

    private JFrame mainWindow;
    private JPanel greenPanel, redPanel;
    private JButton switchToGreenBtn, switchToRedBtn;

    public PanelSwitcher() {
        mainWindow = new JFrame();
        mainWindow.setTitle("Panel Switcher");
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainWindow.setSize(400, 300);
        mainWindow.setLocationRelativeTo(null);

        greenPanel = new JPanel();
        greenPanel.setBackground(Color.GREEN);

        redPanel = new JPanel();
        redPanel.setBackground(Color.RED);

        switchToGreenBtn = new JButton("Switch to Green Panel");
        switchToGreenBtn.addActionListener(this::switchPanel);

        switchToRedBtn = new JButton("Switch to Red Panel");
        switchToRedBtn.addActionListener(this::switchPanel);

        greenPanel.add(switchToRedBtn);
        redPanel.add(switchToGreenBtn);

        mainWindow.getContentPane().setLayout(new CardLayout());
        mainWindow.getContentPane().add(greenPanel, "green");
        mainWindow.getContentPane().add(redPanel, "red");

        showPanel("green");
        mainWindow.setVisible(true);
    }

    public void switchPanel(ActionEvent e) {
        if (e.getSource() == switchToGreenBtn) {
            showPanel("green");
        } else if (e.getSource() == switchToRedBtn) {
            showPanel("red");
        }
    }

    private void showPanel(String panelName) {
        CardLayout layout = (CardLayout) mainWindow.getContentPane().getLayout();
        layout.show(mainWindow.getContentPane(), panelName);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            PanelSwitcher panelSwitcher = new PanelSwitcher();
        });
    }
}

Das Erste ist noch einfacher - da ist halt das null Layout wichtig. Und die Darstellung mit Vorne / Hinten ist die Component ZOrder.

Da wäre dann ein schneller Beispiel-Code:
Java:
package de.kneitzel;

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

public class OverlappingPanels {
    private JPanel panel1, panel2;
    private JFrame mainWindow;

    public OverlappingPanels() {
        mainWindow = new JFrame();
        mainWindow.setTitle("Overlapping Panels");
        mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        mainWindow.setSize(300, 300);
        mainWindow.setLocationRelativeTo(null);

        panel1 = createPanel(Color.RED, 0, 0, 100, 100);
        panel2 = createPanel(Color.GREEN, 50, 50, 100, 100);

        mainWindow.getContentPane().setLayout(null);
        mainWindow.getContentPane().add(panel1);
        mainWindow.getContentPane().add(panel2);

        panel1.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                panel1.getParent().setComponentZOrder(panel1, 0);
                mainWindow.repaint();
            }
        });

        panel2.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                panel2.getParent().setComponentZOrder(panel2, 0);
                mainWindow.repaint();
            }
        });

        mainWindow.setVisible(true);

    }

    private JPanel createPanel(Color color, int x, int y, int width, int height) {
        JPanel panel = new JPanel();
        panel.setBackground(color);
        panel.setBounds(x, y, width, height);
        return panel;
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            OverlappingPanels overlappingPanels = new OverlappingPanels();
        });
    }
}


Beide Codestücke sind von ChatGPT erstellt und von mir nur etwas angepasst worden.
 

Pascale07

Mitglied
Erstmal Danke für die Antwort. Das mit dem CardLayout habe ich tatsächlich schon ausprobiert gehabt. Allerdings passen sich dort, wie Sie schon sagten, die JPanel dem JFrame an. Gibt es trotzdem eine Möglichkeit, wie sich die JPanel nicht dem JFrame anpassen?
 

KonradN

Super-Moderator
Mitarbeiter
Was genau ist denn die Anforderung? Wie das andere Beispiel zeigt, kannst du auch alles selbst steuern.
 

Pascale07

Mitglied
Inwiefern kann ich das selber anpassen? In dem obrigen Beispiel zum CardLayout ist keine möglichkeit gegeben, mit der man die Größe und die Position der JPanel anpassen kann. Ich möchte alle Panel direkt in das Pane mit dem CardLayout hinzufügen. Und wenn ich auf eine Taste drücke soll ein kleineres JPanel in den Vordergrund gerückt werden, das dann über dem ersten liegt. Das erste sollte aber imernoch zu sehen sein. Aber keine Transparenz. (Also quasi eine Verbindung der beiden Codes, die sie mir gestern gegeben haben).
 

Pascale07

Mitglied
Inwiefern kann ich das selber anpassen? In dem obrigen Beispiel zum CardLayout ist keine möglichkeit gegeben, mit der man die Größe und die Position der JPanel anpassen kann. Ich möchte alle Panel direkt in das Pane mit dem CardLayout hinzufügen. Und wenn ich auf eine Taste drücke soll ein kleineres JPanel in den Vordergrund gerückt werden, das dann über dem ersten liegt. Das erste sollte aber imernoch zu sehen sein, aber keine Transparenz. (Also quasi eine Verbindung der beiden Codes, die sie mir gestern gegeben haben).
 

KonradN

Super-Moderator
Mitarbeiter
In dem zweiten Beispiel hast Du zwei JPanel, die sich überlappen. Beide haben eine frei gesetzte Größe / Position.
Du kannst in dem Beispiel auf ein JPanel klicken um es in den Vordergrund zu bringen - das brauchst Du offensichtlich nicht. Aber die Anforderung mit den JPanel, die sich überlappen, ist dort gegeben.
 

mihe7

Top Contributor
Es soll ein Setting Screen werden, mit dem ich Einstellungen vornehmen kann.

Zum Hintergrund meiner Frage: in Swing ist fast alles machbar, allerdings bringt diese Freiheit auch die Qual der Wahl mit sich, wofür man sich entscheidet. Das wiederum hängt ein gutes Stück davon ab, was man eigentlich genau will. Wenn Du "Setting Screen" schreibst, gehe ich mal davon aus, dass Komponenten wie JPanel schon mal in die richtige Richtung gehen. Allerdings ist mir noch nicht klar, ob Du wirklich verschiedene Komponenten oder nicht eigentlich eine eigene Komponente haben möchtest. Aber auch das hängt wieder davon ab, was genau Du willst :)

Wozu gibt es dann CardLayout, wenn man das selbe auch mit nem null Layout machen kann?
Beim Layout geht es darum, Komponenten auf den zur Verfügung stehenden Platz zu verteilten, d. h. den Komponenten eine Position und Größe zu geben. Du kannst jedes erdenkliche Layout ohne LayoutManager (null Layout) umsetzen. Die LayoutManager dienen dazu, den Code fürs Layout vom Rest zu trennen. Das erlaubt die Wiederverwendung eines Layouts in verschiedenen Containern.
 

KonradN

Super-Moderator
Mitarbeiter
Erfüllt denn CardLayout Deine Anforderung an das gewünschte Layout?

A CardLayout object is a layout manager for a container. It treats each component in the container as a card. Only one card is visible at a time, and the container acts as a stack of cards. The first component added to a CardLayout object is the visible component when the container is first displayed.

Das "only one card is visible" scheint etwas zu sein, das Du nicht möchtest.
 

KonradN

Super-Moderator
Mitarbeiter
Beim Layout geht es darum, Komponenten auf den zur Verfügung stehenden Platz zu verteilten, d. h. den Komponenten eine Position und Größe zu geben. Du kannst jedes erdenkliche Layout ohne LayoutManager (null Layout) umsetzen. Die LayoutManager dienen dazu, den Code fürs Layout vom Rest zu trennen. Das erlaubt die Wiederverwendung eines Layouts in verschiedenen Containern.
Da evtl. noch einmal betonen: Es geht darum, dass die Komponenten verteilt werden ... mit dem Ziel, dass jedes seinen Platz bekommt und es eben keine Überschneidungen gibt. Wenn Du also sichtbare Komponenten überlappen willst, dann wird es schwer, entsprechende Layouts zu finden.

Nicht desto trotz ist es generell - unabhängig von der Problematik - so, dass man Klassen, die man verwenden will, kennen sollte. Die Dokumentation der Klasse ist da immer ein guter Startpunkt.
a) Man erfährt direkt, was die Klasse machen bzw. wozu sie da ist. Dann hat man einen ersten Einblick, ob die Klasse überhaupt das leisten kann, was man erwartet
b) Man erfährt weitere Details, die bei einer Implementation wichtig sein könnten (wie Hinweise zur Thread Sicherheit und so)
c) Wenn die Klasse die Anforderung nicht erfüllt, dann kann man über JavaDoc weitere Alternativen finden. So kannst Du über die Superklasse oder implementierte Interfaces gehen um zu schauen, ob es ähnliche Klassen gibt. Bei CardLayout wäre nach einem Klick auch das Interface LayoutManager2 z.B, direkt sichtbar:
Da kann man also die diversen Layouts einmal durchgehen um zu schauen, ob man etwas passendes findet.

So ist dann z.B. OverlayLayout vorhanden, aber ich fürchte, dass es ähnlich ungeeignet sein dürfte wie das CardLayout. Aber das könntest Du im Detail betrachten.

Generell ist es immer sehr schön und einfach, mit verschiedenen, verschachtelten Layouts zu arbeiten. Damit kann man sehr schnell und einfach UIs bauen. Das geht hakt sehr schnell - gerade in Code - ohne langes Herumschieben von Controls in einem Designer und ständiges manuelles anpassen.
 

Pascale07

Mitglied
Mir ist gerade ne andere Idee gekommen. Kann ich nicht einfach ein Panel mit einem Cardlayout machen, in dieses Panel mehrere Panel packen und in dieses Panel das kleinere Panel hinzufügen?

Wenn ich mir das so duchlese, klingt das etwas komplitiert. Mir geht es darum ein Spiel zu Programieren, in dem man zwischen verschiedene Registerkarten wechseln kann. In jedem dieser Registerkarten soll es den Knopf für die Einstellungen geben. Also sollte es doch reichen, wenn ich die Registerkarten in ein CardLayout packe und das Einstellungsmenü als JPanel in die aktuelle Registerkarte hinzufüge. Oder?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Zwei JPanel übereinander nur vorderes "repainten" AWT, Swing, JavaFX & SWT 3
D zwei JLabel stapeln in einem JPanel AWT, Swing, JavaFX & SWT 5
F JPanel mit zwei Methoden her beschreiben. AWT, Swing, JavaFX & SWT 8
G Wie erzeugt man zwei identische JPanel AWT, Swing, JavaFX & SWT 4
N zwei JComponente gleichzeitig auf JPanel hinzufügen AWT, Swing, JavaFX & SWT 22
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
raeuchertofu Input bei zwei jTextfields AWT, Swing, JavaFX & SWT 5
D Layout einer scene mit ListView Elementen und Zwei Textfeldern AWT, Swing, JavaFX & SWT 1
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
G 2D-Grafik Grafik in zwei verschiedenen Fenstern gleichzeitig zeichnen AWT, Swing, JavaFX & SWT 9
I JTable, DefaultTableModel, zwei Zahlen multiplizieren. AWT, Swing, JavaFX & SWT 26
P Zwei JTables auf eine A4-Seite mit einstellbaren Rändern AWT, Swing, JavaFX & SWT 9
missy72 JavaFX TableView / TableColumn / ObservableList / zwei Werte in einer Zelle AWT, Swing, JavaFX & SWT 2
Z Swing Kann man denn abstand zwischen zwei Buttons berechnen AWT, Swing, JavaFX & SWT 5
M Kommunikation zwischen zwei Stages AWT, Swing, JavaFX & SWT 0
Bluedaishi JavaFX Programm start mit zwei scenen bzw Fenster AWT, Swing, JavaFX & SWT 1
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
L Wörter zwischen zwei Grenzen einlesen. AWT, Swing, JavaFX & SWT 13
T Java: Zwei abhängige JSlider machen nicht das, was sie sollen AWT, Swing, JavaFX & SWT 4
D Zwei getrennte Java Klassen verbinden. Wie ? AWT, Swing, JavaFX & SWT 2
H Kombination von zwei Frames AWT, Swing, JavaFX & SWT 16
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
A Swing Programm funktioniert aber zwei Buttons werden angezeigt AWT, Swing, JavaFX & SWT 3
D Swing Kommunikation zwischen zwei GUI's AWT, Swing, JavaFX & SWT 2
S Zwei JTree, ein Model, bei Selection im ersten JTree soll der zweite die Inhlate anzeigen AWT, Swing, JavaFX & SWT 2
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
T CSS Rechtsbüdniges Label mit Zwei Zeilen AWT, Swing, JavaFX & SWT 7
P 2D-Grafik Bogen(Arc) zwischen zwei Punkten zeichnen AWT, Swing, JavaFX & SWT 2
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
Paul15 Zwei Fenster AWT, Swing, JavaFX & SWT 23
V JavaFX Zwei Dinge in einer CellFactory erledigen AWT, Swing, JavaFX & SWT 8
B Vertikale Größenänderung zwischen zwei Widgets AWT, Swing, JavaFX & SWT 2
J zwei Paint methoden in einer Klasse AWT, Swing, JavaFX & SWT 3
C Zwei Ebenen in Graphics ? AWT, Swing, JavaFX & SWT 0
L Zwei String Array in eine Spalte einfügen AWT, Swing, JavaFX & SWT 1
I Zwei Fenster nebeneinander anzeigen AWT, Swing, JavaFX & SWT 2
A Swing Zwei Klassen mit Textfeld Eingaben vergleichen und Ausgabe erzeugen AWT, Swing, JavaFX & SWT 10
B Swing focusGained öffnet sich zwei mal AWT, Swing, JavaFX & SWT 3
C Bei Btn Klick zwei JPanels switchen AWT, Swing, JavaFX & SWT 14
A Swing zwei JComboBoxen miteinander vergleichen und anschließend Button umwandeln AWT, Swing, JavaFX & SWT 7
A Jtabbed ein Reiter mit zwei icons AWT, Swing, JavaFX & SWT 4
K Zugriff auf Label und Ereignisbehandlung durch zwei Handlerklassen AWT, Swing, JavaFX & SWT 3
J Zwei GUIs - Nach button-Klick soll ein Wert an die andere GUI übergeben werden AWT, Swing, JavaFX & SWT 15
B Kommunikation zwischen zwei Fenstern und vorübergehende Speicherung der Eingaben AWT, Swing, JavaFX & SWT 4
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
B JApplet zwei Panels autobreite? AWT, Swing, JavaFX & SWT 2
T LayoutManager GridBagLayout - zwei jTable mit unterschiedlicher Höhe AWT, Swing, JavaFX & SWT 2
L Zeichnen in zwei Fenstern AWT, Swing, JavaFX & SWT 8
J JOptionPane mit zwei Buttons?! AWT, Swing, JavaFX & SWT 3
F Swing Ladebildschirm zwischen zwei SWING Frames AWT, Swing, JavaFX & SWT 11
T JTabbedPane - neuen Tab zwischen zwei anderen Tabs hinzufügen AWT, Swing, JavaFX & SWT 2
Helgon Zwei jTables gleich Breit AWT, Swing, JavaFX & SWT 4
C Zwei Bilder übereinander legen AWT, Swing, JavaFX & SWT 1
A Daten umherschieben zwischen zwei Klassen AWT, Swing, JavaFX & SWT 40
M Swing Zwei Jlists - selectedElement binden? AWT, Swing, JavaFX & SWT 7
K zwei TableModel AWT, Swing, JavaFX & SWT 9
J Schließen über x soll zwei Prozesse beenden AWT, Swing, JavaFX & SWT 7
Y xormode bzw bild in zwei ebenen zeichnen AWT, Swing, JavaFX & SWT 4
G ein JTextArea in zwei JPanels AWT, Swing, JavaFX & SWT 2
C zwei Bilder nacheinander anzeigen AWT, Swing, JavaFX & SWT 2
B LayoutManager Positionierung zwischen zwei Layoutkomponenten AWT, Swing, JavaFX & SWT 2
N Swing DnD zwischen zwei JTrees AWT, Swing, JavaFX & SWT 2
H Swing Zwei Fragen AWT, Swing, JavaFX & SWT 5
D Zwei String Attribute über eine Methode als Zeilen in einer Tabelle darstellen AWT, Swing, JavaFX & SWT 9
C Zwei JSpinner mit dem gleichen Wert AWT, Swing, JavaFX & SWT 2
T Zwei Jtables eine JscrollPane AWT, Swing, JavaFX & SWT 3
L Zwei Anwendungen kommen sich in die Quere! AWT, Swing, JavaFX & SWT 4
M SWT DND zwischen zwei TreViewern in beide Richtungen AWT, Swing, JavaFX & SWT 10
S SWT Zwei Tabellen gleichzeitig Scrollen AWT, Swing, JavaFX & SWT 3
N Ein Button für zwei Aktionen AWT, Swing, JavaFX & SWT 7
V Swing Auslösen von zwei Events hintereinander AWT, Swing, JavaFX & SWT 4
hdi SWT Zwei mal Shell öffnen = Exception AWT, Swing, JavaFX & SWT 6
algorismi Unterscheiden zwischen zwei JLists AWT, Swing, JavaFX & SWT 5
P GridBagLayout - zwei Spalten mit gleicher Größe AWT, Swing, JavaFX & SWT 11
H Ein Button - zwei Actions AWT, Swing, JavaFX & SWT 3
T Schieberegler mit zwei Schiebern AWT, Swing, JavaFX & SWT 2
M SWT SWT - Zwei Tabellen gleicher Größe AWT, Swing, JavaFX & SWT 5
S import von Klassen (zwei Panels eine Form) AWT, Swing, JavaFX & SWT 39
K Zwei Panels zentriert anordnen AWT, Swing, JavaFX & SWT 3
S Vereinen von zwei MenuBar AWT, Swing, JavaFX & SWT 3
P JList mit zwei Werten AWT, Swing, JavaFX & SWT 9
0 JMenuItem nicht in zwei JMenus möglich? AWT, Swing, JavaFX & SWT 2
G Variblenwert zwischen zwei Klassen übergeben AWT, Swing, JavaFX & SWT 3
B zwei JLabels überlappen lassen AWT, Swing, JavaFX & SWT 5
T Kommunikation zwischen Zwei GUI-Klassen AWT, Swing, JavaFX & SWT 2
O Zwei Listener auf Komponente, warten auf Beendigun? AWT, Swing, JavaFX & SWT 2
T Kommunikation zwischen zwei jFrames AWT, Swing, JavaFX & SWT 4
G Datenaustausch zwischen zwei JFrames AWT, Swing, JavaFX & SWT 3
K Zwei JFrames aneinanderdocken? AWT, Swing, JavaFX & SWT 5
A Eins von zwei offnen Fenster/Frames schließen AWT, Swing, JavaFX & SWT 2
S JTable zwei Text-Zeilen in einer Zelle AWT, Swing, JavaFX & SWT 2
hdi zeitgleiches fokusieren von zwei panels AWT, Swing, JavaFX & SWT 2
I JTable: "GLEICHZEITIG" zwei verschiedene TableMode AWT, Swing, JavaFX & SWT 2
R JDialog dispose() wird zwei mal aufgerufen AWT, Swing, JavaFX & SWT 2
T zwei panel und ein thread AWT, Swing, JavaFX & SWT 5
W Instanz eines Steuerelementes an zwei Stellen zeichnen AWT, Swing, JavaFX & SWT 3
M Zwei JMenuBars AWT, Swing, JavaFX & SWT 5
W JTree - aus zwei mach eins AWT, Swing, JavaFX & SWT 2
M Zwei Element auf ein Contentpane AWT, Swing, JavaFX & SWT 45

Ähnliche Java Themen

Neue Themen


Oben