Panels stapeln, geht das?

bloodyrocky

Mitglied
Hi,

der Titel lässt vermuten, dass es sich um etwas einfaches Handeln sollte, aber im Endeffekt scheint es doch schwieriger.

Ich versuche gerade ein App zu schreiben bei der ich mehrere Panels transparent übereinander legen möchte. D.h. ich habe ein Panel welches sich in der Mitte des Frames befindet, oben (NORTH) und unten (SOUTH) befindet sich jeweils ein anderes Panel.
Java:
JPanel centerPanel = new JPanel;
centerPanel.setBackground(Color.orange); //Aus Debuggründen
Darin lege ich ein Panel mit Buttons, eins mit einer Grafik und eines mit einer Grafik die auf und ab läuft ab.
Java:
centerPanel.add(buttonPanel, BorderLayout.SOUTH);
centerPanel.add(grafikPanel, BorderLayout.CENTER);
centerPanel.add(animierteGrafikPanel, BorderLayout.CENTER);

Soweit so gut, das Panel mit der animierten Grafik wurde transparent gesetzt, so dass normalerweise das Grafikpanel durchscheint werden sollte. Tatsächlich ist das aber nicht der Fall, sondern das centerPanel scheint hindurch.

Danach habe ich versucht das centerPanel statt als JPanel als JLayeredPane zu definieren, aber das legt sich dann über die komplette Form und nicht nur in die Mitte der Form, also umschlossen von den Panels oben und unten. Hinzu kam, dass sich die darauf befindlichen JPanels auch nicht anordnen ließen.

Ziel ist es in dem centerPanel eine 2 Animationen (sich auf und ab bewegende Bilder) und ein Bild die übereinander liegen abzubilden, die Reihenfolge wäre Bild ganz unten, dann 1. Animation und als oberstes die 2. Animation.

Ich hoffe jemand kann mich in die richtige Richtung stupsen.
Vielen Dank!
 

U2nt

Bekanntes Mitglied
Entweder indem du manuell die Bounds sets wenne das Layout auf null setzt, oder mit einem CardLayout.
Mit einem CardLayout kannse Panels nach vorne holen und auch wieder nach hinten schieben, bzw ein anderes nach vorne holen.
 

bloodyrocky

Mitglied
Die Bounds habe ich versucht manuell zu setzen, werden aber ignorier. Ich habe in meiner Klasse für die Panels (sowohl für die Animationen, als auch die Bilder) die PreferedSize auf die größe des Bildes gesetzt. Das CardLayout funktioniert nicht, da immer nur ein Panel sichtbar ist und die anderen dahinter liegen ich brauche aber alle 3 Panels sichtbar, evtl. auch noch ein 4.

Hat noch jemand eine Idee? Habe ich mich eigentlich verständlich ausgedrückt, oder denke ich vielleicht wieder viel zu kompliziert?

Im Prinzip ist die Frage ja kann ich mehrere Panels übereinander legen und alle für den Benutzer sichtbar machen und wenn ja wie? Mit meiner Vorgehensweise funktioniert es wohl nicht :(
 

Michael...

Top Contributor
Würde eine Komponente mit selbstgeschriebenem LayoutManager verwenden:
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.LayoutManager;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class PanelPileDemo extends JFrame {
	public PanelPileDemo() {
		this.getContentPane().add(new JLabel("NORTH", JLabel.CENTER),
				BorderLayout.NORTH);
		this.getContentPane().add(new JLabel("SOUTH", JLabel.CENTER),
				BorderLayout.SOUTH);
		PilingPanel pile = new PilingPanel();
		this.getContentPane().add(pile, BorderLayout.CENTER);
		pile.add(new JComponent() {
			private int x=20, y=20;
			{
				new Thread(new Runnable() {
					public void run() {
						while (true) {
							int w = getWidth(), h = getHeight();
							x += 20;
							y += 10;
							if (x > w) x = 20;
							if (y > h) y = 20;
							repaint();
							try {
								Thread.sleep(200);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}
				}).start();
			}
			
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.setColor(Color.RED);
				g.fillOval(x, y, 15, 15);
			}
		});
		pile.add(new JComponent() {
			private int x=20, y=20;
			{
				new Thread(new Runnable() {
					public void run() {
						while (true) {
							int w = getWidth(), h = getHeight();
							x += 10;
							y += 10;
							if (x > w) x = 20;
							if (y > h) y = 20;
							repaint();
							try {
								Thread.sleep(100);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}
				}).start();
			}
			
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.setColor(Color.BLUE);
				g.fillOval(x, y, 15, 15);
			}
		});
		pile.add(new JComponent() {
			private int x=20, y=20;
			{
				new Thread(new Runnable() {
					public void run() {
						while (true) {
							int w = getWidth(), h = getHeight();
							x += 10;
							y -= 10;
							if (x > w) x = 20;
							if (y <= 0) y = h;
							repaint();
							try {
								Thread.sleep(100);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}
				}).start();
			}
			
			public void paintComponent(Graphics g) {
				super.paintComponent(g);
				g.setColor(Color.GREEN);
				g.fillOval(x, y, 15, 15);
			}
		});
		JPanel panel = new JPanel();
		panel.setBackground(Color.CYAN);
		pile.add(panel);
	}

	class PilingPanel extends JPanel implements LayoutManager {
		private Dimension dimension = new Dimension(100, 100);
		private List<Component> components;

		public PilingPanel() {
			this.setLayout(this);
			components = new ArrayList<Component>();
		}

		public Component add(Component comp) {
			this.components.add(comp);
			return super.add(comp);
		}

		public void layoutContainer(Container parent) {
			int w = parent.getWidth(), h = parent.getHeight();
			for (int i = 0; i < components.size(); i++)
				components.get(i).setBounds(0, 0, w, h);
		}

		public void addLayoutComponent(String name, Component comp) {
		}

		public Dimension minimumLayoutSize(Container parent) {
			return dimension;
		}

		public Dimension preferredLayoutSize(Container parent) {
			return dimension;
		}

		public void removeLayoutComponent(Component comp) {
		}
	}

	public static void main(String[] args) {
		JFrame frame = new PanelPileDemo();
		frame.setBounds(0, 0, 500, 300);
		frame.setLocationRelativeTo(null);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
	}
}
 
das problem bei deiner ausgangsvariante ist glaub ich, dass du nicht 2 panels an die gleiche stelle des layouts setzen kannst, dann wird die 1te gelöscht.
aber um das zu lösen musst dus glaubich nich so umständlich machen mit neuen layouts oder sonstwas. ich hab eimfach die panels ineinadner geaddet, anstatt auf das tiefstliegende. das sieht dann so aus:
Java:
    main.add(colourGrid);
    FlowLayout flow0 = new FlowLayout();
    flow0.setHgap(0);
    flow0.setVgap(0);
    colourGrid.setLayout(flow0);
    //colourGrid.setOpaque(false);

    colourGrid.add(masterExploder);
    masterExploder.setBackground(grey);
    masterExploder.setPreferredSize(new Dimension(width*20, height*20));
    masterExploder.setOpaque(false);
    masterExploder.setLayout(flow0);
    
    masterExploder.add(backSurface);
    backSurface.setOpaque(false);

masterExploder ist ein panel was vorher schon definiert wurde, seine einbindung ist repräsentativ für das prinzip. ich hoffe das hilft dir.
 

bloodyrocky

Mitglied
Ja genau, das Problem ist, dass man 2 Panels nicht an der gleichen Position platzieren kann. Sobald ich das 2 an die gleiche Position platziert habe wurde das erste "gelöscht". Ich habe im Nachhinein festgestellt, das es unnötig war Panels zu verwenden und habe es mit Labels gelöst, da es sich um Bilder handelt, die animiert werden sollen. Aber auch hier taten sich neue Probleme auf, die ich zwar beheben konnte, leider aber nicht den Grund genau nachvollziehen kann.

Werde mir aber deine Lösung auch mal genauer anschauen, aber wenn ich richtig sehe, war mein Fehler einfach nur, dass ich beide Panels an der gleichen Position in das main Panel gelegt habe. Richtig gewesen wäre es wohl, wenn ich mainPanel.add(unteresPanel) und unteresPanel.add(oberesPanel) gemacht hätte und bei beiden die Opaque auf false gestellt hätte. Dann sollte es funktionieren. Nur ist es dann auch wieder etwas komplizierter mit der Animation.

Grüße BR
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Mehrere Panels auf JFrame AWT, Swing, JavaFX & SWT 8
I GUI, das verschiedene Panels hat (Von Seite zu Seite navigieren) AWT, Swing, JavaFX & SWT 7
G LayoutManager Panels anordnen über Schleifenvariablen AWT, Swing, JavaFX & SWT 7
B Bounds aller Panels aktualisieren AWT, Swing, JavaFX & SWT 0
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L Swing Panels bewegen wie Windows 10 Kacheln AWT, Swing, JavaFX & SWT 0
G LayoutManager Beliebige Anzahl von Panels für LayoutManager AWT, Swing, JavaFX & SWT 3
T Swing Bug: mehrfache Panels bei Mouseover? AWT, Swing, JavaFX & SWT 11
P Zwischen verschiedenen Panels wechseln AWT, Swing, JavaFX & SWT 3
F abgeleitete Panels von einem ContentPanel AWT, Swing, JavaFX & SWT 4
K Event Handling Über JMenuBar die diversen Panels anzeigen AWT, Swing, JavaFX & SWT 10
DaCrazyJavaExpert Swing Zwei gleichgroße Panels in einem Scrollpane mit Layout AWT, Swing, JavaFX & SWT 9
F AWT mehrere Panels in einem Frame AWT, Swing, JavaFX & SWT 17
R Swing panels nebeneinander mit BoxLayout.X_AXIS AWT, Swing, JavaFX & SWT 4
P Swing Panels Wechseln AWT, Swing, JavaFX & SWT 9
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
Thallius Swing Mehrere tausend "Panels" erstellen AWT, Swing, JavaFX & SWT 3
P Drag & Drop zwischen Panels AWT, Swing, JavaFX & SWT 0
V AWT Panels überlappen AWT, Swing, JavaFX & SWT 1
K Panels mit eigenen Controllern in Main-View einbauen AWT, Swing, JavaFX & SWT 4
U Swing Panels im Contentpane durchschalten AWT, Swing, JavaFX & SWT 1
M Handling 1 Fenster mehrere Panels AWT, Swing, JavaFX & SWT 2
S Swing Plätze von 2 panels vertauschen AWT, Swing, JavaFX & SWT 4
T Panels mit Button verbinden AWT, Swing, JavaFX & SWT 3
F Swing Wie verwalte ich meine Panels richtig? AWT, Swing, JavaFX & SWT 2
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
Java-Insel LayoutManager Ein GridBagLayout-Objekt für mehrere Panels? AWT, Swing, JavaFX & SWT 2
D Stapelung von Panels AWT, Swing, JavaFX & SWT 6
V Swing MouseEvents bei gestapelten Panels AWT, Swing, JavaFX & SWT 2
B JApplet zwei Panels autobreite? AWT, Swing, JavaFX & SWT 2
kodela Teil eines Panels als Graphik speichern AWT, Swing, JavaFX & SWT 3
Kenan89 LayoutManager MigLayout Positionierung von Panels AWT, Swing, JavaFX & SWT 4
A Panels in JavaFX zur Laufzeit erzeugen AWT, Swing, JavaFX & SWT 5
D JButton-Click in JList mit Panels (auf dem der Button ist) AWT, Swing, JavaFX & SWT 6
L Mehre Panels einen Frame zuweisen AWT, Swing, JavaFX & SWT 11
F Panels über buttons zu anderen Panels hinzufügen AWT, Swing, JavaFX & SWT 2
X Swing Resizing der Komponenten innheralb eines Panels AWT, Swing, JavaFX & SWT 2
J Problem mit der Höhe eines Panels AWT, Swing, JavaFX & SWT 11
M Swing JTabbedPane Panels deaktivieren AWT, Swing, JavaFX & SWT 2
S Swing (Nicht) Vergrößern von Panels AWT, Swing, JavaFX & SWT 3
S Drag and Drop über 2 Panels AWT, Swing, JavaFX & SWT 2
B LayoutManager Zeilenweise Anordnung von Panels AWT, Swing, JavaFX & SWT 19
B Panels wechseln auf Knopfdruck AWT, Swing, JavaFX & SWT 17
N Hilfe bei Panels! AWT, Swing, JavaFX & SWT 11
J LayoutManager Panels übereinander AWT, Swing, JavaFX & SWT 3
P Von einem Panel auf die Objekte des anderen Panels zugreifen AWT, Swing, JavaFX & SWT 3
C Aufklappbare Panels AWT, Swing, JavaFX & SWT 2
D Panels Dynamisch zur Laufzeit austauschen AWT, Swing, JavaFX & SWT 2
D Vererbung von Panels AWT, Swing, JavaFX & SWT 8
E Wie Breite und Höhe eines Panels festlegen? AWT, Swing, JavaFX & SWT 5
I 2 Panels übereinander, 1 transparent AWT, Swing, JavaFX & SWT 2
S GridBagLayout Panels AWT, Swing, JavaFX & SWT 2
W Panels vertikal anordnen AWT, Swing, JavaFX & SWT 10
R Swing Kommunikation zwischen Panels AWT, Swing, JavaFX & SWT 2
F Abschaltbare Panels AWT, Swing, JavaFX & SWT 5
aze Layout auf Teil eines Panels anwenden AWT, Swing, JavaFX & SWT 5
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
I Swing Positionieren von Panels mit layoutManager AWT, Swing, JavaFX & SWT 6
B Java Grafiken an bestimmter Positon des Panels anzeigen AWT, Swing, JavaFX & SWT 6
S import von Klassen (zwei Panels eine Form) AWT, Swing, JavaFX & SWT 39
K Zwei Panels zentriert anordnen AWT, Swing, JavaFX & SWT 3
H2SO3- AWT seltsammes verhalten eines Panels AWT, Swing, JavaFX & SWT 9
S Buttons, Panels etc. zu einer Teilkomponente hinzufügen AWT, Swing, JavaFX & SWT 5
S mehere panels übereinander AWT, Swing, JavaFX & SWT 2
Z Swing Gif's in panels einfügen AWT, Swing, JavaFX & SWT 11
N Überschneidung von Panels umgehen AWT, Swing, JavaFX & SWT 3
D java.lang.IllegalArgumentException beim Darstellen eines Panels AWT, Swing, JavaFX & SWT 7
T Border eines Panels nicht an der rechten Kante anzeigen AWT, Swing, JavaFX & SWT 7
F name des panels in der ein button liegt rausfinden AWT, Swing, JavaFX & SWT 10
R AWT: Aufteilung mit Panels? AWT, Swing, JavaFX & SWT 2
L Focus für KeyListener auf verschiedene Panels AWT, Swing, JavaFX & SWT 2
G Ein Frame mit mehreren austauschbaren Panels AWT, Swing, JavaFX & SWT 3
I Applet mit Panels (so richtig, gehts besser?) AWT, Swing, JavaFX & SWT 3
G designfrage zu 2 panels AWT, Swing, JavaFX & SWT 2
hdi zeitgleiches fokusieren von zwei panels AWT, Swing, JavaFX & SWT 2
G 2 Panels, 2 Listener, 1 Problem AWT, Swing, JavaFX & SWT 2
G Im applet auf panels zeichnen AWT, Swing, JavaFX & SWT 9
G Im Applet Panels anzeigen lassen AWT, Swing, JavaFX & SWT 2
G Editierbarkeit aller Komponenten eines Panels AWT, Swing, JavaFX & SWT 5
R Kleine Panels auf einem großen Panel frei platzieren AWT, Swing, JavaFX & SWT 11
G Remove Panels von JFrame AWT, Swing, JavaFX & SWT 5
M Ausrichtung eines Panels AWT, Swing, JavaFX & SWT 7
H Frames oder Panels für mehrere Ansichten? AWT, Swing, JavaFX & SWT 4
M Problem mit Cursor für Panels AWT, Swing, JavaFX & SWT 4
Kidao Mehrer Panels, mit Buttons in einem Frame abwechselnd laden? AWT, Swing, JavaFX & SWT 3
M Hallo Herr Uhres, Frage zu DND_Demo: Ausrichten der Panels:) AWT, Swing, JavaFX & SWT 4
O Panels ein und ausblenden - geht das? AWT, Swing, JavaFX & SWT 3
O eine Frage zu Panels AWT, Swing, JavaFX & SWT 10
M Problem bei Repaint von Panels AWT, Swing, JavaFX & SWT 2
M Größe des Panels ändern? AWT, Swing, JavaFX & SWT 3
O haben panels von anfang an einen dummen rand? AWT, Swing, JavaFX & SWT 19
G Zwischen Panels in einem JFrame wechseln AWT, Swing, JavaFX & SWT 4
M JTree und Anzeige des entsprechenden Panels AWT, Swing, JavaFX & SWT 5
M JList mit unbestimmter Anzahl Panels füllen AWT, Swing, JavaFX & SWT 4
K 2 Panels und Layouts AWT, Swing, JavaFX & SWT 2
K abstände zwischen Panels? AWT, Swing, JavaFX & SWT 3
U suchverfahren vergleich einbinden von panels ? in applet ;) AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben