Swing CardLayout: Problem beim Wechsel zwischen den JPanels

Nordseekrabbe

Neues Mitglied
Hallo!

Ich möchte gerne mit dem Klick auf den Login-Button auf das testpanel JPanel kommen. Zunächst ohne Benutzername und Passwort zu überprüfen. Aber wenn ich das Programm ausführe, kommt diese Fehlermeldung:

"Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at ui.TestUI$3.actionPerformed(TestUI.java:276)
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.plaf.basic.BasicButtonListener.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.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$500(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(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)"


Hier ist ein Teil meines Codes:

Java:
package ui;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

import net.miginfocom.swing.MigLayout;

public class TestUI extends JFrame {

	private JPanel Cl;
	private JLabel lblMediapartner;
	private JLabel lblAbmelden;
	private JLabel lblKonto;
	private JLabel lblWarenkorb;
	private JTextField txtSuchen;
	private JButton btnAlleArtikel;
	private JButton btnKamerasObjektive;
	private JButton btnFotozubehr;
	private JButton btnStudioBeleuchtung;
	private JButton btnVideo;
	private JButton btnComputerbedarf;
	private JPanel admin;
	private JPanel AdminbereichPanel;
	private JButton btnAdminbereich;
	private JPanel NutzerPanel;
	private JPanel anmeldenAbmelden;
	private JPanel ausgeloggtPenal;
	private JLabel lblRegistrieren;
	private JLabel lblLogin;
	private JPanel eingeloggtPenal;
	private JPanel Center;
	private JPanel LoginPanel;
	private JLabel lblUsername;
	private JLabel lblPasswort;
	private JTextField UsernameEingeben;
	private JPanel KategoriePanel;
	private JLabel lblKategorie;
	private JButton btnLogin;
	private JButton btnSuchen;
	private JPanel testpanel;
	private JPasswordField passwordField;

	private CardLayout cl;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TestUI frame = new TestUI();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TestUI() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 889, 453);
		Cl = new JPanel();
		Cl.setBorder(new EmptyBorder(5, 5, 5, 5));
		Cl.setLayout(new BorderLayout(0, 0));
		setContentPane(Cl);
		
		
	....	
		
	// Ab hier Center	
		Center = new JPanel();
		Cl.add(Center, BorderLayout.CENTER);
		Center.setLayout(new CardLayout(0, 0));
		
		LoginPanel = new JPanel();
		Center.add(LoginPanel, "LoginPanel");
		LoginPanel.setLayout(new MigLayout("", "[][][][][][448.00,grow][][][]", "[][][][][][]"));
		
		lblUsername = new JLabel("Username");
		LoginPanel.add(lblUsername, "cell 4 2,alignx trailing");
		
		//Textfeld Username
		UsernameEingeben = new JTextField();
		LoginPanel.add(UsernameEingeben, "cell 5 2,growx");
		UsernameEingeben.setColumns(10);
		
		lblPasswort = new JLabel("Passwort");
		LoginPanel.add(lblPasswort, "cell 4 4,alignx trailing");
		
		//Loginbutton
		btnLogin = new JButton("Login");
		btnLogin.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				
				cl.show(Cl,"testpanel");
			}
		});
		
		passwordField = new JPasswordField();
		LoginPanel.add(passwordField, "cell 5 4,growx");
		LoginPanel.add(btnLogin, "cell 6 5");
		

		testpanel = new JPanel();
		Center.add(testpanel, "testpanel");
	}
}


Weiß vielleicht jemand von euch worin mein Fehler liegt?
Ich bin für jeden Hinweis oder Tipp dankbar.


Liebe Grüße
 
Weil c1 Null ist. Ich nehme mal an das soll C1 heißen? Sowas passiert wenn man zu faul ist ordentliche variablennamen zu vergeben 😉 brenne deine Variablen mal so das man auch weis was sie machen und wozu sie gut sind.

Gruß

Claus
 
Zuletzt bearbeitet:
Nein, das sollte Cl heißen. Aber stimmt schon, war wirklich etwas blöd benannt.

Hier ist der Code nochmal besser benannt (cl steht hier für das CardLayout):
Java:
package ui;

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;

import net.miginfocom.swing.MigLayout;

public class TestUI extends JFrame {

	private JPanel cardPanel;
	private JLabel lblMediapartner;
	private JLabel lblAbmelden;
	private JLabel lblKonto;
	private JLabel lblWarenkorb;
	private JTextField txtSuchen;
	private JButton btnAlleArtikel;
	private JButton btnKamerasObjektive;
	private JButton btnFotozubehr;
	private JButton btnStudioBeleuchtung;
	private JButton btnVideo;
	private JButton btnComputerbedarf;
	private JPanel admin;
	private JPanel AdminbereichPanel;
	private JButton btnAdminbereich;
	private JPanel NutzerPanel;
	private JPanel anmeldenAbmelden;
	private JPanel ausgeloggtPenal;
	private JLabel lblRegistrieren;
	private JLabel lblLogin;
	private JPanel eingeloggtPenal;
	private JPanel Center;
	private JPanel LoginPanel;
	private JLabel lblUsername;
	private JLabel lblPasswort;
	private JTextField UsernameEingeben;
	private JPanel KategoriePanel;
	private JLabel lblKategorie;
	private JButton btnLogin;
	private JButton btnSuchen;
	private JPanel testpanel;
	private JPasswordField passwordField;

	private CardLayout cl;
	
	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TestUI frame = new TestUI();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TestUI() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 889, 453);
		cardPanel = new JPanel();
		cardPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		cardPanel.setLayout(new BorderLayout(0, 0));
		setContentPane(cardPanel);
		
		//Header
		JPanel header = new JPanel();
		header.setBackground(Color.WHITE);
		cardPanel.add(header, BorderLayout.NORTH);
		GridBagLayout gbl_header = new GridBagLayout();
		gbl_header.columnWidths = new int[]{83, 133, 93, 146, 59, 33, 113, 138, 0};
		gbl_header.rowHeights = new int[]{20, 24, 26, 0};
		gbl_header.columnWeights = new double[]{0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, Double.MIN_VALUE};
		gbl_header.rowWeights = new double[]{1.0, 0.0, 1.0, Double.MIN_VALUE};
		header.setLayout(gbl_header);

.......
......

		
	// Ab hier Center	
		Center = new JPanel();
		cardPanel.add(Center, BorderLayout.CENTER);
		Center.setLayout(new CardLayout());

		
		LoginPanel = new JPanel();
		Center.add(LoginPanel, "LoginPanel");
		LoginPanel.setLayout(new MigLayout("", "[][][][][][448.00,grow][][][]", "[][][][][][]"));
		
		lblUsername = new JLabel("Username");
		LoginPanel.add(lblUsername, "cell 4 2,alignx trailing");
		
		//Textfeld Username
		UsernameEingeben = new JTextField();
		LoginPanel.add(UsernameEingeben, "cell 5 2,growx");
		UsernameEingeben.setColumns(10);
		
		lblPasswort = new JLabel("Passwort");
		LoginPanel.add(lblPasswort, "cell 4 4,alignx trailing");
		
		//Loginbutton
		btnLogin = new JButton("Login");
		btnLogin.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				//mit cl.show(cardPanel,"Center"); komme ich hier auch nicht weiter
				cl.show(cardPanel,"testpanel");
			}
		});
		
		passwordField = new JPasswordField();
		LoginPanel.add(passwordField, "cell 5 4,growx");
		LoginPanel.add(btnLogin, "cell 6 5");
		
		
		KategoriePanel = new JPanel();
		Center.add(KategoriePanel, "KategoriePanel");
		KategoriePanel.setLayout(new MigLayout("", "[][][][][][][][]", "[]"));
		
		lblKategorie = new JLabel("Kategorie");
		KategoriePanel.add(lblKategorie, "cell 7 0");
		


		testpanel = new JPanel();
		Center.add(testpanel, "testpanel");
	}
}

Ich dachte eben ich hätte die Lösung, weil ich in einem anderen Test-GUI noch etwas rumprobiert habe und es dort funktioniert hat. Aber leider lässt sich das nicht so auf mein Problem übertragen.

Hier ist der Code zum anderen Test-GUI mit dem ich das hinbekommen habe:

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

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;

import net.miginfocom.swing.MigLayout;


public class Test extends JFrame {

	private JPanel cardPanel;
	private CardLayout cl;

	/**
	 * Launch the application.
	 */
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					Test frame = new Test();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public Test() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		
		cardPanel = new JPanel();
		cardPanel.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(cardPanel);
		cl = new CardLayout(0, 0);
		//HIER LAG DER FEHLER: nicht: cardPanel.setLayout(new CardLayout(0, 0)); - sondern: cardPanel.setLayout(cl)
		cardPanel.setLayout(cl);
		
		JPanel panel1 = new JPanel();
		cardPanel.add(panel1, "panel1");
		panel1.setLayout(new MigLayout("", "[][][][][][]", "[][][]"));
		
		JLabel lblDasIstPanel = new JLabel("Das ist Panel 1");
		panel1.add(lblDasIstPanel, "cell 5 0");
		
		JButton btnZuPanel = new JButton("Zu Panel 2");
		btnZuPanel.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
			
			cl.show(cardPanel, "panel2");
			}
		});
		panel1.add(btnZuPanel, "cell 5 2");
		
		JPanel panel2 = new JPanel();
		cardPanel.add(panel2, "panel2");
		panel2.setLayout(new MigLayout("", "[][][][][][]", "[][][]"));
		
		JLabel lblDasIstPanel_1 = new JLabel("Das ist Panel 2");
		panel2.add(lblDasIstPanel_1, "cell 5 0");
		
		JButton btnZuPanel_1 = new JButton("zu Panel 1");
		panel2.add(btnZuPanel_1, "cell 5 2");
	}

}

Kann es möglicherweise sein, dass das Problem damit zusammenhängt, dass ich beim oberen Code zwei Bereiche des JFrames verwendet habe (North und Center)?
 
Nein es liegt immer noch daran das beim ersten Code c1 null ist und beim zweiten nicht....
 
Zuletzt bearbeitet:

Zurück
Oben