# MVC Rechner



## Flexer (29. Sep 2009)

hallo liebe java programmierer, ich habe euren thread gelesen das ihr keine hausaufgaben für andere erledigt was auch gut so ist, aber ihr helft dabei.warum ich mich an euch wende ist um in erster linie fachkenntnis zu erlangen und andere anszusprechen die die gleiche problematik haben(uni,etc).daher ist das denke ich mal die geeignetste plattform.
meine problematik ist einen java rechner zu schreiben nach MVC muster, vorgegeben sind eine Control klasse und 2 schnittstellen. anforderung ist 2 klassen zu schreiben(Model und View)die die beiden schnittstellen implementieren. control steuert model und view.model und view wissen nichts voneinander.nur verbunden durch die schnittstellen.
Jetzt erzähle ich euch was ich recherchiert habe:über google mehre mvc taschenrechner bsp angeguckt und versucht nachzubauen. problem wie kann ich das auf meine aufgabe realisieren. ich stelle mal den die Control klasse und die schnittstellen rein.
[Java]public class RechnerControl {
3 private RechnerModel_I aModel;
4 private RechnerView_I aView;
5 // ---------------------------------------------------------------------
6 public RechnerControl(RechnerModel_I aModel, RechnerView_I aView) {
7 this.aModel = aModel;
8 this.aView = aView;
9 // 1 listener for the submitButton:
10 ActionListener mal = new MyActionListener();
11
12 // 2 listeners for the input text fields
13 KeyListener mkl1 = new MyKeyListener();
14 KeyListener mkl2 = new MyKeyListener();
15
16 // Register the 3 listeners with the view:
17 aView.register(mal, mkl1, mkl2);
18 } // Konstruktor
19 // ---------------------------------------------------------------------
20 // The following listener classes for GUI elements are declared here
21 // (and not in the view), because they call methods which are visible
22 // here, but not in the view (calculate and isValidEntry)
23 //
24 // ActionListener for the submitButton:
25 private class MyActionListener implements ActionListener {
26 public void actionPerformed(ActionEvent e) {
27 String s1 = aView.getNumber1();
28 String s2 = aView.getNumber2();
29 String[] res = aModel.calculate(s1, s2);
30 aView.setResults(res);
31 }
32 }
33
34 // KeyListener for the input text fields:
35 private class MyKeyListener extends KeyAdapter {
36 String oldContent = "";
37
38 public void keyReleased(KeyEvent ke) {
39 JTextField tf = (JTextField) ke.getSource();
40 String newContent = tf.getText();
41 int newCaretPos = tf.getCaretPosition();
42 boolean isValid = aModel.isValidEntry(newContent);
43
44 if (isValid) {
45 oldContent = newContent;
46 } else {
47 // If the newConten is not valid, this is probably due to
48 // the character typed last and the following holds:
49 // 1. The caret (cursor) is positioned immediately to
50 // the right of the faulty character.
51 // 2. This character is not present in the oldContent.
52 // 3. The caret position in the oldContent was probably
53 // one less than it is in the newContent.
54 // If the user used "copy and paste" (instead of typing)
55 // things might be different.// Restore the oldContent and the old caret position:
58 tf.setText (oldContent);
59 tf.setCaretPosition(Math.max(0, newCaretPos-1));
60 }
61 } // keyReleased
62 } // class MyKeyAdapter
63 // ---------------------------------------------------------------------
64 // A method with a short name:
65 static void printf(String f, Object... v) {System.out.printf(f, v);}
66 // ---------------------------------------------------------------------
67 } // class RechnerControl [/Java]
Die beiden schnittstellen.

```
public interface RechnerModel_I {
3 String getTypeName();
4 // Each model (class) implementing this interface should
5 // "work and calculate" with numbers of a certain type,
6 // e.g. of type int or of type float or ... .
7 // This method returns the name of this type as a String
8 // e.g. "int" or "float" or ... .
9
10 boolean isValidEntry(String pre);
11 // Returns true, iff there is a String suf, such that
12 // the String pre+suf can be interpreted as a number
13 // of the type expected by the implementing model.
14
15 String[] calculate(String number1, String number2);
16 // Trys to interpret number1 and number2 as numbers z1 and z2
17 // (e.g. of type int or float or ... ), calculates the 5 values
18 // z1+z2, z1-z2, z1*z2, z1/z2, z1%z2 and returns them as an
19 // array of 5 String-objects. In case of problems the String-
20 // objects may contain some error messages.
21 } // inteface RechnerModel_I
```


```
public interface RechnerView_I {
3 // Each implementing class is expected to declare at least
4 // - 1 submit button (e.g. of type JButton)
5 // - 2 input text fields (e.g. of type JTextField)
6 // - 5 result text fields (e.g. of type JTextField)
7
8 void register(ActionListener al, KeyListener kl1, KeyListener kl2) {
9 // Registers (using the appropriate addXXXListener method)
10 // al with the submit button,
11 // kl1 with with the first input text field and
12 // kl2 with with the second input text field.
13
14 String getNumber1();
15 // Returns the content of the first input text field.
16 String getNumber2();
17 // Returns the content of the second input text field,
18 void setResults(String[] results);
19 // Expects the array results to be of lenght 5.
20 // Assigns each of its elements to one of the result text fields.
21 } // inteface RechnerView_I
```
wie ich die buntzeroberfläche der view klasse baue kein problem,was ich noch nicht gecheckt habe wenn ich zum beispiel class View implements rechnerView_I mus ich dann in der klasse exakt die methoden bauen die in der schnittstelle schon vorhanden sind und dies per event an die model klasse senden, nach dem observer prinzip. ich werde nach und nach meine ergebnisse vorzeigen grüßle


----------



## Flexer (30. Sep 2009)

hi an alle interessierten, ich habe ein wenig recherchiert und mal die view zusammengebaut,sie ist aber noch nicht vollständig, ich hoffe ich bin auf den richtigen weg? achso,konnte meine frage selber beantworten"durch implements verpflichtet der programmierer die methoden in der schnittstelle in die klasse zu implementieren".los gehts

```
package rechner;

import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JTextField;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.SwingConstants;
import java .awt  .Dimension;
import java .awt  .Component;
import java .awt  .Font;
import java .awt  .event.ActionListener;
import java .awt  .event.ActionEvent;
import java .awt  .event.KeyListener;
import java .awt  .event.KeyAdapter;
import java .awt  .event.KeyEvent;
import java .beans.PropertyChangeListener;
import java .beans.PropertyChangeEvent;
public class RechnerView extends JFrame implements PropertyChangeListener {
	//Instanzvariablen
	
	private IntEinAus fenstera = new IntEinAus("z1",true);
	private IntEinAus fensterb = new IntEinAus("z2",true);

	//Button
	private JButton submit = new JButton("submit");

	//Operationen
	private IntEinAus fenster3 = new IntEinAus("z1+z2",false);
	private IntEinAus fenster4 = new IntEinAus("z1-z2",false);
	private IntEinAus fenster5 = new IntEinAus("z1*z2",false);
	private IntEinAus fenster6 = new IntEinAus("z1/z2",false);
	private IntEinAus fenster7 = new IntEinAus("z1%z2",false);

	public RechnerView(){
		super("GanzRechG");

		Box kasten1 = Box.createVerticalBox();
		//erste eingabe
		fenstera.addPropertyChangeListener(this);
		kasten1.add(fenstera);
		this.add(kasten1);
		//erste eingabe
		fensterb.addPropertyChangeListener(this);
		kasten1.add(fensterb);
		this.add(kasten1);
		//Button
		kasten1.add(submit);
		//addition
		kasten1.add(fenster3);
		this.add(kasten1);

		//subtraktion
		kasten1.add(fenster4);
		this.add(kasten1);

		//multiplikation
		kasten1.add(fenster5);
		this.add(kasten1);

		//division
		kasten1.add(fenster6);
		this.add(kasten1);

		//Modulo
		kasten1.add(fenster7);
		this.add(kasten1);
	}
	static public void main(String[] args){
		RechnerView fenster1 = new RechnerView();
		fenster1.setSize(400,300);
		fenster1.setVisible(true);
	}

	public void propertyChange(PropertyChangeEvent e){
		getAdd(fenstera,fensterb);
		getSub(fenstera,fensterb);
		getMul(fenstera,fensterb);
		getDiv(fenstera,fensterb);
		getMod(fenstera,fensterb);

	}

	public void getAdd(IntEinAus a,IntEinAus b){
		fenster3.setCont(String.valueOf(fenstera.getCont() + fensterb.getCont()));
	}
	public void getSub(IntEinAus a,IntEinAus b){
		fenster4.setCont(String.valueOf(fenstera.getCont() - fensterb.getCont()));
	}
	public void getMul(IntEinAus a,IntEinAus b){
		fenster5.setCont(String.valueOf(fenstera.getCont() * fensterb.getCont()));
	}

	public void getDiv(IntEinAus a,IntEinAus b){
		fenster6.setCont(String.valueOf(fenstera.getCont() + fensterb.getCont()));
	}

	public void getMod(IntEinAus a,IntEinAus b){
		fenster7.setCont(String.valueOf(fenstera.getCont() + fensterb.getCont()));
	}// class RechnerView
	class IntEinAus extends Box implements SwingConstants,RechnerView_I {
		
		// Eingaben nach jedem Tastendruck oder erst bei Return pruefen?
		static final boolean SOFORT_PRUEFEN = true;
		// Zusaetzliche Testausgaben aktivieren oder nicht?
		static final boolean TST            = true;
		// ---------------------------------------------------------------------
		private String     name1;
		private JLabel     nameLabel1;
		private String     oldContStr = "0";
		private int        oldContInt = Integer.decode(oldContStr);
		private JTextField textFeld1   = new JTextField(oldContStr);
		// ---------------------------------------------------------------------
		public String getname1() {return name1;}
		public int    getCont() {return oldContInt;}
		public void   setCont(String cont) {
			textFeld1.setText(cont);
		}
		// ---------------------------------------------------------------------
		public IntEinAus(String name1, boolean editierbar) {
			super(BoxLayout.X_AXIS); // Dies wird eine horizontale Box

			this.name1 = name1;
			nameLabel1 = new JLabel(name1 + " ");

			Font font = new Font("Monospaced", Font.BOLD, 20);

			nameLabel1.setPreferredSize(new Dimension(100, 30));
			textFeld1 .setPreferredSize(new Dimension(200, 30));

			nameLabel1.setHorizontalAlignment(TRAILING);         // rechtsbuendig
			textFeld1 .setHorizontalAlignment(JTextField.RIGHT); // rechtsbuendig

			nameLabel1.setFont(font);
			textFeld1 .setFont(font);

			if (editierbar) {
				// Der Cursor in einem Textfeld wird auch als Caret bezeichnet
				textFeld1.setCaretPosition(oldContStr.length()); // Caret ganz rechts
				if (TST) printf("caretPostion: %d%n", textFeld1.getCaretPosition());
			} else {
				textFeld1.setEditable(false);
			}

			// Eines von zwei Listener-Objekten beim textFeld anmelden:
			if (SOFORT_PRUEFEN) {
				textFeld1.addKeyListener   (tastenLauscher);
			} else {
				textFeld1.addActionListener(aktionsLauscher);
			}

			this.add(nameLabel1);
			this.add(textFeld1);
		} // Konstruktor IntEinAus
		// ---------------------------------------------------------------------
		ActionListener aktionsLauscher = new ActionListener() {
			public void actionPerformed(ActionEvent ae) {
				// Diese Methode wird erst dann (und jedesmal) aufgerufen, wenn
				// der Benutzer im textFeld auf die Return-Taste drueckt:
				pruefeInhalt();
			}
		}; // aktionsLauscher
		// ---------------------------------------------------------------------
		KeyListener tastenLauscher = new KeyAdapter() {
			public void keyReleased(KeyEvent ke) {
				// Diese Methode wird jedesmal aufgerufen, wenn der Benutzer
				// im textFeld irgendeine Taste der Tastatur wieder loslaesst
				// (nachdem er sie zuvor runtergedrueckt hat):
				pruefeInhalt();
			}
		}; // tastenLauscher
		// ---------------------------------------------------------------------
		void pruefeInhalt() {
			// Der neue Inhalt des textFeld ist o.k., wenn er sich (mit decode)
			// in einen long-Wert umwandeln laesst und dieser long-Wert sich
			// in einen  int-Wert umwandeln laesst.
			// Wenn der neue Inhalt o.k, ist, wird er akzeptiert. Sonst wird
			// er verworfen und das textFeld behaelt seinen alten Inhalt (d.h.
			// den Inhalt vor der letzten Aenderung durch den Benutzer).
            getNumber1();
            getNumber2();
			String  newContStr      = textFeld1.getText(); // Der neue Inhalt
			boolean newContStrIstOk = false;
			long    newContLong     = 0;
			long    MIN             = Integer.MIN_VALUE;
			long    MAX             = Integer.MAX_VALUE;

			try {
				if (TST) printf("newContStr: %s%n", newContStr);
				newContLong = Long.decode(newContStr);
				if (MIN<=newContLong && newContLong<=MAX) {
					newContStrIstOk = true;
				}
			} catch (NumberFormatException ex) {
				if (TST) printf("In pruefeInhalt: %s%n", ex);
			}

			int veryOldContInt = oldContInt;

			if (newContStrIstOk) {
				oldContInt = (int) newContLong; // Cast klappt bestimmt!
				oldContStr =       oldContInt+"";

				PropertyChangeListener[] pclR = this.getPropertyChangeListeners();
				PropertyChangeEvent      pce  = new PropertyChangeEvent(
						this, "value", veryOldContInt, oldContInt
				);
				// Alle angemeldeten Lauscher informieren, dass der Inhalt
				// des aktuellen Textfeldes sich geaendert hat.
				for (PropertyChangeListener pcl : pclR) pcl.propertyChange(pce);
			}

			// Damit der Cursor nicht immer ganz rechts positioniert wird
			// sondern vom Benutzer auch verschoben werden kann:
			int pos = textFeld1.getCaretPosition();
			textFeld1.setText(oldContStr);
			pos = Math.min(pos, oldContStr.length());
			textFeld1.setCaretPosition(pos);

			if (TST) printf("alt: %s, neu: %s%n", oldContStr, newContStr);
		} // pruefeInhalt
		// ---------------------------------------------------------------------
		// Eine Methode mit einem kurzen name11n:
		void printf(String f, Object... v) {System.out.printf(f, v);
		}
		@Override
		public String getNumber1() {
			System.out.println("polizei");
			return String.valueOf(fenstera.getCont());
		}
		@Override
		public String getNumber2() {
			System.out.println("feuerwehr");
			return String.valueOf(fensterb.getCont());
		}
		@Override
		public void register(ActionListener al, KeyListener kl1, KeyListener kl2) {
			// TODO Auto-generated method stub
			
		}
		@Override
		public void setResults(String[] results) {
			// TODO Auto-generated method stub
			
		}
	}
}
```
ich bin sehr dankbar für hinweise auf fehler oder verbesserungsvorschläge.
liebn gruß


----------



## dLx (3. Okt 2009)

Warum fragst du nicht einfach Grude? ???:L

btw. du fliegst gerade in die falsche Richtung !


----------



## Flexer (4. Okt 2009)

ich wußte nicht das es verboten sei, sich im vorfeld zu erkundigen grude werde ich aufjedenfall fragen. die übungen haben auch gerade erst begonnen.ich möchte einfach vorarbeiten.da ich viel zu tun habe.ich wäre dir sehr dankbar wenn du mir helfen könntest und mir sagen warum ich vorbei fliege?
gruß


----------



## dLx (6. Okt 2009)

naja ... lies dir einfach nochmal die Aufgabenstellung durch und evtl. noch die Kommentare in den Schnittstellen.


----------



## Flexer (7. Okt 2009)

hi ich freue mich sehr das du mir indirekt hilfst, ich glaube wirklich das du plan hast
wovon du redest.ich möchte garnicht das du/oder jemand anderes mir die lösung verrät ,sondern hilfestelung gibt,da ich erfahrung sammeln möchte und das thema mvc mir sehr gut gefällt.zeige mir den weg wo ich nachlesen kann oder tutorials machen kann um auf die lösung zu kommen.

in der aufgabenstellung steht kurz und knapp: es gibt eine control klasse, die 2 schnittsellen mit sich bringt(RechnerModel_I,RechnerView_I).Control steuert model klasse und view klasse,view und model klasse kennen sich nicht und können auch nicht auf control klasse zugreifen.model und view arbeiten nach dem observer muster zusammen(events),deswegen schnittsellen.dadurch verplichtet sich der prog. die methoden in der klasse zu vereinbaren.kurzer sachverhalt!weiter,
 Schnittsellen rechnerView_I

public interface RechnerView_I {
3 // Each implementing class is expected to declare at least
4 // - 1 submit button (e.g. of type JButton)
5 // - 2 input text fields (e.g. of type JTextField)
6 // - 5 result text fields (e.g. of type JTextField)
ist klar
7
8 void register(ActionListener al, KeyListener kl1, KeyListener kl2) {
9 // Registers (using the appropriate addXXXListener method)
    hier sollen die parameter in der view al oder wie auch immer initialisiert werden.
   ich nehme mal an durch ein action event(methode) die ich noch erzeugen muß.
   das gleiche für kl1 und kl2.problem:wo und wie kann ich diese anmelden und wie mache ich es richtig und warum mache ich es so richtig?
13
14 String getNumber1();
15 // Returns the content of the first input text field.
16 String getNumber2();
17 // Returns the content of the second input text field,
ich denke mal,hoffe habe ich erstmal richtig gemacht :-().
18 void setResults(String[] results);
19 // Expects the array results to be of lenght 5.
20 // Assigns each of its elements to one of the result text fields.
hier möchte die prozedur ein ergebnis von der view klasse entnehmen
caculate() die ebenfalls eine reihung zurückliefert.soweit bin ich aber noch nicht mit der model klasse. ich habe mir mvc rechner von andreas gödel besorgt und vermute das ich den typ der schnittsetellen impl. mus. siehe google: java mvc rechner.
vielen lieben dank.:rtfm:

view klasse reicht erstmal.sag mir bitte ob ich irgendwas falsch verstehe oder soweit richtig bin?lieben gruß


----------



## dLx (8. Okt 2009)

Vorweg: Falls du es noch nicht gemacht hast, gucke die die RechnerControl an, da müssten schon ein Paar deiner Fragen beantwortet werde.




Flexer hat gesagt.:


> 8 void register(ActionListener al, KeyListener kl1, KeyListener kl2) {
> 9 // Registers (using the appropriate addXXXListener method)
> hier sollen die parameter in der view al oder wie auch immer initialisiert werden.
> ich nehme mal an durch ein action event(methode) die ich noch erzeugen muß.
> ...


Warum willst du einen fertigen z.B. ActionListener al nochmal initialisieren?
Diese Methode soll lediglich die fertigen Listener bei den richtigen Objekten "anmelden".




Flexer hat gesagt.:


> 14 String getNumber1();
> 15 // Returns the content of the first input text field.
> 16 String getNumber2();
> 17 // Returns the content of the second input text field,
> ich denke mal,hoffe habe ich erstmal richtig gemacht :-().


Naja ... es würde wohl funktionieren.
Aber so sollte es nicht unbedingt gemacht werden.




Flexer hat gesagt.:


> 18 void setResults(String[] results);
> 19 // Expects the array results to be of lenght 5.
> 20 // Assigns each of its elements to one of the result text fields.
> hier möchte die prozedur ein ergebnis von der view klasse entnehmen
> caculate() die ebenfalls eine reihung zurückliefert.


Nein.
Sie bekommt sie als Parameter übergeben.




Zu deiner Lösung:
Du bearbeitest ALLES in deiner View-klasse, dass ist nicht der Sinn eines MVC pattern.


----------



## Flexer (20. Okt 2009)

hallo an alle(grüß dich dlx). ich habe euch nicht vergessen und wie versprochen poste ich den kompletten mvc rechner rein. er funktioniert soweit und entspricht auch den anforderungen. was mich ein bischen stört könnte die effizienz der view klasse sein. damit meine ich, ich weiß das die deklaration  von jtextfeldern und labels effizienter geht und nicht wie ich es gemacht habe siehe view klasse im konstruktor jedes element einzeln deklariert. ich habe schon probiert eine methode zu schreiben die ein array zurückliefert
die mit einer for schleife alle textfelder und labels so initialisiert, wie das programm jetzt aussieht,damit würde sich mein code erheblich reduzieren. weiß jemand wie das geht?wäre sehr dankbar nun meine lösung.
ViewKlasse

```
package rechner;

import java.awt.Color;
import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.LayoutManager;
import java.awt.event.ActionListener;
import java.awt.event.KeyListener;

import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

//import com.jgoodies.forms.layout.CellConstraints;

@SuppressWarnings("serial")
public class RechnerView extends JFrame implements RechnerView_I  {
	//für die Eingabe
	JTextField z1 = new JTextField();
	JTextField z2 = new JTextField();

	//für die Anzeige
	JTextField z1addz2 = new JTextField();
	JTextField z1subz2 = new JTextField();
	JTextField z1mulz2 = new JTextField();
	JTextField z1modz2 = new JTextField();
	JTextField z1divz2 = new JTextField();
	JLabel z1az2  = new JLabel();
	JLabel z1suz2 = new JLabel();
	JLabel z1muz2 = new JLabel();
	JLabel z1moz2 = new JLabel();
	JLabel z1dz2 = new JLabel();
	JPanel drumrum = new JPanel();
	JButton submit = new JButton();

	public RechnerView(String ueberschrift) {

		super(ueberschrift);
		
		Box kasten1 = Box.createVerticalBox();
		kasten1.add(drumrum);
        this.add(kasten1);
		//für die Eingabe
		kasten1.add(z1);
        this.add(kasten1);
		
        kasten1.add(z2);
        this.add(kasten1);
        
        submit.setPreferredSize(new Dimension(0,40));
        submit.setText("Button bestätigen nach fertiger eingabe !");
        kasten1.add(submit);
        this.add(kasten1);
        
        z1az2.setText("z1 + z2");
		z1az2.setFont(new Font("Arial", Font.BOLD, 11));
		kasten1.add(z1az2);
	    this.add(kasten1);
		
		kasten1.add(z1addz2);
		z1addz2.setEditable(false);
	    this.add(kasten1);
	    
		z1suz2.setText("z1 - z2");
		z1suz2.setFont(new Font("Arial", Font.BOLD, 11));
		kasten1.add(z1suz2);
	    this.add(kasten1);
		
		kasten1.add(z1subz2);
		z1subz2.setEditable(false);
	    this.add(kasten1);
	    
	    z1muz2.setText("z1 * z2");
		z1muz2.setFont(new Font("Arial", Font.BOLD, 11));
		kasten1.add(z1muz2);
	    this.add(kasten1);
		
		kasten1.add(z1mulz2);
		z1mulz2.setEditable(false);
	    this.add(kasten1);
	    
	    z1moz2.setText("z1 % z2");
		z1moz2.setFont(new Font("Arial", Font.BOLD, 11));
		kasten1.add(z1moz2);
	    this.add(kasten1);
		
		kasten1.add(z1modz2);
		z1modz2.setEditable(false);
	    this.add(kasten1);
	    
	    z1dz2.setText("z1 / z2");
		z1dz2.setFont(new Font("Arial", Font.BOLD, 11));
		kasten1.add(z1dz2);
	    this.add(kasten1);
		
		kasten1.add(z1divz2);
		z1divz2.setEditable(false);
	    this.add(kasten1);
				
		this.setBounds(100, 100, 300, 400);
		this.setBackground(new Color(204, 204, 204));
		this.setResizable(true);
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.setVisible(true);
	}
	
	public String getNumber1() {
		return z1.getText();
	}

	public String getNumber2() {
		return z2.getText();
	}

	public void register(ActionListener al, KeyListener kl1, KeyListener kl2) {
		
		submit.addActionListener(al);
		z1.addKeyListener(kl1);
		z2.addKeyListener(kl2);
	}

	public void setResults(String[] results) {
		z1addz2.setText(results[0]);
		z1subz2.setText(results[1]);
		z1mulz2.setText(results[2]);
		z1modz2.setText(results[3]);
		z1divz2.setText(results[4]);
	}
}
```
ModelKlasse

```
package rechner;

import java.awt.Color;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JLabel;

public class RechnerModel implements RechnerModel_I {
	
	public final boolean TST = true;
	
	public String[] calculate(String number1, String number2) {
		String[] result = new String[5];
		try {
			if(isValidEntry(number1)&& isValidEntry(number2)) {
					int zahl1 = Integer.parseInt(number1);
					int zahl2 = Integer.parseInt(number2);
					result[0] = (zahl1 + zahl2) + "";
					result[1] = (zahl1 - zahl2) + "";
					result[2] = (zahl1 * zahl2) + "";
					result[3] = (zahl1 % zahl2) + "";
					result[4] = (zahl1 / zahl2) + "";
				}
			return result;
		} catch (NumberFormatException e1) {
			if(TST) System.out.println("c[] falsch");
		}
		return result;

	}

	public String getTypeName() {
		return null;
	}

	public boolean isValidEntry(String pre) {
		try {
			if(pre.equals("-") || pre.equals("")){
				return true;
			}
			int zahl = Integer.parseInt(pre);
			if(TST) System.out.println("iVE gut");
			return true;
		} catch (NumberFormatException  e) {
			if(TST) System.out.println("iVE falsch");
			return false;
		}
	}
}
```
main

```
package rechner;

public class Main {
	
	public static void main(String[] args) {

		RechnerView grabo = new RechnerView("Taschenrechner");
		RechnerModel model = new RechnerModel();
		RechnerControl rc = new RechnerControl(model, grabo );
	}
}
```


----------

