# Problem mit JPanel und CardLayout



## pdikij (5. Juli 2007)

Hallo Leute!

Ich möchte in meiner Anwendung CardLayout nutzten habe aber folgendes Problem:

Ich will mehrere JPanel mit hilfe von CardLayout überlagern, bekomme aber folgende Fehlermeldung:


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
	at java.awt.Container.addImpl(Unknown Source)
	at java.awt.Container.add(Unknown Source)
	at fertig.ErfassenFrame.getJPanelDown(ErfassenFrame.java:267)
	at fertig.ErfassenFrame.getJContentPane(ErfassenFrame.java:240)
	at fertig.ErfassenFrame.initialize(ErfassenFrame.java:220)
	at fertig.ErfassenFrame.<init>(ErfassenFrame.java:214)
	at fertig.MainFrame.createFrame(MainFrame.java:151)
	at fertig.MainFrame.actionPerformed(MainFrame.java:127)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.AbstractButton.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Window.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)
```

Könnte mir jemand auf mein Fehler hinweisen und eine mögliche Lösung vorschlagen?
Währe sehr dankbar (ich habe noch nie mit CardLayout gearbeitet und konnte auch mit googeln keine Lösung für mein Problem finden!)!

Hier ist ein Ausschnitt aus meinem Quellcode:


```
public class ErfassenFrame extends JInternalFrame {
private JPanel cards;
private JPanel jContentPane = null;
private JScrollPane jScrollPaneTop = null;
private JPanel jPanelDown = null;
private JPanel jPLaptopbestand = null;
private JPanel pNeuLaptopbestand = null;
public ErfassenFrame() {
initialize();
private void initialize() {
this.setContentPane(getJContentPane());
}
private JPanel getJContentPane() {
      if (jContentPane == null) {
         jContentPane = new JPanel();
         jContentPane.setLayout(new GridLayout(2, 0));
         jContentPane.add(getJScrollPaneTop(), getJScrollPaneTop().getName());
         jContentPane.add(getJPanelDown(), getJPanelDown().getName());
         }
         return jContentPane;
}
private JPanel getJPanelDown() {
	if (jPanelDown == null) {
		jPanelDown = new JPanel();
		jPanelDown.setLayout(null);
		jPanelDown.setBackground(new Color(204, 204, 204));
		jPanelDown.add(getJPanel5(), null);
		jPanelDown.add(getJPanel(), null);
		jPanelDown.add(getJPanel1(), null);
		JPanel card1 = new JPanel();
		JPanel card2 = new JPanel();
		card1.add(pNeuLaptopbestand);
		card2.add(jPLaptopbestand);
		cards = new JPanel(new CardLayout());
		cards.setBounds(new Rectangle(270, 9, 735, 236));
		cards.add(card1, "NeuLaptopbestand");
		cards.add(card2, "UpdLaptopbestand");
		jPanelDown.add(cards);
	}
	return jPanelDown;
}


private JPanel getPNeuLaptopbestand() {
	if (pNeuLaptopbestand == null) {
		pNeuLaptopbestand = new JPanel();
		pNeuLaptopbestand.setLayout(null);
		pNeuLaptopbestand.setBounds(new Rectangle(924, 5, 73, 231));
		pNeuLaptopbestand.setBorder(BorderFactory.createTitledBorder(null, "Neue Daten eingeben - Laptopbestand (Neuanlage)", TitledBorder.DEFAULT_JUSTIFICATION, TitledBorder.DEFAULT_POSITION, new Font("Dialog", Font.BOLD, 12), new Color(0, 102, 255)));
	}
	return pNeuLaptopbestand;
}

}
```

Ich freue mich über jede Hilfe... 

pdikij


----------



## zerix (5. Juli 2007)

Hallo,

ich hab jetzt nicht getestet oder sowas, aber ich würde einfach mal sagen, dass es an diesen Zeilen liegt.

```
jPanelDown.add(getJPanel5(), null);
```
Also alle Zeilen in denen null als zweiter Parameter übergeben wird, lass das doch einfach weg. Warum machst du das überhaupt?


MFG

zEriX


----------



## pdikij (5. Juli 2007)

Ok, dann mach ich mich auf den Weg und versuch es rauszufinden... 
Ich meld mich dann!

Gruß pdikij


----------



## zerix (5. Juli 2007)

Ich hatte meinen Beitrag nochmal geändert. Schau nochmal nach.


----------



## pdikij (5. Juli 2007)

zerix hat gesagt.:


> Also alle Zeilen in denen null als zweiter Parameter übergeben wird, lass das doch einfach weg. Warum machst du das überhaupt?



Programmierung von grafischen Oberflächen ist für mich noch ganz neu. Ich musste mich mit fertigen Beispielen rein arbeiten und deshalb habe ich manche Sachen übernommen... 



zerix hat gesagt.:


> aber ich würde einfach mal sagen, dass es an diesen Zeilen liegt.



Ich habe es weggemacht, trotzdem kommt der gleiche Fehler... 
Gruß

pdikij


----------



## MeinerEiner_80 (5. Juli 2007)

Ich denke mal, es liegt an diesen Zeilen:

```
JPanel card1 = new JPanel();
JPanel card2 = new JPanel();
card1.add(pNeuLaptopbestand);
card2.add(jPLaptopbestand);  
...
 cards.add(card1, "NeuLaptopbestand");
cards.add(card2, "UpdLaptopbestand");
```

pNeuLaptopbestand und UpdLaptopbestand werden wohl noch null sein.
Du solltest wohl eher die getPNeuLaptopbestand() und die andere getter Aufrufen..

*grüssle*
MeinerEiner


----------



## zerix (5. Juli 2007)

Ok, dann wird es so sein wie ich vorher schon meinte, dass irgendwas was du addest null ist.

MFG

zEriX


----------



## pdikij (5. Juli 2007)

MeinerEiner_80 hat gesagt.:


> ```
> card1.add(pNeuLaptopbestand);
> card2.add(jPLaptopbestand);
> ...
> ...



Ich habe jetzt diese zeilen so umgebaut:

```
alt:
card1.add(pNeuLaptopbestand);
card2.add(jPLaptopbestand);  

neu:
card1.add(getPNeuLaptopbestand);
card2.add(getJPLaptopbestand);
```
Das Anzeigen von der "MutterPanel" funktioniert jetzt!  Dankeschön für den Hinweiß! ;-)

Nun weiß ich noch nicht wie ich die Inhalte (JPanels) da anzeigen soll...
Hab mit folgendem versucht geht aber nicht:

Ich möchte wenn ich auf diesen Button drücke das diese JPanels erst dann sichbar werden...

```
shw_jButton1.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					
					CardLayout cl = (CardLayout)(cards.getLayout());
										
					showTableContent();
					String table = new String();
					table = tbls_jComboBox1.getSelectedItem().toString();
					if (getCbUpdate().isSelected() && table.equals("laptopbestand")){
						System.out.println("Wichtig! " +table);
						cl.show(cards,"UpdLaptopbestand");
						} else {
							System.out.println("Ups UPdate");						
					} if (getCbNeuAnlegen().isSelected() && table.equals("laptopbestand")){
						
						cl.show(cards,"NeuLaptopbestand");
					} else {
						System.out.println("Ups Neu");
					}
					
				}
			});
		}
		return shw_jButton1;
	}

System.out.println("Ups UPdate"); // Diese Zeile ist nur zur Testzwecken da...
```

Könntet ihr mir vielleicht sagen wie ich das organisieren kann?

Schöne Grüße

pdikij


----------



## pdikij (6. Juli 2007)

Hallo, zEriX, MeinerEiner und Andere!

Ich weiß nicht wie diese show() Funktion am besten organisieren soll...

Könntet Ihr mir da helfen? 
Oben habe ich mein Problem beschrieben...

Danke euch!

Gruß
pdikij


----------



## zerix (6. Juli 2007)

Was genau geht denn da nicht?


----------



## pdikij (6. Juli 2007)

Diese Funktion show();
Es werden die Inhalte der JPanels nicht angezeigt...


----------



## MeinerEiner_80 (6. Juli 2007)

Sieht auf den ersten Blick okay aus..
bist du sicher das die jeweiligen If- Bedingugen erfüllt werden (Debugausgabe?), damit er die show() Methode überhaupt erreicht? 

*grüssle*
MeinerEiner


----------



## zerix (6. Juli 2007)

Das wäre auch mein erster Gedanke.

MFG

zEriX


----------



## pdikij (6. Juli 2007)

Ich hab da jetzt noch sowas probiert:
show() vor der if Bedingung geht auch nicht...

```
public void actionPerformed(java.awt.event.ActionEvent e) {

					CardLayout cl = (CardLayout) (cards.getLayout());

					cl.show(cards, "1");

					showTableContent();
					String table = new String();
					table = tbls_jComboBox1.getSelectedItem().toString();
					if (getCbUpdate().isSelected()
							&& table.equals("laptopbestand")) {
						System.out.println("Wichtig! " + table);
						System.out.println("Ups UPdate");

					} else {
						cl.show(cards, "2");

					}
					if (getCbNeuAnlegen().isSelected()
							&& table.equals("laptopbestand")) {

						cl.show(cards, "1");
					} else {
						System.out.println("Ups Neu");

					}
```


----------



## pdikij (6. Juli 2007)

Komischerweise habe ich da folgende Ausgabe in der Console:

```
Wichtig! laptopbestand
Ups UPdate
Ups Neu
```

Er hätte da ja eigentlich nicht in die zweite Bedingung reingehen sollen...


----------



## MeinerEiner_80 (6. Juli 2007)

Wieso hast du denn jetzt c1.showCards("1") da drin stehen?

Du weist hoffentlich, das wenn du die Panels mit

```
cards.add(card1, "NeuLaptopbestand");cards.add(card2, "UpdLaptopbestand");
```
hinzufügst, du sie auch mit


```
cards.show("NeuLaptopbestand"); cards.show("UpdLaptopbestand");
```
wieder zum Vorschein bringst..?

Die Debugausgabe zeigt doch folgendes:
Die erste if anweisung wird erfüllt und nicht deren else anweisung, daher wird auch keine komponente angezeigt.
die zweite if anweidung wird nicht erfüllt, sondern deren else anweisung, also wird auch keine komponente da drin..

ich würde mal sagen, du hast da einen kleinen denkfehler drin..


*grüssle*
MeinerEiner


----------



## pdikij (7. Juli 2007)

Hallo!

Sorry, es gab nen kleinen Missverständnis... Ich hab da mal für Testzwecke das 
umgestellt... von "NeuLaptopbestand" auf "1"...  Danke aber für den Hinweis!

Am besten poste ich die ganze Klasse am Montag... 
Ob da ein Denkfehler drin ist kann ich schlecht beurteilen, da es am Anfang mit normalen JPanel funktioniert hat... je nach dem was ausgewählt war, hat es einen von den beiden Panels angezeigt...

Ich wollt sie aber übereinander zeigen...
Das Problem ist aber das es in diesen "cards" garkeine von meinen beiden Panels anzeigt. 

Naja ich zeig euch dann die ganze Klasse am Montag!
Bis dene...

Schönes Wochenende
pdikij


----------



## MeinerEiner_80 (7. Juli 2007)

Ich glaub, es ist auch wirklich das beste, nochmal komplett zu posten.

Und dann vielleicht nochmal sagen, was du mit 


pdikij hat gesagt.:


> Ich wollt sie aber übereinander zeigen...


meinst?
Nur nochmal zur Klarstellung, mit einem CardLayout kannst du nur eine Komponente anzeigen. Mit einem CardLayout ist es nur relativ simpel, schnell zwischen den einzelnen Komponenten zu wechseln..

*grüssle*
MeinerEiner


----------



## pdikij (9. Juli 2007)

Hallo!
Ich poste jetzt meine ganze Klasse "ErfassenFrame".

Es kann sein, dass bei der if - Anweisung, wo ich das entsprechende card zur Anzeige auswähle, alles durcheinander ist... Ich hab alles versucht Zeigt trotzdem nix an...

Also hier ist die Klasse...

P.S. Mit übereinander anzeigen meine ich, dass jenachdem welche Option Ausgewählt ist möchte ich die entsprechenden Inhalte anzeigen...


----------



## MeinerEiner_80 (9. Juli 2007)

Moin!
Das erste, was mir aufgefallen ist, als ich mir das mal ein bisserl genauer angeguckt habe,
 ist
das man Komponenten in das CardLayout mit addLayoutComponent(Component,ident)
einfuegt.
Zudem hast du auch noch ein paar Probleme mit den Methoden 
getPNeuLaptopbestand() und  getJPLaptopbestand()

Statt diesen hab ich nunmal 2 Buttons eingefuegt und klappt es auch mit der Anzeige.


```
cards = new JPanel();
                        JPanel card1 = new JPanel();
            JPanel card2 = new JPanel();
            card1.add(new JButton("Test"));
            card2.add(new JButton("Test2"));
            CardLayout cl = new CardLayout();
                        
                        cards = new JPanel();
                        cards.setLayout(cl);
            cards.setBounds(new Rectangle(270, 9, 735, 236));
            cl.addLayoutComponent(card1,"1");
                        cl.addLayoutComponent(card2,"2");
                        cards.add(card1, "1");
            cards.add(card2, "2");
            cl.show(cards,"1");
                        return cards;
```

Also, getPNeuLaptopbestand() und  getJPLaptopbestand() musst du mal überarbeiten. Möglich das da irgendlweche Grössenangaben nicht stimmen.
 Zerix hat auch schonmal gesagt, das du solche Sachen:

```
jPLaptopbestand.add(jLabel4, null);
```
nicht machen sollst.
Stattdessen fügst du sie bitte mit 

```
jPLaptopbestand.add(jLabel4);
```
ein..

Ebenso solltest du auch das unterlassen:

```
jContentPane.setLayout(new GridLayout(2, 0));
```
Eine Spalte solltest du dem Layout schon geben...


*grüssle*
MeinerEiner


----------



## pdikij (10. Juli 2007)

Hallo Allerseits!
Hatte viel zu tun, deshalb hab mich auch lang nicht gemeldet...

Hab jetzt versucht es anzupassen mit denem Beispiel MeinerEiner
Habs bei dem Button mit eingefügt:

```
private JButton getShw_jButton1() {
		if (shw_jButton1 == null) {
			shw_jButton1 = new JButton();
			shw_jButton1.setText("Tabelle Auswählen");
			shw_jButton1.addActionListener(new java.awt.event.ActionListener() {

				public void actionPerformed(java.awt.event.ActionEvent e) {

					cards = new JPanel();
                    JPanel card1 = new JPanel();
                    JPanel card2 = new JPanel();
      	 			card1.add(getJPLaptopbestand());
      	 			card2.add(getPNeuLaptopbestand());
      	 			CardLayout cl = new CardLayout();
                    
                    cards = new JPanel();
                    cards.setLayout(cl);
                    cards.setBounds(new Rectangle(267, 86, 734, 234));
                    cl.addLayoutComponent(card1,"1");
                    cl.addLayoutComponent(card2,"2");
                    cards.add(card1, "1");
                    cards.add(card2, "2");
                    cl.show(cards,"1");
                    
                    jPanelDown.add(cards);
                    

					showTableContent();
					String table = new String();
					table = tbls_jComboBox1.getSelectedItem().toString();
					
					if (getCbUpdate().isSelected()
							&& table.equals("laptopbestand")) {
						System.out.println("Ups UPdate");

					} else {
						cl.show(cards, "2");

					}
					if (getCbNeuAnlegen().isSelected()
							&& table.equals("laptopbestand")) {

						cl.show(cards, "1");
					} else {
						System.out.println("Ups Neu");

					}

				}
			});
		}
		return shw_jButton1;
	}
```

Das Anzeigen beim Buttondrücken funktionier... aber es werden immer noch nicht die Inhalte von den JPanels angezeigt... 

Die Größenanpassung von den Cards an die JPanels habe ich gemacht.
Alle null-Werte bei neuen Elementen habe ich auch rausgenommen.

Und dieses Bild liefert mir das Programm (ein leeres card)...


----------



## MeinerEiner_80 (13. Juli 2007)

Moin!
Irgendwie verschlimmbesserst du immer alles.
Wieso erstellst du das Panel mit dem CardLayout und dessen Inhalt erst wenn der Button gedrückt wird?
So wie du es früher hattest, erst alles erstellen, dem CardLayout hinzufügen und dann beim Drücken des Buttons den gewünschten Inhalt anzeigen lassen, macht doch viel mehr Sinn.
Hast du das korrigiert, dann poste nochmal den kompletten Code..

*grüssle*
MeinerEiner


----------



## pdikij (13. Juli 2007)

Hallo!
Also hier ist nochmal mein ganzer Code...
Das ist das beste was mir eingefallen ist, und es klappt noch mit einem leeren Panel...
Aber es funktioniert immer noch nicht...
Ich weiß auch gar nicht ob ich die Komponenten in die richtige Methode gesetzt habe...
Währe sehr dankbar wenn du mir da ein bisschen hilfst! 

Schöne grüße 

pdikij


----------



## MeinerEiner_80 (13. Juli 2007)

Moin!
Was mir auffällt, ist das du das Panel cards nirgendwo hinzufügst...

Mir ist das auch echt zu groß zum durchgucken.. ich würde dir empfehlen, schmeiß das Ding über den Haufen. Dann solltest du dir einen GUIBuilder nehmen und das Ganze nochmal aufbauen. Ich blick durch den Code nämlich nicht wirklich durch und du ja auch nicht..

*grüssle*
MeinerEiner


----------



## pdikij (13. Juli 2007)

Naja, hab das ja auch mit Visual Editor von Eclipse zusammengebastelt... das Ergebnis sieht man ja.
Was meinst du mit 'cards' nirgendwo hinzufügen? Es wird doch dem unteren Panel hinzugefügt wenn der Knopf gedrückt wird... Oder verstehe ich da was falsch?

```
cl.show(cards,"1");
 jPanelDown.add(cards);
```


----------



## MeinerEiner_80 (13. Juli 2007)

Ja sorry, hab ich übersehen.

Aber mir fehlt die Zeit, mich wirklich mit dem ganzen Code auseinanderzusetzen. Sofern dir also niemand anders weiterhelfen kann, würde ich dir dennoch empfehlen, es nochmal neu aufzubauen...


*grüssle*
MeinerEiner


----------



## pdikij (16. Juli 2007)

Hallo!
Ich hab jetzt mein Problem gelöst und muss nicht die ganze Klasse neu aufsetzen!
Es lag an dem folgenden Schritt, dass es nicht angezeigt wurde:

```
cl.addLayoutComponent(card1,"1");
cl.addLayoutComponent(card2,"2");
cards.add(card1, "1");
cards.add(card2, "2");
```
Ich habe einfach das auf

```
cl.addLayoutComponent(getJPLaptopbestand(),"1");
cl.addLayoutComponent(getPNeuLaptopbestand(),"2");
cards.add(getJPLaptopbestand(), "1");
cards.add(getPNeuLaptopbestand(), "2");
```
geändert und jetzt funktioniert es auch!

Schönen Tag noch!

pdikij


----------

