Den Inhalt der ContentPane ändern

_Solo_

Grünschnabel
Hallo,


ich bin ein Neuling in Java und habe mich bis jetzt durch ein Buch und diverse Tutorials im Internet (u.a. das von Sun) gearbeitet.
Die ganzen "Tutorial Spielereien" wie z.B. zwei Buttons in einem Fenster erstellen und je nach dem welcher geklickt wird ein Textlabel zu ändern habe ich verstanden und kann ich auch implementieren.
Jetzt will ich mich an mein erstes größeres Projekt wagen und habe leider massive Probleme:

Zunächst möchte ich ein "Hauptprogramm-Fenster" öffnen lassen in dem der Nutzer zwischen den zwei Modulen (hier A und B) des Programms wählen kann. Ich habe mir nun überlegt, dass ich das über die ConentPane realisieren könnte (weiß nicht ob das gut und "sauber" ist). Um das ganze schön objektorientiert zu machen will ich die versch. Inhalte der ContentPane in eigene Klassen auslagern.
Mit den Erklärungen ist folgender Code sicher verständlich:

- Das Hauptfenster welches zunächst beim Programmstart geöffnet werden soll.
HauptFenster.java
Code:
public class HauptFenster extends JFrame {
	private static final long serialVersionUID = 1L;
	private DefaultCP dfCP = new DefaultCP();
	

	public HauptFenster(){
		// allgemeines Setup
		HauptFenster.setDefaultLookAndFeelDecorated(true);
		this.setTitle("Programm mit zwei Modulen");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// Menue
		// wird später implementiert
		
		// ContentPane setzen	
		this.getContentPane().add(dfCP);
	}
	

	// Buttons des Hauptfensters mit Leben füllen
	class ButtonAktionen implements ActionListener{
		
		public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand() == dfCP.neueUeberwei.getText()){
				System.out.println("Es wurde auf Kundenverwaltung geklickt");
			}
			if (e.getActionCommand() == dfCP.kundenVerwaltung.getText()){
				System.out.println("Es wurde auf Kundenverwaltung geklickt");
			}		
		}
	}
}

- Als Beispiel der Inhalt einer ContentPane - hier die des Hauptfensters
DefaultCP.java
Code:
// Contentpane Inhalt des Hauptfensters
public class DefaultCP extends JPanel{
	private static final long serialVersionUID = 1L;
	private JLabel willkommenLabel;
	protected JButton a, b;
	private JPanel textPanel, buttonPanel;
	
	public DefaultCP(){
		this.setLayout(new GridLayout(3,1));
		
		// leere Reihe
		this.add(new JLabel(""));
		
		// Textlabel
		willkommenLabel = new JLabel("Willkommen, was möchten Sie tun?");
		willkommenLabel.setFont(new java.awt.Font("Tahoma",0,26));
		textPanel = new JPanel();
		textPanel.add(willkommenLabel);
		
		// Buttons
		buttonPanel = new JPanel();
		buttonPanel.setLayout(null);
		
		a= new JButton("Button A");
		a.setSize(250, 50);
		a.setLocation(100, 1);
		b= new JButton("Button B");
		b.setSize(250, 50);
		b.setLocation(450, 1);
		
		buttonPanel.add(a);
		buttonPanel.add(b);
		
		// Unterpanels in Oberpanel
		this.add(textPanel);
		this.add(buttonPanel);
	}
}

Im Hauptprogramm wird halt eine Instanz von Hauptfenster angelegt, das ist denke ich klar.

Ich stoße jetzt leider auf folgende Probleme zu denen ich einfach keine Lösung finde:
- Ich bekomme größte Schwierigkeiten ActionListener an Buttons anzuhängen da diese ja alle in ihren eigenen Klassen gekapselt sind. Genau an diesem Schritt hänge ich .. ist ja auch noch nicht implementiert.
- Ich habe keine Idee und finde keine Lösung wie ich die ContentPane änder soll. Wenn die ActionListener an den Buttons angehängt sind, dann ist natürlich der nächste Schritt je nach Klick die ContentPane zu ModulA oder ModulB zu ändern.
- Ich zweifle ein wenig, ob dass alles ein guter Ansatz ist.


Mir ist bewusst, dass das ziemlich komplexe Fragen sind die man sicher nicht einfach beantworten kann. Ich hoffe es findet sich trotzdem jemand der mir helfen kann. Ist halt irgendwie der Schritt aus den Lehrbüchern und den Tutorials in die echte Welt.


Mit freundlichen Grüßen und vielen Dank für die Hilfe
 
Hallo Solo,

schau mal hier:
Java:
package swing.wizardemo;

import java.awt.*;

import javax.swing.*;

public class Wizard extends JFrame {

	private JLabel titleBar, statusBar;

	private Component currentWizardPanel;

	public Wizard() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setAlwaysOnTop(true);
		this.setLocationByPlatform(true);

		JLabel l = this.createStatusBar();

		this.add(this.createTitlePane(), BorderLayout.NORTH);
		this.add(currentWizardPanel = new WizardPanel1(this),
				BorderLayout.CENTER);
		this.add(l, BorderLayout.SOUTH);
		this.pack();
		this.setVisible(true);
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new Wizard();
	}

	public JPanel createTitlePane() {
		JPanel titlePanel = new JPanel();
		titlePanel.setBackground(Color.DARK_GRAY);

		JLabel titleLabel = new JLabel("Schach Future Game");
		titleLabel.setFont(new Font("Arial", Font.BOLD, 32));
		titleLabel.setForeground(Color.RED);

		titleBar = new JLabel();
		titleBar.setForeground(Color.WHITE);

		titlePanel.add(titleLabel);
		titlePanel.add(titleBar);

		return titlePanel;
	}

	public JLabel createStatusBar() {
		statusBar = new JLabel(" ");
		statusBar.setBackground(Color.DARK_GRAY);
		statusBar.setForeground(Color.WHITE);
		statusBar.setOpaque(true);

		return statusBar;
	}

	public void changeWizardContent(Component comp) {
		this.getContentPane().remove(currentWizardPanel);
		this.add(currentWizardPanel = comp, BorderLayout.CENTER);
		this.pack();
	}

	public void setStatusBar(String message) {
		statusBar.setText(message);
	}

	public void setTitleBar(String titleMessage) {
		titleBar.setText(titleMessage);
	}
}

Java:
package swing.wizardemo;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class WizardPanel1 extends JPanel implements ActionListener {

	private Wizard wizard;

	private JButton next;

	private String licence = "Kopieren, Verbreiten und/oder Verändern ist unter den Bedingungen der GNU Free Documentation License, Version 1.2 oder einer späteren Version, veröffentlicht von der Free Software Foundation, erlaubt. Es gibt keine unveränderlichen Abschnitte, keinen vorderen Umschlagtext und keinen hinteren Umschlagtext. Eine Kopie des Lizenztextes ist unter dem Titel GNU Free Documentation License enthalten.";

	public WizardPanel1(Wizard wizard) {
		this.wizard = wizard;
		this.setLayout(new BorderLayout());
		this.add(new JScrollPane(this.createLicenceDisplay()),
				BorderLayout.CENTER);
		this.add(this.createNavigateMenu(), BorderLayout.SOUTH);

		wizard.setTitleBar("Lizenbestimmungen");
		wizard
				.setStatusBar("Herzlich Willkommen im Installationswizard von Schach Future Game!");
	}

	public JTextArea createLicenceDisplay() {
		JTextArea textArea = new JTextArea("Lizenzbestimmungen\n" + licence);
		textArea.setLineWrap(true);
		textArea.setWrapStyleWord(true);
		return textArea;
	}

	public JPanel createNavigateMenu() {
		JPanel navigatePanel = new JPanel();

		next = new JButton("Weiter");
		next.addActionListener(this);
		next.setActionCommand("next");

		navigatePanel.add(next);

		return navigatePanel;
	}

	public void actionPerformed(ActionEvent e) {
		wizard.changeWizardContent(new WizardPanel2(wizard));
	}
}

Java:
package swing.wizardemo;

import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class WizardPanel2 extends JPanel implements ActionListener {

	private Wizard wizard;

	private JButton backButton, nextButton, previewButton, delButton;
	
	private JTextField t1, t2, t3;

	public WizardPanel2(Wizard wizard) {
		this.wizard = wizard;
		this.setLayout(new BorderLayout());
		this.add(this.createMenu(), BorderLayout.CENTER);
		this.add(this.createNavigateMenu(), BorderLayout.SOUTH);

		wizard.setTitleBar("Registrierungsdaten");
		wizard.setStatusBar("Bitte tragen Sie ihre Daten ein.");
	}

	public JPanel createMenu() {
		JPanel menuPanel = new JPanel();
		menuPanel.setLayout(new GridLayout(0, 2));

		previewButton = new JButton("Vorschau");
		delButton = new JButton("Löschen");

		previewButton.setActionCommand("preview");
		delButton.setActionCommand("del");
		
		previewButton.addActionListener(this);
		delButton.addActionListener(this);
		
		menuPanel.add(new JLabel("Name: "));
		menuPanel.add(t1 = new JTextField(10));
		menuPanel.add(new JLabel("Vorname: "));
		menuPanel.add(t2 = new JTextField(10));
		menuPanel.add(new JLabel("Firma: "));
		menuPanel.add(t3 = new JTextField(10));
		menuPanel.add(previewButton);
		menuPanel.add(delButton);

		return menuPanel;
	}

	public JPanel createNavigateMenu() {
		JPanel navigatePanel = new JPanel();

		backButton = new JButton("Zurück");
		nextButton = new JButton("Weiter");

		backButton.setActionCommand("back");
		nextButton.setActionCommand("next");

		backButton.addActionListener(this);
		nextButton.addActionListener(this);

		navigatePanel.add(backButton);
		navigatePanel.add(nextButton);

		return navigatePanel;
	}

	public void actionPerformed(ActionEvent e) {
		String s = e.getActionCommand();
		if (s.equalsIgnoreCase("back"))
			wizard.changeWizardContent(new WizardPanel1(wizard));
		else if (s.equalsIgnoreCase("next"))
			wizard.changeWizardContent(new WizardPanel3(wizard));
		else if (s.equalsIgnoreCase("preview"))
			JOptionPane.showMessageDialog(wizard, t1.getText() + ", " + t2.getText() + ", " + t3.getText());
		else {
			t1.setText("");
			t2.setText("");
			t3.setText("");
		}
	}
}

Java:
package swing.wizardemo;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class WizardPanel3 extends JPanel implements ActionListener {

	private Wizard wizard;
	
	private JButton backButton, closeButton;
	
	public WizardPanel3(Wizard wizard) {
		this.wizard = wizard;
		this.setLayout(new BorderLayout());
		this.add(new JLabel("Ende der Installation."), BorderLayout.CENTER);
		this.add(this.createNavigateMenu(), BorderLayout.SOUTH);
		
		wizard.setTitleBar("Beenden");
		wizard.setStatusBar("Registrierung und Installation wurden erfolgreich ausgeführt!.");
	}
	
	public JPanel createNavigateMenu() {
		JPanel navigatePanel = new JPanel();

		backButton = new JButton("Zurück");
		closeButton = new JButton("Beenden");

		backButton.setActionCommand("back");
		closeButton.setActionCommand("close");
		
		backButton.addActionListener(this);
		closeButton.addActionListener(this);
		
		navigatePanel.add(backButton);
		navigatePanel.add(closeButton);

		return navigatePanel;
	}
	
	public void actionPerformed(ActionEvent e) {
		String s = e.getActionCommand();
		if (s.equalsIgnoreCase("back"))
			wizard.changeWizardContent(new WizardPanel2(wizard));
		else System.exit(0);
	}

}

Hier mal ein Ansatz wie man einen Wizard realisieren könnte.


Vg Erdal
 
Vielen Dank!

Das ist genau so wie ich es mir vorgestellt hatte. Eine weiter Verständnisfrage habe ich aber: Was genau ist der Wizard. Ist das eine Erfindung von dir oder ist das ein allgemeines Designpattern oder was ganz anderes?

vg
David
 
Zurück