Panel wird nicht angezeigt und Fragen zum CardLayout

DrZaius

Mitglied
Heyho,

Ich möchte eigentlich nur ein Panel anzeigen und ein anderes ausblenden. Ich hab dabei ein kleines Problem, nämlich dass es nicht so passiert wie ich will :D
Ich poste hier mal ein Stück Code

Java:
public class Gui implements ActionListener{

JPanel panelBlau = new JPanel();
JPanel panelRed = new JPanel();
JButton bBlau = new JButton();
JFrame f = new JFrame();
JButton bRed = new JButton();


public static void main(String[] args){
		
		new Gui();
	}
	
	public Gui(){
		f.setSize(500,500);
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		panelBlau.setBackground(Color.blue);
		
		bBlau.setBounds(100,100,100,100);
		bBlau.addActionListener(this);
		panelBlau.add(bBlau);
		panelRed.setBackground(Color.red);
		       
		bRed.setBounds(100,100,100,100);
		bRed.addActionListener(this);
		 
		panelRed.add(bRed);
		panelRed.setVisible(false);
		f.add(panelRed);
		f.add(panelBlau);				
		
		f.setVisible(true);
	}

        @Override
	public void actionPerformed(ActionEvent e) {
		if(e.getSource()==bBlau){
			panelBlau.setVisible(false);   	//
			panelRed.setVisible(true);		// <-- Sichtbarkeit wird vertauscht, eigentlich..
			
		}
		if(e.getSource()==bRed){
			panelRed.setVisible(false);
			panelBlau.setVisible(true);
		}
		
	}
	
}

Jetzt ist das Problem, dass nach dem Button von dem blauen Bildschirm das Frame leer wird.
Ich könnte das ganze lösen, indem ich das rote Panel erst im ActionListener adde. Ist das "unschön"?
Bei der Google-Suche bin ich aber auch auf das CardLayout gestoßen.
Kann man, wenn man das CardLayout für ein Panel benutzt, auch noch ein anderes Layout benutzen? (bsp. GridBagLayout) oder kann ich ein Panel mit dem GridBagLayout zu einem Panel mit dem CardLayout hinzufügen?
 
Zuletzt bearbeitet:

EasyEagle

Aktives Mitglied
Hallo DrZaius,

was meinst du mit "indem ich das rote Panel erst im ActionListener adde"? Das hab ich nicht ganz verstanden. :)

Grundsätzlich gilt folgendes:
Ein JFrame ist ein sog. Top-Level Container und leitet von der Klasse Window ab.
Das bedeutet er hat eine Komponente ContentPane, die dann die Oberflächenelemente beherbergt.
Der JFrame ist dann der Root-Knoten für alle darunter liegenenden Komponenten.

Die ContentPane ist eine Instanz der Klasse Container und kann damit auf jede andere Container-Klasse gecastet werden (z.B. JPanel).
Die ContentPane hat das BorderLayout als Default-Layout.

Damit kannst du z.B. dann folgende Sachen machen:
Java:
        JPanel panel = (JPanel) f.getContentPane();
        panel.add(panelRed, BorderLayout.CENTER);
        // oder
        f.getContentPane().add(panelRed, BorderLayout.CENTER);

Natürlich hast du die Möglichkeit dem ContentPane Container ein anderes Layout zuzuweisen.
Jedem Container kann immer nur ein Layout zugewiesen werden.
Aber du kannst natürlich die Container beliebig inneinander schachteln.

Hier ist ein guter Überblick über die verschiedenen Layouts: https://docs.oracle.com/javase/tutorial/uiswing/layout/visual.html

VG,
EasyEagle
 
Zuletzt bearbeitet:

DrZaius

Mitglied
Danke für die Antwort, mit dem "im ActionListener adden" meinte ich Folgendes:
Java:
public void actionPerformed(ActionEvent e) {
		if(e.getSource()==bBlau){
			panelBlau.setVisible(false); 
			f.add(panelRed);	
			
		}
		if(e.getSource()==bRed){
			f.remove(panelRed);
			panelBlau.setVisible(true);
		}
		
	}

Damit würde das auch funktionieren. Ist es nun besser ein CardLayout zu verwenden, oder es so zu machen wie o.g. ? Also mit besser meine ich, ob der Code dadurch kürzer und übersichtlicher wird, oder ob es abzuraten ist mit dem CardLayout zu arbeiten.
 

X5-599

Top Contributor
@DrZaius

Mit CardLayout kenne ich mich nicht aus. Aber zu deinem aktuellen Problem. Wie schon gesagt wurde hat das Frame (genauer gesagt das ContentPane) das BorderLayout. Du überschreibst dir dein gerade gesetztes panelRed mit dem panelBlau.
Java:
f.add(panelRed);
f.add(panelBlau);

Denn wenn nichts weiter angegeben wird, werden Components an BorderLayout.CENTER gesetzt. Und da kann es halt immer nur ein Component geben. Du könntest z.B. folgendes machen:
Java:
f.add(panelRed, BorderLayout.WEST);
f.add(panelBlau, BorderLayout.EAST);

Wenn dir das nicht gefällt, kannst du entweder dem JFrame(contentPane) ein anderes Layout verpassen
Code:
f.setLayout(new WasAuchImmerManager());
oder du schaffst dir ein JPanel mit favorisierten LayoutManager und setzt das ins BorderLayout.CENTER des JFrames.
Java:
JPanel p = new JPanel();
p.setLayout(new WasAuchImmerManager());

//...panelRed und panelBlau dem "p" hinzufügen

f.add(p, BorderLayout.CENTER); //ist wie gesagt dasselbe wie: f.add(p);
 
Zuletzt bearbeitet von einem Moderator:

EasyEagle

Aktives Mitglied
Also die Lösung mit "im ActionListener adden" halte ich für unübersichtlich.
Ich denke das CardLayout ist in dem Fall genau das Richtige.

VG
 

DrZaius

Mitglied
@X5-599
Das Prinzip verstehe und kenne ich schon, aber das Problem war ja, dass die Panels nacheinander angezeigt werden sollten. Aber trotzdem danke. Ich denk, dass ich mich jetzt erstmal in das CardLayout einarbeite, so wie EasyEagle sagt.
 

Lemao

Mitglied
Die ContentPane des JFrame ist keine Instanz der Klasse Container sondern eine Instanz der Klasse JPanel, was dir die Anweisung System.out.println(getContentPane().getClass()); verrät, und kann damit sicherlich nicht in jede andere Container-Klasse (das wäre dann alles was sich von Container ableitet?) gecastet werden sondern nur in JPanel und dessen Superklassen. hier meine Idee bezüglich der Panels:

Java:
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Gui implements ActionListener {

	JFrame frame = new JFrame();
	JPanel panelBlau = new JPanel();
	JPanel panelRed = new JPanel();
	JButton buttonBlau = new JButton();
	JButton buttonRed = new JButton();
	CardLayout cardLayout = new CardLayout();
	JPanel holder = new JPanel(cardLayout);

	public Gui() {
		frame.setSize(500, 500);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);

		panelBlau.setLayout(null);
		buttonBlau.setBounds(100, 100, 100, 100);
		panelBlau.setBackground(Color.blue);
		buttonBlau.addActionListener(this);
		panelBlau.add(buttonBlau);

		panelRed.setLayout(null);
		buttonRed.setBounds(100, 100, 100, 100);
		panelRed.setBackground(Color.red);
		buttonRed.addActionListener(this);
		panelRed.add(buttonRed);

		holder.add(panelBlau);
		holder.add(panelRed);
		cardLayout.addLayoutComponent(panelBlau, "blau");
		cardLayout.addLayoutComponent(panelRed, "rot");

		frame.add(holder);
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == buttonBlau) {
			cardLayout.show(holder, "rot");
		}
		if (e.getSource() == buttonRed) {
			cardLayout.show(holder, "blau");
		}
	}

	public static void main(String[] args) {
		new Gui();
	}

}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M AWT Panel wird nicht angezeigt AWT, Swing, JavaFX & SWT 7
bluerob Panel im BorderLayout South wird nicht angezeigt AWT, Swing, JavaFX & SWT 5
H Scroll Panel wird nicht hinzugefügt AWT, Swing, JavaFX & SWT 6
padrino Panel wird nicht gezeichnet AWT, Swing, JavaFX & SWT 5
M CardLayout: Panel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
L Panel wird nicht richtig neu gezeichnet AWT, Swing, JavaFX & SWT 8
T JTabbedPane wird im Panel nicht angezeigt ? AWT, Swing, JavaFX & SWT 2
S Nur graues Panel wird angezeigt AWT, Swing, JavaFX & SWT 3
A Card Panel wird nur einmal eingeblendet AWT, Swing, JavaFX & SWT 3
K Linie wird falsch auf Panel gezeichnet AWT, Swing, JavaFX & SWT 11
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
CptK Ordentlicher Code & Panel ab bestimmter Komponentenzahl scrollbar machen AWT, Swing, JavaFX & SWT 12
B JTextField in Panel positionieren AWT, Swing, JavaFX & SWT 1
R Swing Panel nur bei Maus sichtbar AWT, Swing, JavaFX & SWT 2
B mit Maus verschiebbares Panel AWT, Swing, JavaFX & SWT 2
S Labels in Panel erstellen AWT, Swing, JavaFX & SWT 1
H Aus Array Container Panel an Tabbedpane zuweisen AWT, Swing, JavaFX & SWT 29
O Kann kei neues Panel zum zeichnen aufrufen... AWT, Swing, JavaFX & SWT 4
J Overlay Panel statt neues Fenster AWT, Swing, JavaFX & SWT 6
CptK Swing DropdownMenu über Panel-Grenzen hinaus anzeigen AWT, Swing, JavaFX & SWT 1
J Aufklappbares Panel in Toolbar AWT, Swing, JavaFX & SWT 6
L ActionListener zu Button in Panel hinzufügen AWT, Swing, JavaFX & SWT 10
S Swing Panel übernimmt komponenten von anderem AWT, Swing, JavaFX & SWT 7
J Panel auf Frame positionieren AWT, Swing, JavaFX & SWT 9
J JFrame Panel hinzufügen AWT, Swing, JavaFX & SWT 10
B AWT Panel größe im BorderLayout einstellen AWT, Swing, JavaFX & SWT 1
K Swing Entfernen von Panel funktioniert nicht AWT, Swing, JavaFX & SWT 5
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
L Swing JTable im Panel darstellen AWT, Swing, JavaFX & SWT 8
L JavaFX Klickverhalten bei einem Panel AWT, Swing, JavaFX & SWT 1
A Swing Panel mit ScrollBar AWT, Swing, JavaFX & SWT 7
K Panel verdeckt MenuItem AWT, Swing, JavaFX & SWT 5
H zwei gleich große Panels getrennt durch ein weiteres Panel AWT, Swing, JavaFX & SWT 10
N Swing Label auf Panel legen.. AWT, Swing, JavaFX & SWT 2
J Panel auf Frame löschen und neues Panel Hinzufügen AWT, Swing, JavaFX & SWT 4
T Swing Graphics auf Panel AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
P AWT Panel überschreibt vorheriges... AWT, Swing, JavaFX & SWT 2
Thallius Swing Warum kann man Texte im Panel nicht markieren? AWT, Swing, JavaFX & SWT 1
S NetBeans, Panel in Frame einfügen AWT, Swing, JavaFX & SWT 3
P Fenstergröße ändern, Panel soll gleich bleiben AWT, Swing, JavaFX & SWT 2
M JavaFX Slide Panel AWT, Swing, JavaFX & SWT 2
P Swing Panel nicht sichtbar AWT, Swing, JavaFX & SWT 1
M Swing JtextField Panel in ander Panel aufrufen AWT, Swing, JavaFX & SWT 0
M Panel in geerbter JFrame Klasse adden AWT, Swing, JavaFX & SWT 4
S ScrollPane in Textarea und auf Panel AWT, Swing, JavaFX & SWT 4
D Swing Bei Button Click neues Panel laden AWT, Swing, JavaFX & SWT 3
S Swing JMenu löscht auf panel gezeichnetes AWT, Swing, JavaFX & SWT 3
X Java Panel zeitweise repainten AWT, Swing, JavaFX & SWT 8
X Panel Probleme (Tetris) AWT, Swing, JavaFX & SWT 8
W Swing Nicht-Editierbares Textfeld in Panel in ScrollPane AWT, Swing, JavaFX & SWT 9
B zweidimensionales Buttonarray auf Panel AWT, Swing, JavaFX & SWT 11
F JAVA-EDITOR: Panel in Frame aufnehmen AWT, Swing, JavaFX & SWT 3
F textarea lässt panel verschwinden AWT, Swing, JavaFX & SWT 4
T LayoutManager GridLayout panel.setSize funktioniert nicht AWT, Swing, JavaFX & SWT 1
A Panel lässt sich nicht bewegen AWT, Swing, JavaFX & SWT 2
E Panel mit Leben füllen AWT, Swing, JavaFX & SWT 2
K Swing Maus in Panel einsperren AWT, Swing, JavaFX & SWT 8
D Panel in Panel zentriert nicht richtig AWT, Swing, JavaFX & SWT 3
P Swing Panel-austausch über einen MenuListener AWT, Swing, JavaFX & SWT 2
1 Swing Bestimme ob ein Subelement eines panel den Fokus verloren hat AWT, Swing, JavaFX & SWT 2
P Swing Button über gesamtes Panel AWT, Swing, JavaFX & SWT 2
O LayoutManager Panel in Panel "maximieren" AWT, Swing, JavaFX & SWT 2
C AWT Horizontale Linie in einem Panel AWT, Swing, JavaFX & SWT 12
T Über mehrere Panel zeichnen AWT, Swing, JavaFX & SWT 2
B Export eines Panel mit ScrollBar AWT, Swing, JavaFX & SWT 4
S Größe von Panel verändern welches auf anderem Panel sitzt AWT, Swing, JavaFX & SWT 10
M Swing Panel klassenübergreifend ändern AWT, Swing, JavaFX & SWT 6
M Swing JFrame in einem Panel zeichnen AWT, Swing, JavaFX & SWT 3
A 2D-Grafik Panel inhalt löschen AWT, Swing, JavaFX & SWT 5
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
X Swing Panel Extra Klasse & Aufruf über Button AWT, Swing, JavaFX & SWT 18
Kenan89 2D-Grafik paintComponent quetsch alles in Panel AWT, Swing, JavaFX & SWT 26
C Bild auf Panel vergrößern und verschieben AWT, Swing, JavaFX & SWT 4
C ImageIcon eines Labels auf einem Panel in neuem Fenster anzeigen AWT, Swing, JavaFX & SWT 2
H LayoutManager Panel verschieben sich AWT, Swing, JavaFX & SWT 5
O Swing JTree um Label (oder Panel) erweitern AWT, Swing, JavaFX & SWT 9
S Vaadin: Panel AWT, Swing, JavaFX & SWT 10
R paintComponent malt bei repaint() Rahmen um Panel AWT, Swing, JavaFX & SWT 7
C Etwas durchsichtig machen über einem Panel AWT, Swing, JavaFX & SWT 7
K Panel zu Laufzeit ändern AWT, Swing, JavaFX & SWT 6
T eigene Klasse für Panel AWT, Swing, JavaFX & SWT 9
D Panel aus externer Klasse holen AWT, Swing, JavaFX & SWT 2
L Swing dynamisches Image-Panel in Layout einbinden AWT, Swing, JavaFX & SWT 10
T Listener in anderen Panel deaktivieren AWT, Swing, JavaFX & SWT 3
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
GUI-Programmer Informations-Panel an Label AWT, Swing, JavaFX & SWT 2
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
J JPanel mit anderem Panel aus anderer Klasse setzen AWT, Swing, JavaFX & SWT 4
F 2D-Grafik Panel-Zeichnung erscheint nicht AWT, Swing, JavaFX & SWT 7
S Panel rapaint AWT, Swing, JavaFX & SWT 18
T AffineTransform wirkt sich nur auf dem ersten Panel aus AWT, Swing, JavaFX & SWT 3
K Swing: Panel in Panel erzeugen AWT, Swing, JavaFX & SWT 11
M Panel in SWT einfügen AWT, Swing, JavaFX & SWT 12
T auf Panel zeichnen AWT, Swing, JavaFX & SWT 4
A FormLayout Panel-Breite AWT, Swing, JavaFX & SWT 7
Dit_ "Expandable" Panel ? AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben