CardLayout, ausgelagerte Panels, ActionListener

quidnovi

Mitglied
Hi @ all

Trotz intensivem Bemühens von Google und Durchforsten von einschlägigen Foren, habe ich leider keine Lösung für mein Problem gefunden.
Vorausschicken möchte ich auch, dass ich Einsteiger bin.

Die Herausforderung:
CardLayout mit "ausgelagerten" Panels.
Nun möchte ich die einzelnen Panels über einen Button aufrufen,
wobei sich diese Buttons auf den jeweiligen Panels befinden.

In diesem Forum habe ich ein Beispiel aufgegriffen, welches ich zu Erweitern versuchte, aber leider gescheitert bin.

Nun der Code:
Java:
import java.awt.CardLayout;
import java.awt.event.ActionEvent;

import javax.swing.JPanel;

public class HauptPanel extends JPanel {

	 private CardLayout cardLayout;
	    
	    public HauptPanel() {
	                
	        cardLayout = new CardLayout();
	        setLayout( cardLayout );
	        
	        // Panel zum CardLayout hinzufügen
	        add( new Panel1(), "Panel1" );
	        add( new Panel2(), "Panel2" );
	        
	    }
	 
	    // Methode zeigt die gewünschte Seite (Panel) im Frame an
	    public void setCards( String cardname ) {
	        cardLayout.show( this, cardname );
	    }
	 
	}

und des Weiteren:
Java:
import java.awt.CardLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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



public class Panel1 extends JPanel {

	public Panel1() {
		
		add(new Label("Profil"));
		
		JButton btnKommAdd = new JButton("Weiter zu neue Kommission");
		btnKommAdd.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {
				CardLayout cardLayout = (CardLayout) ???.getLayout();
				cardLayout.show(???, "Panel2");
				
			}
			
		});
		btnKommAdd.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		add(btnKommAdd);
	}
}

Leider weiß ich jetzt nicht, wodurch ich die ??? ersetzen sollte, da fehlt mir noch das Wissen dazu.

Nun würde ich Euch bitten, mir zumindest einen Denkabstoß für die Auflösung der Fragezeichen zu geben.

Vielen Dank im Voraus
 
du brauchst die HauptPanel-Variable, die könnte das HauptPanel bei Erstellen der Unterpanel im Konstruktor übergeben,
also sich selber mitgeben, this,
die Unterpanel brauchen natürlich entsprechende Konstruktoren, müssen sich das übergebene HauptPanel merken,

zwei Zeilen müssen es dann gar nicht sein, nutze im ActionListener die vorhandere Methode:
hauptPanel.setCards("Panel2");
 
hi mod 🙂

thx für die Hinweise...mit diesen mach ich mich nun daran, Realitäten zu schaffen.
Im Besten Fall melde ich mich mit der Lösung...ansonsten eben früher 😉

:meld:
 
Nun hat's leider nicht geklappt 🙁

Ich habe die class HauptPanel wie folgt leicht abgeändert (das Übrige ist gleich geblieben):
Java:
import java.awt.CardLayout;
import javax.swing.JPanel;

public class HauptPanel extends JPanel {
....
        
        // Panel zum CardLayout hinzufügen
        add( new Panel1(null), "Panel1" );
        add( new Panel2(null), "Panel2" );
	        
	    }
	 
...
	 
	}

und Panel 1:
Java:
import java.awt.Cursor;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class Panel1 extends JPanel{

	private static final long serialVersionUID = -1187715028971282114L;
	private HauptPanel hauptPanel;

	public Panel1(final HauptPanel hauptPanel) {
		
		setBorder(javax.swing.BorderFactory.createTitledBorder("Panel 1"));
		
		JButton btnToPanel2 = new JButton("Weiter zu Panel 2");
		btnToPanel2.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				
				if(e.getActionCommand().equals("Weiter zu Panel 2")){
					hauptPanel.setCards("Panel2");
				}
			}
			
		});
		btnToPanel2.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
		add(btnToPanel2);
	}

	/**
	 * @return the hauptPanel
	 */
	public HauptPanel getHauptPanel() {
		return hauptPanel;
	}

	/**
	 * @param hauptPanel the hauptPanel to set
	 */
	public void setHauptPanel(HauptPanel hauptPanel) {
		this.hauptPanel = hauptPanel;
	}
}

Eclipse unterringelt mir da nix mehr, doch wenn ich nun den Button "Weiter zu Panel 2" klicke,
zeigt die Objekt-Referenz offenbar auf nix...also eine NullPointerException.

Der Fehler liegt demnach immer noch in folgender Zeile:
Java:
hauptPanel.setCards("Panel2");

Leider sehe ich mich ausser Stande, dieses Problem zu lösen, weshalb ich jetzt nun nochmals um Unterstützung bitte.

Danke im Voraus
 
wow...vielen Dank für Deine Hilfe.

na, da sollte doch auch ein Einsteiger wie ich, lernen und verstehen können 🙂

Spitze...danke nochmals 🙂
 

Zurück
Oben