Java rekenmachine

Status
Niet open voor verdere reacties.

srananmang

Gebruiker
Lid geworden
10 mei 2011
Berichten
59
MVC in Java rekenmachine

YES!!!!

Ik heb de calculator compleet met MVC, arrays hahaha Hij doet het ook nog goed genoeg.

Nu heb ik een laatste verzoek...

Dit ga ik nu ff doorlezen in het boek en ff kijken hoe dit te doen is.

Mijn laatste onderdeel(dan ben ik echt!!! klaaar!!) is een TRY/CATCH in zetten. Hierbij wil ik dat op het scherm voor ongeveer 10 seconden bij elke operator verschillende tekst komt. Een soort pauze, alsof de rekenmachine meot nadenken over het berekenen van de opgave.

Zoals ik toets 4 x 9 = --> dan komt er in het uitkomst vak " Wow, gaan we vermenigvuldigen, wacht ff hier ben ik niet zo goed in!!! " en na 10 sec. laat het de uitkomst zien...

Wie enkele iedeen heeft graag Ik ga nu lezen en kijken of ik zelf iets kan creeren

Alvast bedankt....

Srananmang

Main klasse:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Rekenmachine extends JFrame
	{
		public static void main( String[] args )
  			{
  				/* Maak een frame*/
			    JFrame 	frame = new Rekenmachine ()								;
					    frame.setSize( 500, 500 )								;
					    frame.setLocationRelativeTo(null)						;
					    frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE )	;
					    frame.setTitle( "Game" )								;
					    frame.setContentPane( new RekenPaneel())				;
					    frame.setVisible( true )								;
  			}
	}

class RekenPaneel extends JPanel
	{
		private RekenModel	 	model;
		private RekenVC 		view;
		private RekenC			control;
		
		public RekenPaneel()
			{
				setLayout( new BorderLayout() );
				
				model = new RekenModel(	true, true, true, true, true, 
										true, true, true, true, true, 
										true, true, true, true, true);
				
				view = new RekenVC( model );
				
				control = new RekenC( model, view );
				
				add( view, BorderLayout.NORTH );
				add( control, BorderLayout.CENTER );
			}
	}

Model:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class RekenModel 
	{			
		private boolean 	setNummer, setPlus, setNul, setMin, setMaal,
							setDelen, setIs, setNummerF, setPlusF, setMinF,
							setMaalF, setLeegF, setDelenF, setIsF, setClearF;	
		private boolean   	startnr				= true;														
		private String 		uitkomst 			= "0";
		private String 		funnytekst 			= "";
		private String 		laatsteInvoer		= null;
		private String    	vorigenr			= "=";
		private double 		voorResultaat		= 0;
		private double		vervolgResultaat	= 0;
		private double		resultaat;			
    	public 	RekenModel(	boolean setNummer, 	boolean setPlus, 	boolean setNul, 
    						boolean setMin, 	boolean setMaal, 	boolean setDelen, 
    						boolean setIs, 		boolean setNummerF, boolean setPlusF, 
    						boolean setMinF, 	boolean setMaalF, 	boolean setLeegF, 
    						boolean setDelenF, 	boolean setIsF, 	boolean setClearF) 
    		{
				this.setNummer	= setNummer;
				this.setPlus	= setPlus;
				this.setNul		= setNul;
				this.setMin		= setMin;
				this.setMaal	= setMaal;
				this.setDelen	= setDelen;
				this.setIs		= setIs;
				this.setNummerF	= setNummerF;
				this.setPlusF	= setPlusF;
				this.setMinF	= setMinF;
				this.setMaalF	= setMaalF;
				this.setLeegF	= setLeegF;
				this.setDelenF	= setDelenF;
				this.setIsF		= setIsF;
				this.setClearF	= setClearF;
    		}    		
		public	void zet(String no)
	        {
						if(uitkomst.equals("0"))
						{
							uitkomst = no;
						}
				else 	if(	laatsteInvoer=="=")			
					{
							uitkomst = no;
							laatsteInvoer=null;
					}
				else
				{
					 		uitkomst = uitkomst + no;
				}
	        }  		
/*uitkomst*/    	
	    public String setNummer(String no)
	    	{
				zet(no);
				return uitkomst;
			}
 	    public String setNul()
	    	{
				zet("0");
				return uitkomst;
			}
 	    public String setPlus()
	    	{
				voorResultaat		= Double.parseDouble(uitkomst);
				laatsteInvoer		="+";
				uitkomst = "";
				return uitkomst;
			}	
 	    public String setMin()
	    	{
				voorResultaat		= Double.parseDouble(uitkomst);
				laatsteInvoer		="-";
				uitkomst = "";
				return uitkomst;
			}	
 	    public String setMaal()
	    	{
				voorResultaat		= Double.parseDouble(uitkomst);
				laatsteInvoer		="*";
				uitkomst = "";
				return uitkomst;
			}	
 	    public String setDelen()
	    	{
				voorResultaat		= Double.parseDouble(uitkomst);
				laatsteInvoer		="/";
				uitkomst = "";
				return uitkomst;
			}															

 	    public String setIs()
	    	{
				vervolgResultaat=Double.parseDouble(uitkomst);
							if	(laatsteInvoer.equals("/"))
					  			resultaat	=	voorResultaat/vervolgResultaat;
					 		if	(laatsteInvoer.equals("*"))
					  			resultaat	=	voorResultaat*vervolgResultaat;
					 		if	(laatsteInvoer.equals("-"))
					  			resultaat	=	voorResultaat-vervolgResultaat;
					 		if	(laatsteInvoer.equals("+"))
					  			resultaat	=	voorResultaat+vervolgResultaat;
/* Dit is er om te checken of de waarden vast worden gehouden*/							  			
			System.out.println(""+voorResultaat+" "+resultaat+"");		
								uitkomst = " "+resultaat;
								laatsteInvoer="=";	
					return uitkomst;												
			}
			
/*Funnytekst*/
 	    public String setNummerF(String no)
	    	{
	    		return no;
			}			
 	    public String setPlusF()
	    	{
				funnytekst = "Dat je hier een rekenmachine voor nodig hebt...";
				return funnytekst;
			}			
 	    public String setMinF()
	    	{
				funnytekst = "Lukt dit niet uit het hoofd?";
				return funnytekst;
			}
 	    public String setMaalF()
	    	{
				funnytekst = "En we gaan vermenigvuldigen!";
				return funnytekst;
			}
 	    public String setLeegF()
	    	{
				funnytekst = "ERROR, START PC OPNIEUW OP";
				return funnytekst;
			}
 	    public String setDelenF()
	    	{
				funnytekst = "Door wat gaan we het delen?";
				return funnytekst;
			}
 	    public String setIsF()
	    	{
				funnytekst = "Is dit antwoord wel juist?";
				return funnytekst;
			}
 	    public String setClearF()
	    	{
				funnytekst = "Zo ff een leeg veld";
				return funnytekst;
			}
		public String setClear()
			{
				uitkomst			= "0";
				return uitkomst;
			}



	}

View:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class RekenVC extends JPanel
	{	
		/*voeg alles toe*/
		private RekenModel model;
			
		JTextField		tekstvak 		= new JTextField("Welkom! Bij de surinaamse rekenmachine van 'BiG$mOkE...",5);
 		JTextField 		uitkomst		= new JTextField("0",5);
		
		/* In de RekenPaneel maak ik de buttons aan in een GridLayout en deze komen in verschillende JPanels 
		 *die ik in de BorderLayout plaats,aan de Buttons en TextFields zitten actionlisteners en een knophandler voor de funny tekst*/
		public RekenVC(RekenModel model) 
			{
				this.model = model;				
	
				this							.setLayout(new GridLayout(2, 1));
				
				uitkomst						.setEditable(false);
				uitkomst						.setHorizontalAlignment( SwingConstants.CENTER );
				uitkomst						.setBackground(new Color(147, 1, 20));
				uitkomst						.setForeground(new Color(250, 250, 250));
				
				tekstvak						.setEditable(false);
				tekstvak						.setHorizontalAlignment( SwingConstants.CENTER );
				tekstvak						.setBackground(new Color(147, 1, 20));
				tekstvak						.setForeground(new Color(250, 250, 250));
				
				this							.add(uitkomst);	
				this							.add(tekstvak);				
							
			}
		public void toonUitkomst (String getal)
		{
			uitkomst.setText(getal);
		}					
		public void toonFunnytekst (String funnytekst)
		{
			tekstvak.setText(funnytekst);
		}			
	}

Control:
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class RekenC extends JPanel
	{
		private RekenModel model;
		private RekenVC view;

		public Color		goud;	
		public JButton 		Clear, is, plus, min, delen, maal, leeg, nul;
		public JButton[]	nummersArray	= new JButton[9];
		public String[]		namen			= {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
		public String[]		namenFunny		= {"een", "twee", "drie", "vier", "vijf", "zes", "zeven", "acht", "negen"};
		
		public RekenC( RekenModel model, RekenVC view )
			{
				this.model = model;
				this.view = view;
				
				setLayout						(new BorderLayout());
				goud 							= new Color ( 147, 147, 0 );
				KnopHandler	aap 				= new KnopHandler();
				CijferHandler calc				= new CijferHandler();	
				ClearListener clear				= new ClearListener();			
				
				JPanel paneelcijfers			= new JPanel();				
				paneelcijfers					.setLayout(new GridLayout(4, 3));	
								
					for(int i = 0; i < 9; i++)
												{
													nummersArray[i] = new JButton(namen[i]);
													nummersArray[i]	.addActionListener(calc);
													nummersArray[i]	.addActionListener(aap);
													paneelcijfers.add(nummersArray[i]);
												}
												
				nummersArray[0]					.setBackground(goud);
				nummersArray[2]					.setBackground(goud);				
				nummersArray[4]					.setBackground(goud);				
				nummersArray[6]					.setBackground(goud);
				nummersArray[8]					.setBackground(goud);
																								
				paneelcijfers.add(leeg		 	= new JButton("" ));
				leeg							.addActionListener(aap);						
				paneelcijfers.add(nul			= new JButton("0"));
				nul								.addActionListener(calc);
				nul								.setBackground(goud);	
				paneelcijfers.add(Clear 		= new JButton("C"));
				Clear							.addActionListener(aap);				
				Clear							.addActionListener(clear);								
									
				JPanel paneelkeuze				= new JPanel();
				paneelkeuze						.setLayout(new GridLayout(4, 1));
								
				paneelkeuze.add(plus 			= new JButton("+"));					
				paneelkeuze.add(min			 	= new JButton("-"));										
				paneelkeuze.add(maal		 	= new JButton("x"));								
				paneelkeuze.add(delen			= new JButton(":"));								
				min								.setBackground(goud);				
				delen							.setBackground(goud);
				plus							.addActionListener(calc);
				min								.addActionListener(calc);	
				maal							.addActionListener(calc);	
				delen							.addActionListener(calc);
				plus							.addActionListener(aap);
				min								.addActionListener(aap);	
				maal							.addActionListener(aap);	
				delen							.addActionListener(aap);										

				JPanel paneelis					= new JPanel();				
				paneelis						.setLayout(new GridLayout(1, 1));
				
				paneelis						.add(is	= new JButton("="));						
				paneelis						.setBackground(goud);
				is								.addActionListener(calc);						
				is								.addActionListener(aap);
				
				add(paneelcijfers,BorderLayout.CENTER);
				add(paneelis,BorderLayout.SOUTH);
				add(paneelkeuze, BorderLayout.EAST);
			}													
		
/* Elke nummer krijgt hier een waarde en wanneer je op het nummer klikt krijgt het nummer de waarde van zijn knop */      
class CijferHandler implements ActionListener
	{
		public void actionPerformed(ActionEvent invoer)
			{				
				for(int i = 0; i < 9; i++)
								
				if(invoer.getSource()==nummersArray[i])
					{
						view.toonUitkomst(model.setNummer(namen[i]));
					}	
		if(invoer.getSource()==nul)
					{
						view.toonUitkomst(model.setNul());
					}
		if(invoer.getSource()==plus)
					{
						view.toonUitkomst(model.setPlus());
					}
		if(invoer.getSource()==min)
					{
						view.toonUitkomst(model.setMin());
					}
		if(invoer.getSource()==maal)
					{
						view.toonUitkomst(model.setMaal());
					}
		if(invoer.getSource()==delen)
					{
						view.toonUitkomst(model.setDelen());
					}
		if(invoer.getSource()==is)	
					{
						view.toonUitkomst(model.setIs());
					}
		}
	}
		
/* Hier maak ik de KnopHandler aan voor de funny teksten */	    
class KnopHandler implements ActionListener 
	{
		public void actionPerformed(ActionEvent funny)
			{				
				for(int i = 0; i < 9; i++)
					
				if(funny.getSource()==nummersArray[i])
					{
						view.toonFunnytekst(model.setNummerF(namenFunny[i]));
					}
				if(funny.getSource()==plus)
					{
						view.toonFunnytekst(model.setPlusF());
					}					
			 	if(funny.getSource()==min)
					{
						view.toonFunnytekst(model.setMinF());
					}
		 		if(funny.getSource()==maal)
					{
						view.toonFunnytekst(model.setMaalF());
					}
		 		if(funny.getSource()==leeg)
					{
						view.toonFunnytekst(model.setLeegF());
					}
			 	if(funny.getSource()==delen)
					{
						view.toonFunnytekst(model.setDelenF());
					}
		 		if(funny.getSource()==is)
					{
						view.toonFunnytekst(model.setIsF());
					}
			 	if(funny.getSource()==Clear)
					{
						view.toonFunnytekst(model.setClearF());
					}
			}
	}
	
	
	
/* Om de tekstvak schoon te vegen */
class ClearListener implements ActionListener 
	{
		public void actionPerformed(ActionEvent schoon)
			{
				if(schoon.getSource()==Clear)	
					{
						view.toonUitkomst(model.setClear());
					}
			}
	}
}
 

Bijlagen

Laatst bewerkt:
Met alle respect, maar ik denk niet dat iemand hier bereid is om dit voor je te maken. Je zult er zelf toch een beetje moeite voor moeten doen. Indien je iets niet lukt kan je het natuurlijk vragen, maar dan wel met eigen code. We zijn hier om te helpen, niet om je iets voor te kauwen.

Het is niet boos bedoeld hoor, maar programmeren draait allemaal om oefening en dus helpt het niet als wij alles voor je gaan maken.

Met vriendelijke groet,
NewbiProgrammer
 
Het MVC-model zorgt er o.a. voor dat je GUI niet vast zit aan je model. Zodat indien je een nieuwe GUI zou willen dit makkelijk aanpasbaar is.

Hierdoor weet je dus dat het model de GUI niet mag kennen.
Hier kan je voor zorgen door de view "Observer" te maken en het model "Observable". Alle data wordt opgeslagen in het model. Indien het model veranderd geeft het model een seintje aan de views (die observer van hem zijn) en passen de views hun lay-out aan op basis van data uit het model.

Jouw code is denk ik wel goed om te bouwen tot MVC. Zorg ervoor dat je JPanel (view) Observer is. Zorg ervoor dat je een "model" maakt dat de data van je rekenmachine bevat dit model moet Observable worden. Omdat je swing gebruikt mag het wel dat je View ook de ActionListener bevat (controller elementen) wel zou ik hier een inner klasse voor gebruiken.

dus in code
Constructor view:
Code:
public class RekenmachineView extends JPanel implements Observer, ActionListener {

Update methode in het view
Code:
@Override
public void update(Observable o, Object arg) {
       RekenModel model = ((RekenModel) o);
       model.getValues(); //voorbeeldje

Constructor model
Code:
public class RekenModel extends Observable {

Bij de methodes waarbij je de views wilt laten weten dat er iets veranderd is (de update methode van de observers worden dan aangeroepen) moet je een setChanged() en notifyObservers() aanroepen.

Voorbeeld methode in model:
Code:
public void assign(int number) {
//even een voorbeeldje waarin je de getallen in een  arraylist hebt geplaatst.
      mijn_getallen.add(number);  
      setChanged();
      notifyObservers();

Observable api: http://download.oracle.com/javase/1.3/docs/api/java/util/Observable.html
Observer api: http://download.oracle.com/javase/1.4.2/docs/api/java/util/Observer.html

Hopelijk ben je hier wat wijzer door geworden. Indien je vragen hebt, meld het maar :)

p.s. Je komt niet verwend over hoor :) Dat bewijs je al door het feit dat je toch veel zelf hebt gedaan!
 
Laatst bewerkt:
Button in arraylist

Normaal maak ik geen nieuwe posts aan zonder een antwoord, maar dit gaat over wat anders. Dus voor de duidelijkheid.

Ik heb ook even iets voor je uitgetikt, om je buttons in een ArrayList te stoppen. Dit is een manier om het te doen, je zou het natuurlijk ook heel anders kunnen implementeren. (Ik heb het als een eigen klasse op zich geïmplementeerd, jij hoeft er geen eigen klasse voor te maken denk ik).

Code:
import javax.swing.JButton;


public class Buttons {
	
	private JButton[] buttonArray;
	
	private final int PLUSBBUTTON = 1,
                      MINBUTTON   = 2,
                      ONE         = 3;
	//....
	
	public Buttons() {
		buttonArray = new JButton[10];
		makeButtonAndAddToList();
	}
	
	private void makeButtonAndAddToList() {
		for(int i=0; i < buttonArray.length; i++) {
			String buttonName = determineButtonName(i);
			buttonArray[i] = new JButton(buttonName);
		}
	}

	private String determineButtonName(int nameNumber){ 
		//Dit is een manier om het te doen, je zou ook gewoon return ".."; 
                //break; bij elke case kunnen doen.
		String buttonName = null;
		switch(nameNumber) {
		case PLUSBBUTTON: 
			buttonName = "Plus";
			break;
		case MINBUTTON:
			buttonName = "Min";
			break;
		case ONE:
			buttonName = "1";
			break;
		default:
	               System.out.println("De juiste optie is niet gevonden, dan maar geen naam.");
			buttonName = "";
			break;
		}
		return buttonName;
	}
}
 
Beste srananmang, (pff moeilijke naam)

Ik raad je aan om je JFrame niet te verpakken in je view.
Dit vind ik (en waarschijnlijk meer mensen) minder mooi. Views zijn klasses die zaken op het scherm tonen, ze zijn niet ook nog is het frame :).

Zelf zou ik een Apl maken (die het frame, en de rest van de klasses maakt).

Ik zag in je code dat je sommige attributen public had gemaakt zodat de controller klasse bij deze attributen kan. Zoals je waarschijnlijk al had gemerkt, zou je ook de swing-componenten public moeten maken als je ze wilt benaderen in de controller klasse (dit zijn die fouten, de scope van je attributen ligt binnen de klasse en dus kunnen ze niet worden benaderd vanuit een andere klasse). Zelf prefereer ik een innerklasse als controller in de view. Dit zorgt ervoor dat de scope van je attributen binnen de view blijft (om een beetje de OO manier te volgen).

Hier een opzetje van de view:
Code:
class Rekenview extends JPanel
{
	//attributen
	
	public Rekenview(){

		//De view .
		
	}
	
	//Innerklasse.
	private class ClearListener implements ActionListener {
		
		public void actionPerformed(ActionEvent e) {
			if(e.getSource() == attribuut) {
                        
                        }
		}
	}
		
}

Ik weet dat jij ervoor hebt gekozen om geen model te nemen. Dit kan wel maar dan moet je de data (en de rekenformules) dus ook in de view stoppen en krijg je dus weer geen nette MVC.

Misschien is het een idee om eerst een ontwerpje te maken, een klein klassendiagram kan al voldoende zijn. Ik weet dat het misschien een beetje overbodig is bij een klein programma, maar het geeft je wel veel inzicht en voorkomt fouten.

Ik weet dat ik er steeds een beetje omheen draai, maar ik wil dat je zelf tot de juiste oplossing komt i.p.v. hapklare code krijgt. Indien je het nog niet helemaal ziet zal ik iets voor je uitwerken

p.s.
Zo lang achter elkaar programmeren is niet gezond, haha.
Probeer één tot twee uur te programmeren neem even pauze (ga wat anders doen) en ga daarna weer verder. Dit zorgt voor een frisse kijk op de code.

met vriendelijke groet,
NewbiProgrammer
 
Laatst bewerkt:
Beste sr,

De operatorfout heeft te maken met het feit dat je lcd (dat een JTextField is) deelt door een double (vervolgResultaat). Ik denk dat je hier bedoeld dat je de waarde dat in het JTextField staat wilt delen door het vervolgResultaat dus zou je het volgende trucje moeten toepassen.

Code:
String lcdWaardeString = lcd.getText(); // nu krijg je de tekst die in het JTextField staat (dat is je waarde).
double waarde = 0.0;
try { 
//Daarna moeten we de string nog even omzetten naar een double.
       waarde = Double.parseDouble(lcdWaardeString);
}catch(NumberFormatException n) { //even ervoor zorgen dat je programma niet crashed indien de String niet kan worden omgezet.
        System.out.println("De waarde uit het tekstveld kon niet worden omgezet naar een getal.");
}

//Dit kan natuurlijk ook makkelijker
double waarde = 0.0;
try { 
     waarde = Double.parseDouble(lcd.getText());
}catch(NumberFormatException n) {
     System.out.println("De waarde uit het tekstveld kon niet worden omgezet naar een getal.");
}

Indien ik vanavond wat tijd heb zal ik je helpen met de rest.
 
Laatst bewerkt:
Klinkt erg naar een huiswerk opdracht. Althans ik ken weinig programmeurs die bepaalde commando's moeten gebruiken in hun code.

Waar loop je vast. Misschien geven we je een hint ;)
 
Inhoudelijk kan ik je niet echt helpen ben ik bang. Ik ben nooit verder gekomen dan de beproefde methode 'trial and error'. Leerzaam maar niet erg efficient.
 
Ik heb wat moeite gedaan (let op het werkt niet dat moet je zelf doen)
de code is snel wijzigbaar en aanvulbaar.
uw code is veel verander hopelijk vindt je weg nog terug(en houd vooral je vorige versie)zie naamwijziging van class
Code:
	import javax.swing.*;

	import java.awt.*;
import java.awt.event.*;
import java.lang.reflect.Array;
/**
 *http://www.helpmij.nl/forum/showthread.php/636687-Java-rekenmachine
 */
public class rekenmachinehulpje extends JPanel implements ActionListener{
			Color			mycolor;		
			JButton 		Clear;
			MyCalcbutton[]	nummers			= new MyCalcbutton[16];
			JTextField		tekstvak 		= new JTextField("Welkom! Bij de surinaamse rekenmachine van 'BiG$mOkE...",5);
	 		JTextField 		uitkomst		= new JTextField("0",5);
	 		String 			laatsteInvoer	= null;
			boolean   		startnr			= true;
			String    		vorigenr		= "=";
			double 			voorResultaat	= 0;
			double			vervolgResultaat= 0;
			double			resultaat;
			private JPanel paneelnoord;
			private JPanel paneelcntrm;
			private JPanel paneelis;
			private MyCalc calcit;			
	/* In de RekenPaneel maak ik de buttons aan in een GridLayout en deze komen in verschillende JPanels die ik in de BorderLayout plaats,
		aan de Buttons en TextFields zitten actionlisteners en een knophandler voor de funny tekst*/
			public rekenmachinehulpje(Color color){
				mycolor = color;
				calcit=new MyCalc();
				 paneelnoord 	= 		new JPanel();							
				 paneelcntrm		=		new JPanel();
				 paneelis 		= 		new JPanel();
				setgui(true);
				
			}
			public void setgui(boolean enabled){
				KnopHandler	aap 			= 		new KnopHandler();								
	         	setLayout							(new BorderLayout());
				paneelnoord.setLayout				(new GridLayout(2,1));				
				paneelcntrm.setLayout				(new GridLayout(4, 4));
				paneelis.	setLayout				(new GridLayout(1, 1));								
				paneelis.	setBackground			(new Color ( 147, 147, 0 ));		
											
				uitkomst.	setEditable				(false);
				uitkomst.	setHorizontalAlignment	( SwingConstants.CENTER );
				uitkomst.	setBackground			(new Color(147, 1, 20));
				uitkomst.	setForeground			(new Color(250, 250, 250));
				paneelnoord.add						(uitkomst);
					
				tekstvak.	setEditable				(false);
				tekstvak.	setHorizontalAlignment	( SwingConstants.CENTER );
				tekstvak.	setBackground			(new Color(147, 1, 20));
				tekstvak.	setForeground			(new Color(250, 250, 250));
				paneelnoord.add						(tekstvak);

	
				nummers[1] 	= new MyCalcbutton('1',"een");
				nummers[2] 	= new MyCalcbutton('2',"twee");
				nummers[3] 	= new MyCalcbutton('3',"drie");
				nummers[10] = new MyCalcbutton('+',"Dat je hier een rekenmachine voor nodig hebt...");
				nummers[4] 	= new MyCalcbutton('4',"vier");
				nummers[5]	= new MyCalcbutton('5',"vijf");
				nummers[6] 	= new MyCalcbutton('6',"zes");
				nummers[11] = new MyCalcbutton('-',"Lukt dit niet uit het hoofd?");				
				nummers[7] 	= new MyCalcbutton('7',"zeven");	
				nummers[8] 	= new MyCalcbutton('8',"acht");	
				nummers[9] 	= new MyCalcbutton('9',"negen");				
				nummers[12] = new MyCalcbutton('x',"En we gaan vermenigvuldigen!");				
				nummers[13] = new MyCalcbutton('\'',"ERROR, START PC OPNIEUW OP" );	
				nummers[0] 	= new MyCalcbutton('0',"nul");						
				Clear 		= new MyCalcbutton('C',"Zo ff een leeg veld");				
				nummers[14] = new MyCalcbutton(':',"Door wat gaan we het delen?");					
				nummers[15] = new MyCalcbutton('=',"Is dit antwoord wel juist?");
				MyCalcbutton tmp;
				for (int i = 0; i < nummers.length; i++) {
					tmp = (MyCalcbutton)nummers[i];
					tmp.addActionListener(this);
					tmp.addActionListener(aap);
					tmp.setBackground(mycolor);
					paneelcntrm.add(tmp);
				}
				Clear.addActionListener(new ClearListener());
				Clear.addActionListener(aap);												
				paneelcntrm.add(Clear);
				add(paneelnoord,BorderLayout.NORTH);
				add(paneelcntrm,BorderLayout.CENTER);
				add(paneelis,BorderLayout.SOUTH);
			}
		      
	/* Elke nummer krijgt hier een waarde en wanneer je op het nummer klikt krijgt het nummer de waarde van zijn knop */      
			public void actionPerformed(ActionEvent invoer){	
				calcit.invoer((MyCalcbutton)invoer.getSource());
			}
	/* Hier maak ik de KnopHandler aan voor de funny teksten */	    
		    class KnopHandler implements ActionListener {
					public void actionPerformed(ActionEvent funny){
						tekstvak.setText(funny.getSource().toString());
					
					}
				}
		    /* Om de tekstvak schoon te vegen*/
		  //Dit kan je niet omdat je er niet aan kan kon 
		  class ClearListener implements ActionListener{
		      public void actionPerformed(ActionEvent schoon){
		          	action_clear();
		      }
		  }
				private void action_clear(){
						startnr 			= true	;
						uitkomst.setText	("0")	;
						vorigenr  			= "="	;
				}
		}


class MyCalcbutton extends JButton{
	private String debugtxt;
	private char label;
	public MyCalcbutton(char label,String debugtxt) {
		this.debugtxt = debugtxt;
		this.label = label;
	}
	public MyCalcbutton(char label,Action reken) {
		
	}
	public char getlabel(){
		return label  ;
	}
	public String getgetal(){
		char t[] = null;
		 t[0]=label;
		return new String(t)  ;
	}
	@Override
	public String toString() {
		return debugtxt;
	}
	
}
class MyCalc{
	private String debugtxt;
	private MyCalcbutton laasteinvoer;
	private Double uitkomst =0.0;
	private Double remeber =0.0;
	private Double een =0.0;
	private Double twee =0.0;
	private String activenr;
	private char actie;
	public MyCalc() {

	}
	public Double invoer(MyCalcbutton invoer) {
		Double getal= 0.0 ;
		this.laasteinvoer =invoer;
		if	(invoer.getlabel()=='='){
			remeber=uitkomst;
			uitkomst = calcit(een,actie,twee);
			actie = 0;
			een = uitkomst;
		}else{
			try{
				getal= Double.parseDouble(invoer.getgetal());//isgetal?
				if (actie!=0){
					een=getal;
				}else{
					twee=getal;
				}
			}catch(NumberFormatException ne){
					remeber=uitkomst;
					actie = invoer.getlabel();
			}
		}
		return uitkomst;
	}
	private double calcit(Double een,char action,Double twee){
			if	(action=='*')  return een*twee;
			if	(action=='-')  return een-twee;
			if	(action=='*')  return een+twee;
			if	(action=='/')  return een/twee;
			throw new unImplementExeption();
	}
	public MyCalcbutton Getlastinput(){
		return laasteinvoer;
	}
}
 
Laatst bewerkt:
OK,

Ken je misschien iemand die meer weet over vooral de methode MVC? Dit is voor mij nu heel belangrijk... Dank je!

dat is haarfijn uitgelegd in je vorige post door een member.

er zijn 2 manieren (en vast meer zoals mvc + observer pattern) om het MVC model toe te passen.

Na input van een gebruiker, geeft de view aan de controler door dat er input gewijzigd is. Deze verandering wordt dan "geset" in de model waarna de controller een seintje geeft aan de view dat de nieuwe data opgehaald moet worden.

een tweede mogelijkheid:

Na input van een gebruiker, geeft de view aan de controler door dat de input gewijzigt is. Deze input wordt vervolgens in de model "geset" waarna vanuit de model de view geupdate wordt.

kort gezegd: het mvc model zorgt er voor dat je je data, algoritmes en gui, van elkaar lostrekt. Het voordeel hiervan is het feit dat je makkelijk meerdere views kan maken die gebruik maken van dezelfde data. Voorbeeld: een grafiek (view1) en een taartdiagram (view 2).

voor de rest kan ik je toch echt aanraden wat research te doen op het internet. op wikipedia zijn vast hele makkelijke UML`s te vinden hoe het precies in elkaar zit.
 
mvc
model : hoe zal het eruitzien data
view : hoe zal de layout er uitzien
controler:de werkelijke verwerking

dan zal je mogelijks met jsp aan de slag gaan om te beginnen
java server pages
vervolgens zal je met session iet in de sessie steken
dan zal je iets meer willen
komt u uit bij st r u ts framework hierin zit zoiets verwerkt
let op web.xml
maar ik denk als je er nu nog moet aan beginnen er laat mee bent.
 
Laatst bewerkt:
mwah voor zo`n simpele opdracht is het een beetje overkill om jsp te gebruiken denk ik. Verder denk ik dat bij deze opdacht niet echt de bedoeling is de echte architectuur van het mvc model te gebruiken maar dat het voldoende is dat er een poging gedaan is de data van de view los te koppellen. Tenzij er uiteraard duidelijk informatie gegevens is over hoe het mvc model in elkaar steekt.
In ieder geval ik vrees wel voor je want een van je vragen was: als ik het mvc model toepas, is dit dan voldoende voor de opgave om het oop te doen. Ik vrees daarom dat je het concept van oop nog niet voldoende beheerst.
 
Beste sr,

Kun je misschien je code posten en zeggen waar er nog fouten / onduidelijkheden inzitten. Ook waar je nog hulp bij nodig hebt.

Met vriendelijke groet,
Bram
 
Je hoeft hiervoor geen observer, of obserable voor te maken. Tenminsten als ik het goed zie is er maar 1 view met 1 model? Observer/Observerable gebruik je alleen als er meerdere view op een model zijn. Zijn natuurlijk wel meer redens, maar in dit geval zou ik dat echt niet doen. Ik denk dat je bij een rekenmachine gewoon kan setten

gr MouNt
 
Je hebt gelijk Mount! Voor jouw argument vind ik ook wel wat te vinden, maar zelf vind ik het een mooiere en betere structuur indien je (in de toekomst) zaken wilt uitbreiden en/of verschillende views wilt aanpassen.

Met vriendelijke groet,
NewbiProgrammer
 
Laatst bewerkt:
Model => de effectieve list of data
View => Jcombo of whatever
controller=> Defaultlistmodel
 
http://balusc.blogspot.com/2007/01/generics.html
als je dit bekijkt

List<Integer> integers;
Maar je kan ook String of wat dan ook zijn Stel je maakt een decorator dan kan je ook de interface erinplaatsen en dan heb je gedecoreerde class erinzetten dus dan

heb je een linked list waar je verwijst na het object dus niet alles actief in het geheugen en je wanneer je een object pakt het kan bekijken en toch kan je de rugzak van JButton vullen met een Actionlistener maar die moet blijvend beschikbaar zijn
De actionlistener kan een apparte class zijn extends actionlistener
De actionlistener kan ook in een type gemaakt zijn maar dat is enkel voor examples op internet om iets aan te tonen Maar is niet bedoeld om life te gebruiken. als deze in apparte classe zijn kan je sneller werken omdat je snel door hebt wat er gebeurt.
 
Laatst bewerkt:
Staat er ook boven maar het duid aan dat als je een type maakt je minder code nodig hebt

Ik heb je eigen code gebruikt zodat je snel ziet wat ik verandert maar het is niet de bedoeling dat ik je werkje maak natuurlijk dus het is geen werkende editie Maar als je ergens stropt moet je het maar melden
 
Ik heb twee topics van je samengevoegd; het is niet zo netjes om er twee parallel te laten lopen.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan