Swing Cardlayout aufräumen

fetcher

Mitglied
Hallo liebes Forum,
ich habe ein kleines Problem. Es geht darum alle "add"- Anweisungen was das Cardlayout bzw. Panel betrifft in eine extra Methode auszulagern, damit ich nicht alles(ganz unterschiedlicher Inhalt) in einer Methode stehen habe.

Der Code funktioniert so wie er ist anhand eines Beispiels bei Youtube.
Hier mal der Code:

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class MainGUI extends JFrame{
	private JButton button1, button2, button3;
	private JPanel panel1 = new JPanel(), panel2 = new JPanel(), contentPanel = new JPanel();
	private CardLayout cardLayout = new CardLayout();
	
	public MainGUI(){
		super("TEST");
		button1 = new JButton("Go to second");
		button2 = new JButton("Go to first card");
		button3 = new JButton("test");


		panel1.setBackground(Color.GREEN);
		panel2.setBackground(Color.blue);
		
		actionListener al = new actionListener();
		
		button1.addActionListener(al);
		button2.addActionListener(al);
		
		panel1.add(button1);
		panel2.add(button2);
		
		contentPanel.setLayout(cardLayout);
		
		contentPanel.add(panel1, "panel1");
		contentPanel.add(panel2, "panel2");
		
		this.setContentPane(contentPanel);
		
		//cardLayout.show(contentPanel, "panel1");
		contentPanel1();
	}
	
	
	public void contentPanel1()
	{
		// add 
		cardLayout.show(contentPanel, "panel2");
	}
	
	
	public void contentPanel2()
	{
		// add
		cardLayout.show(contentPanel, "panel1");
	}

	public class actionListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			JButton src = (JButton) e.getSource();
			if(src.equals(button1))
			{
				contentPanel1();
			}
			
			if(src.equals(button2))
			{
				contentPanel2();
			}
			
			
		}
		
	}
	
}

Ich möchte lediglich alle "add"-Anweisungen aus der MainGUI in verschiedene Themen splitten. Dazu habe ich schon 2 Methoden vorbereitet(contentPanel1(); und contentPanel2();).

Wenn ich jetzt den Code aus der MainGUI einfach in contentPanel1 oder 2 kopiere läuft mein Programm nicht mehr. Kann mir vielleicht jemand dabei helfen?

Vielen Dank
Gruß fetcher
 

kaoZ

Top Contributor
Öhm ich verstehe deine Frage Zwar nicht wirklich aber du möchtest die einzelnen "Karten" auslagern ?

falls dem so sein sollte kannst du einfach eine Abstrakte Basisklasse erstellen , nennen wir Sie Card

Java:
public abstract class Card extends JPanel{

 private String name;

 public Card(String name){
    this.name = name;
    setPreferredSize(new Dimension(300,300);
 }
}

und von dieser kannst du dann deine Spezialisierungen ableiten

z.B eine Bunte Karte

Java:
public class ColorCard extends Card{

  public ColorCard(){
   super("ColorCard");
   setBackground(Color.RED);   
 }
}

in deiner main instanziierst du diese dann lediglich

Java:
cardLayout.add(new ColorCard());

du kannst natürlich auch in deiner Gui eine Methode anbieten mit der Du Karten hinzufügen kannst

Java:
public void addCard(Card card){
  CardLayout layout = getContentPane().getLayout();
  layout.add(card);
}
 
Zuletzt bearbeitet:

fetcher

Mitglied
Hallo, vielen Dank für deine Antwort.
Es geht zB um das hier:

Java:
	button1.addActionListener(al);
button2.addActionListener(al);
 
panel1.add(button1);
panel2.add(button2);
 
contentPanel.setLayout(cardLayout);
 
contentPanel.add(panel1, "panel1");
contentPanel.add(panel2, "panel2");

Vielleicht ist auslagern falsch ausgedrückt. Ich meine einfach Inhaltlich der Methode zuordnen und nicht einfach alle Buttons und Textfelder in eine Methode packen, da es verdammt viele werden. contentPanel1 baut dann den Inhalt für Panel1 und nicht auch gleich für Panel2.
 

kaoZ

Top Contributor
wenn du es in eine methode auslagern willst muss diese einen Rückgabewert ( nicht void ) haben , in deinem Fall JPanel

sprich

Java:
public JPanel createComponentOne(){
  JPanel panel = new JPanel();

   // your code here...

  return panel;

}

diese methode kannst du dann deinem CardLayout hinzufügen da der Rückgabewert ein JPanel ist

Java:
contentPanel.add(createComponentOne());

wenn du dann durch die einzelnen "Karten" schalten willst musst du deinem Button , welchem eine Listener hinzugefügt sein muss, dazu bringen das er die next(), oder previous() Methode des CardLayouts aufruft.

sprich sowas hier

Java:
@Override
public void actionPerformed(ActionEvent e){
 CardLayout layout = (CardLayout) getContentPane().getLayout();
 layout.next();
}

Hier mal ein Beispiel mit MouseListener

Java:
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JPanel;



public class CardExample extends JFrame{

	JPanel contentPane;
	
	
	public CardExample(){
		contentPane = new JPanel();
		contentPane.setLayout(new CardLayout());
	
		contentPane.add(createComponentOne());
		contentPane.add(createComponentTwo());
		
		setSize(300,300);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setContentPane(contentPane);
		pack();
		setLocationRelativeTo(null);
		addMouseListener(new MouseListener(){
			
			@Override
			public void mouseReleased(MouseEvent e){}
			
			@Override
			public void mousePressed(MouseEvent e){
				CardLayout layout = (CardLayout) getContentPane().getLayout();
				layout.next(getContentPane());
			}
			
			@Override
			public void mouseExited(MouseEvent e){}
			
			@Override
			public void mouseEntered(MouseEvent e){}
			
			@Override
			public void mouseClicked(MouseEvent e){}
		});
		
	}
	
	private JPanel createComponentOne(){
		JPanel panel = new JPanel();
		
		panel.setBackground(Color.RED);
		
		return panel;
	}
	
	private JPanel createComponentTwo(){
		JPanel panel = new JPanel();
		
		panel.setBackground(Color.YELLOW);
		
		return panel;
	}
	
	
	public static void main(String[] args){
		new CardExample().setVisible(true);
	}
}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Von Menü: Seite zu Seite springen (CardLayout) AWT, Swing, JavaFX & SWT 8
H CardLayout beschränken AWT, Swing, JavaFX & SWT 2
P CardLayout funktioniert fehlerhaft AWT, Swing, JavaFX & SWT 13
L Java- CardLayout AWT, Swing, JavaFX & SWT 10
L CardLayout in einer Klasse? AWT, Swing, JavaFX & SWT 2
A Swing CardLayout - kein Wechsel möglich AWT, Swing, JavaFX & SWT 5
J CardLayout AWT, Swing, JavaFX & SWT 3
G Cardlayout Refresh Probleme AWT, Swing, JavaFX & SWT 2
padde479 LayoutManager CardLayout wechselt die Karten nicht AWT, Swing, JavaFX & SWT 5
N Swing CardLayout: Problem beim Wechsel zwischen den JPanels AWT, Swing, JavaFX & SWT 3
D Panel wird nicht angezeigt und Fragen zum CardLayout AWT, Swing, JavaFX & SWT 6
F CardLayout.show() funktioniert teilweise nicht AWT, Swing, JavaFX & SWT 5
U CardLayout im Applet AWT, Swing, JavaFX & SWT 4
Q CardLayout und Klassenmethodenzugriff AWT, Swing, JavaFX & SWT 11
Q CardLayout, ausgelagerte Panels, ActionListener AWT, Swing, JavaFX & SWT 5
C Swing CardLayout dynamisch erweitern AWT, Swing, JavaFX & SWT 11
H cardlayout und jscrollpane AWT, Swing, JavaFX & SWT 14
C CardLayout in BorderLayout? AWT, Swing, JavaFX & SWT 36
W Swing Probleme mit CardLayout AWT, Swing, JavaFX & SWT 28
D JMenuBar - CardLayout (Klasse anzeigen) AWT, Swing, JavaFX & SWT 3
D JSplitPane, Jtree, CardLayout (constraint must be a string) AWT, Swing, JavaFX & SWT 9
S LayoutManager Card des CardLayout mit MenuItem auswaehlen AWT, Swing, JavaFX & SWT 9
B RootPane bzw CardLayout Transparent machen AWT, Swing, JavaFX & SWT 7
L CardLayout - Show klappt nicht AWT, Swing, JavaFX & SWT 7
D Richtige implimentierung eines CardLayout AWT, Swing, JavaFX & SWT 3
P CardLayout - Anzeigeproblem AWT, Swing, JavaFX & SWT 2
I LayoutManager CardLayout mit anonymen Components AWT, Swing, JavaFX & SWT 4
Private Void LayoutManager Cardwechsel im CardLayout auch von Card aus? AWT, Swing, JavaFX & SWT 6
E LayoutManager Erster Versuch mit Cardlayout AWT, Swing, JavaFX & SWT 2
hdi LayoutManager Problem mit CardLayout AWT, Swing, JavaFX & SWT 11
C Problem mit CardLayout :( AWT, Swing, JavaFX & SWT 10
Dragonfire Swing CardLayout Maximum Size AWT, Swing, JavaFX & SWT 7
klattiator CardLayout - Cards auf Existenz prüfen AWT, Swing, JavaFX & SWT 3
S Frage/Problem CardLayout AWT, Swing, JavaFX & SWT 2
H CardLayout - Card erstellen hinzufügen usw. bis MI (12.3.) AWT, Swing, JavaFX & SWT 2
F CardLayout.show() -> NullPointerException AWT, Swing, JavaFX & SWT 4
G CARDLAYOUT AWT, Swing, JavaFX & SWT 2
D GroupLayout an un plötzlich is CardLayout Funktion tot? AWT, Swing, JavaFX & SWT 10
J CardLayout AWT, Swing, JavaFX & SWT 10
J CardLayout AWT, Swing, JavaFX & SWT 2
J Hilfe CardLayout AWT, Swing, JavaFX & SWT 3
H Cardlayout AWT, Swing, JavaFX & SWT 3
M CardLayout: Panel wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
J Dialogfenster wird nicht aktualisiert/CardLayout AWT, Swing, JavaFX & SWT 6
m@nu StackOverflowError mit CardLayout? AWT, Swing, JavaFX & SWT 2
R CardLayout bei einem Quiz AWT, Swing, JavaFX & SWT 9
J Designfehler beim CardLayout() AWT, Swing, JavaFX & SWT 4
S Registerkarte mit CardLayout (AWT) erstellen ? AWT, Swing, JavaFX & SWT 6
D CardLayout Plus ? AWT, Swing, JavaFX & SWT 4
T CardLayout Ohne Cards/Reiter AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben