# MVC Modell mit JPanels?



## Guest (31. Jul 2008)

Hallo allerseits!

Versuche mich zurzeit in das MVC Modell einzuarbeiten und bin auf ein Problem gestoßen.
Und zwar möchte ich, falls ein Button gedrückt wurde, ein neues Panel erstellen und in ein "MainPanel" wieder einfügen.
Habe natürlich schon etwas recherchiert und eine Lösung soll die Implementierung eines Interface sein. Nur wie stelle ich das an?

Meine ersten Gehversuche:

View.java


```
package MVC;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Observable;
import java.util.Observer;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class View extends JDialog implements Observer {
			
		private static final long serialVersionUID = 1L;
		JLabel text1 = new JLabel();
		JPanel mainpanel = new JPanel();
		JPanel buttonpanel = new JPanel();
		JPanel centerpanel = new JPanel();
		JLabel text = new JLabel();
		String Anleitung;
		private JButton Weiter, Abbr, Zurück;
		public static String pfadname;
		
		public View(JPanel centerpanel) {
			
			setAlwaysOnTop(true);
			setTitle("Import Wizard");
			mainpanel.setLayout(new BorderLayout());
			
			
//	 Buttons
			buttonpanel.setLayout(new FlowLayout(FlowLayout.RIGHT));
			
			Abbr = new JButton("Abbrechen");
			Abbr.setFont(new Font("Arial", Font.ROMAN_BASELINE, 12));
			Abbr.addActionListener(ACTLAssistant);
			
			Weiter = new JButton("Weiter");
			Weiter.setFont(new Font("Arial", Font.ROMAN_BASELINE, 12));
			Weiter.addActionListener(ACTLAssistant);
			
			Zurück = new JButton("Zurück");
			Zurück.setFont(new Font("Arial", Font.ROMAN_BASELINE, 12));
	
			buttonpanel.add(Abbr);
			buttonpanel.add(Zurück);
			buttonpanel.add(Weiter);
			
			mainpanel.add(buttonpanel, BorderLayout.SOUTH);

		                setSize( 700, 400 );
			
			Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
			
			setLocation(dim.width/2 - dim.width/4,  dim.height/2 - dim.height/4);
			
			setContentPane(mainpanel);
			
			setVisible( true ); 
			
			addWindowListener(new WindowAdapter(){
				public void windowClosing(WindowEvent event){
					dispose();
					System.gc();				
				}
			});
		}

			private ActionListener ACTLAssistant = new ActionListener(){
				public void actionPerformed(ActionEvent event){
					String ereignis = event.getActionCommand();
					
					if(ereignis.equals(Abbr.getText())){			
						System.gc();
						dispose();
							
					} else if(ereignis.equals(Weiter.getText())){
						Controller.ChangePanel(2);
					}
				}
			};
			
	public void update(Observable o, Object arg) {
		mainpanel.removeAll();
		mainpanel.repaint();
		mainpanel.setLayout(new BorderLayout());
		mainpanel.add(buttonpanel, BorderLayout.SOUTH);
		mainpanel.add(centerpanel, BorderLayout.CENTER);
	}
}
```

Model.java


```
package MVC;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.Observable;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Model extends Observable {

	JPanel NewPanel = new JPanel();
	static JLabel analyse = new JLabel();
	static JLabel pfad = new JLabel();
	public static String EndungsErgebnis;
	static JPanel centerpanel = new JPanel();
	static JButton Datauswählen = new JButton();
	static JFileChooser fc = new JFileChooser();
	static JDialog dialogfc = new JDialog();
	
	public void setPanel(int id){
		
		setChanged();
		
		if(id==1){	
			Datauswählen = new JButton("Datei auswählen");
			Datauswählen.setFont(new Font("Arial", Font.ROMAN_BASELINE, 12));
			Datauswählen.addActionListener(ACTLDialog2);

			JPanel ImCenterPanel = new JPanel();
			JPanel öffnenPanel = new JPanel();
			
			öffnenPanel.setLayout(new FlowLayout(FlowLayout.LEFT));
			öffnenPanel.add(Datauswählen);
			
			ImCenterPanel.setLayout(new BorderLayout());
			ImCenterPanel.add(öffnenPanel, BorderLayout.WEST);
			ImCenterPanel.add(pfad, BorderLayout.SOUTH);
			
			JLabel text = new JLabel("<html><style type=\"text/css\"> h1 { font-size: 13pt; font-style: italic; font-family: 'Verdana'} h2 { font-size: 13pt; font-style: bold;  } h3 { font-size: 12pt; font-style: italic}" + 
					"#d1 { padding-left: 10px; background-color:#FFFEDA; border-width: 1px; border-style: solid; border-color: #FFDDAA; padding-top: 1em; width: 531px}" + 
					"#d2 { padding-left: 10px; background-color:#DDDDDD; height:215px}" +
					"#d3 { padding-left: 30px; background-color:#DDDDFF; border-width: 1px; border-style: solid; border-color: #AAAAFF; padding-top: 1em }" +
					"#d4 { padding-left: 30px; background-color:#FFDDDD; border-width: 1px; border-style: solid; border-color: #FFAAAA; padding-top: 1em }" +
					"#d5 { padding-left: 30px; background-color:#DDFFDD; border-width: 1px; border-style: solid; border-color: #AAFFAA; padding-top: 1em }" +
					"</style></head><div id=\"d1\"><h1 align=\"center\">Schritt 1:   Bitte wählen Sie jetzt die Datei aus!</h1></div> "+
					"<div id=\"d3\">Bitte Datei auswählen: 
" +
					"</div>
" +
					"</html>");
			
			centerpanel.setLayout(new BorderLayout());
			centerpanel.setBorder(BorderFactory.createLineBorder(new Color(170,170,170)));
			
			centerpanel.add(text, BorderLayout.NORTH);
			centerpanel.add(ImCenterPanel, BorderLayout.CENTER);
			
			notifyObservers(centerpanel);
			
		} else if(id==2){
				JLabel text = new JLabel("<html><style type=\"text/css\"> h1 { font-size: 13pt; font-style: italic; font-family: 'Verdana'} h2 { font-size: 13pt; font-style: bold;  } h3 { font-size: 12pt; font-style: italic}" + 
						"#d1 { padding-left: 10px; background-color:#FFFEDA; border-width: 1px; border-style: solid; border-color: #FFDDAA; padding-top: 1em; width: 531px}" + 
						"#d2 { padding-left: 10px; background-color:#DDDDDD; height:215px}" +
						"#d3 { padding-left: 30px; background-color:#DDDDFF; border-width: 1px; border-style: solid; border-color: #AAAAFF; padding-top: 1em }" +
						"#d4 { padding-left: 30px; background-color:#FFDDDD; border-width: 1px; border-style: solid; border-color: #FFAAAA; padding-top: 1em }" +
						"#d5 { padding-left: 30px; background-color:#DDFFDD; border-width: 1px; border-style: solid; border-color: #AAFFAA; padding-top: 1em }" +
						"</style></head><div id=\"d1\"><h1 align=\"center\">Schritt 2:   Zweiter Schritt</h1></div> "+
						"<div id=\"d3\">Nächster Schrit....: 
" +
						"</div>
" +
						"</html>");
				
				centerpanel.setLayout(new BorderLayout());
				centerpanel.setBorder(BorderFactory.createLineBorder(new Color(170,170,170)));
				
				centerpanel.add(text, BorderLayout.NORTH);
			
				notifyObservers(centerpanel);
				
			}
		}
	
	private static ActionListener ACTLDialog2 = new ActionListener(){
		public void actionPerformed(ActionEvent event){
			String ereignis = event.getActionCommand();
			
			if(ereignis.equals(Datauswählen.getText())) {
				fc.showOpenDialog(dialogfc);
				File auswahl = fc.getSelectedFile();
				
				if(auswahl != null){
					View.pfadname = auswahl.getAbsolutePath();
					String Endung = View.pfadname.substring(View.pfadname.length()-4, View.pfadname.length());
					
					if(Endung.equals(".xls")){
						EndungsErgebnis = "Excel - Mappe erkannt";
						analyse.setText("Excel - Mappe erkannt");
					} else {
						EndungsErgebnis = "";
						analyse.setText("");
					}
				}
				pfad.setText(View.pfadname);
			} 
		}
	};
}
```

Controller.java


```
package MVC;

import java.awt.BorderLayout;
import java.awt.Color;
import java.util.*;
import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Controller {

	private static Model test3 = new Model();
	static JPanel centerpanel = new JPanel();
	
   public static void main(String[] args){
	 
	   JLabel text = new JLabel("<html><style type=\"text/css\"> h1 { font-size: 13pt; font-style: italic; font-family: 'Verdana'} h2 { font-size: 13pt; font-style: bold;  } h3 { font-size: 12pt; font-style: italic}" + 
				"#d1 { padding-left: 10px; background-color:#FFFEDA; border-width: 1px; border-style: solid; border-color: #FFDDAA;padding-top: 1em }" + 
				"#d2 { padding-left: 10px; background-color:#DDDDDD; height:215px}" +
				"#d3 { padding-left: 30px; background-color:#DDDDFF; border-width: 1px; border-style: solid; border-color: #AAAAFF;padding-top: 1em }" +
				"#d4 { padding-left: 30px; background-color:#FFDDDD; border-width: 1px; border-style: solid; border-color: #FFAAAA;padding-top: 1em }" +
				"#d5 { padding-left: 30px; background-color:#DDFFDD; border-width: 1px; border-style: solid; border-color: #AAFFAA;padding-top: 1em }" +
				"</style></head><div id=\"d1\"><h1>Überschrift</h1></div> "+
				"<div id=\"d2\"><h2>Folgende Schritte werden durchgeführt: </h2>
" +
				"<div id=\"d3\">1. Schritt - Datei auswählen
" +
				"<h3>& & &Beschreibung.</h3></div>
" +
				"<div id=\"d4\">2. Schritt - ..zweiter Schritt...
" + 
				"<h3>& & &Beschreibung</h3></div>
" + 
				"<div id=\"d5\">3. Schritt - ..dritter Schritt...
" +
				"<h3>& & &Beschreibung</h3></div>" + 
				"</html>");
		
		centerpanel.setLayout(new BorderLayout());
		centerpanel.setBorder(BorderFactory.createLineBorder(new Color(170,170,170)));
		
		centerpanel.add(text, BorderLayout.NORTH);
		
	   Observer test1 = new View(centerpanel);
	   
	   test3.addObserver(test1);	     
   }
	
   public static void ChangePanel(int DialogID){
	   test3.setPanel(2);
		   }
}
```


Vielen Dank im Voraus!

Grüße


----------



## André Uhres (2. Aug 2008)

Hier ist ein *Versuch*, wenigstens *etwas *Ordnung in das wüste Durcheinander zu bekommen: MVC.jar (Quellcode im jar)
Man könnte natürlich auch mit CardLayout oder CardPanel arbeiten...


----------

