JTabbedPane in Verbindung mit dem CardLayout -> fireStateChanged

Hallo,

ich habe eine JTabbedPane mit zwei Tabs. Beim Wechsel zwischen den beiden Tabs soll ein JPanel ausserhalb der JTabbedPane verändert werden (realisiert über das Cardlayout soll einmal eine JTable und einmal eine JTextArea angezeigt werden).

Ich bekomme über einen ChangeListener den selectierten Tab und möchte so im CardLayout zwischen den beiden Layouts wechseln.
Lass ich mir durch den Tabwechsel den Index des gerade aktiven Tabs ausgeben (über “getSelectedIndex()”), erhalte ich die erwarteten Werte 0 bzw. 1.

Hier

					System.out.println("TextPanel soll gezeigt werden");					
					CardLayout cl = (CardLayout)(panel.getLayout());
					cl.show(panel, TEXTPANEL);	```

wechselt die beim Start dargestellte JTabel in die JTextArea -> soll so sein

Ergänze ich nun den Code, so dass beim Wechsel auf den ersten Tab wieder die JTabel dargesllt wird, erhalte ich eine NullPointerException (fireStateChanged Fehler).

```	final JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.TOP);			
		tabbedPane.addChangeListener(new ChangeListener() {

			@Override
			public void stateChanged(ChangeEvent e) {
				// TODO Auto-generated method stub
				System.out.println(tabbedPane.getSelectedIndex());
		
				if (tabbedPane.getSelectedIndex()==1) {
					System.out.println("TextPanel soll gezeigt werden");					
					CardLayout cl = (CardLayout)(panel.getLayout());
					cl.show(panel, TEXTPANEL);														
				} else {
					System.out.println("JTabelPanel soll gezeigt werden");
					
					CardLayout cl = (CardLayout)(panel.getLayout());
					cl.show(panel, JTABELPANEL);
					
				}
				
				
			}
			
		});```


Fehlermeldung:
```java.lang.NullPointerException
0
JTabelPanel soll gezeigt werden
	at Mgmt.MainFrame$4.stateChanged(MainFrame.java:404)
	at javax.swing.JTabbedPane.fireStateChanged(JTabbedPane.java:400)
	at javax.swing.JTabbedPane$ModelListener.stateChanged(JTabbedPane.java:253)
	at javax.swing.DefaultSingleSelectionModel.fireStateChanged(DefaultSingleSelectionModel.java:116)
	at javax.swing.DefaultSingleSelectionModel.setSelectedIndex(DefaultSingleSelectionModel.java:50)
	at javax.swing.JTabbedPane.setSelectedIndexImpl(JTabbedPane.java:599)
	at javax.swing.JTabbedPane.setSelectedIndex(JTabbedPane.java:574)
	at javax.swing.JTabbedPane.insertTab(JTabbedPane.java:710)
	at javax.swing.JTabbedPane.addTab(JTabbedPane.java:746)
	at Mgmt.MainFrame.<init>(MainFrame.java:432)
	at Mgmt.MainFrame$1.run(MainFrame.java:247)
	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:672)
	at java.awt.EventQueue.access$400(EventQueue.java:81)
	at java.awt.EventQueue$2.run(EventQueue.java:633)
	at java.awt.EventQueue$2.run(EventQueue.java:631)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:642)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)```

Ich wäre um Hilfe dankbar!

Danke GGK

was ist denn die Zeile at Mgmt.MainFrame$4.stateChanged(MainFrame.java:404) in deinem Code?
16/17 anscheinend,
der Fall ist hier auch so recht klar, aber es lohnt doch etwas einfache Mitarbeit,
was ist die NullPointerException, was ist null, das panel oder desses Layout wahrscheinlich?

du befindest dich hier noch im Konstruktor, wie der Stacktrace auc hzeigt,
vielleicht wird das panel erst später initialisiert?
die GUI ist auf jeden Fall noch nicht sichtbar, da wird dann im Hintergrund manches auch noch fehlen,
vielleicht nicht das CardLayout, weil du dich darum ja sicher selber kümmerst,
aber am Anfang immer Probleme mit solchen Aktionen denkbar,

ändere die Reihenfolge des Codes im Konstruktor, panel sollte vorher erstellt werden (1),
oder baue ein if ein dass nichts getan wird wenn das problematische Objekt noch null ist,
oder füge den Listener erst 1 sec nach setVisible(true) ein (gegebenenfalls per Thread nebenläufig)
bzw. aktiviere erst dann ein boolean welches alle möglichen Listener berücksichtigen,

ok, klingt überwiegend nicht nach schönen Lösungen, ich merke es ja selbst…

schau dir nochmal alles im ChangeEvent an, vielleicht da erkennbar dass es das erste Event ist ohne vorherige Selektion, und dann nix tun,
brauchst du auch schon die Verarbeitung am Anfang oder setzt du sowieso die richtigen Card separat?
(“wechselt die beim Start dargestellte JTabel in die JTextArea” klingt nach richtigen Anfang)
vielleicht reicht ja (1) für alles

Moin,

Dein Text “JTabelPanel soll gezeigt werden” scheint ja angezeigt zu werden, von daher würde ich mal vermuten, dass in der Zeile danach
CardLayout cl = (CardLayout)(panel.getLayout());
‘panel’ null ist …

Prüf’ das doch einfach im Debugger !

Gruß Klaus

Danke Dir!!! du bist mein Held!!!

Die JTable im Cardlayout gabs noch nicht…den ChangeListener habe ich nach dem Cardlayout eingebaut…so einfach könnts gehen!!

Danke

GGK