java simpel rekenmachine

Status
Niet open voor verdere reacties.

ilsemoonens

Nieuwe gebruiker
Lid geworden
17 okt 2008
Berichten
2
Hallo,
ik heb geprobeerd om eens een simpel rekenmachine te maken (met buttons), maar ik zit vast bij het berekenen van de som en het verschil. Kan iemand mij soms helpen?

dit heb ik al:

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

public class Calculator extends JFrame
   implements ActionListener{

	private JButton button1, button2, button3, button4, button5, button6,button7,
	button8,button9, button0, buttonPlus, buttonMin, buttonGelijk, buttonClear ;
	private JTextField textField;
	private int x1, x2, x3, x4, x5, x6, x7, x8, x9, x0;
	private int getal1, getal2;


    public static void main (String[] args) {
        Calculator frame = new Calculator();
        frame.setSize(200,210);
        frame.createGUI();
        frame.show();

    }

    public void createGUI() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
		Container window = getContentPane();
		window.setLayout (new FlowLayout() );


		textField = new JTextField(" ",15);
        window.add(textField);

		button1 = new JButton("1");
		window.add(button1);
		button1.addActionListener(this);

  		button2 = new JButton("2");
		window.add(button2);
		button2.addActionListener(this);

		button3 = new JButton("3");
		window.add(button3);
		button3.addActionListener(this);

		buttonPlus = new JButton("+");
		window.add(buttonPlus);
		buttonPlus.addActionListener(this);

		button4 = new JButton("4");
		window.add(button4);
		button4.addActionListener(this);

		button5 = new JButton("5");
		window.add(button5);
		button5.addActionListener(this);

		button6 = new JButton("6");
		window.add(button6);
		button6.addActionListener(this);

		buttonMin = new JButton("-");
		window.add(buttonMin);
		buttonMin.addActionListener(this);

		button7 = new JButton("7");
		window.add(button7);
		button7.addActionListener(this);

		button8 = new JButton("8");
		window.add(button8);
		button8.addActionListener(this);

		button9 = new JButton("9");
		window.add(button9);
		button9.addActionListener(this);

		buttonGelijk = new JButton("=");
		window.add(buttonGelijk);
		buttonGelijk.addActionListener(this);

		button0 = new JButton("0");
		window.add(button0);
		button0.addActionListener(this);

		buttonClear = new JButton("clear");
		window.add(buttonClear);
		buttonClear.addActionListener(this);

    }


    public void actionPerformed(ActionEvent event) {

		Object source = event.getSource();



	if ( source == button1 )
	{
		textField.setText("1");
		x1 = 1;
		}
		else
	  	if (source == button2)
			{ textField.setText("2");
			  x2 = 2;
	 		 }

	 	else
		if (source == button3)
			{ textField.setText("3");
			  x3 = 3;
	 		 }

	 	else
	 	if (source == button4)
			{ textField.setText("4");
			  x4 = 4;
		 		 }

	 	else
	 	if (source == button5)
			{ textField.setText("5");
			  x5 = 5;
	 		 }

	 	else
	 	if (source == button6)
			{ textField.setText("6");
			  x6 = 6;
	 		 }

	 	else
	 	if (source == button7)
			{ textField.setText("7");
			  x7 = 7;
			}

		else
	 	if (source == button8)
			{ textField.setText("8");
			  x8 = 8;
	 		 }

		else
	 	if (source == button9)
			{ textField.setText("9");
			  x9 = 9;
	 		 }

		else
	 	if (source == button0)
			{ textField.setText("0");
			  x0 = 0;
	 		 }
	
            }

}


Alvast bedankt,
groetjes Ilse
 
Laatst bewerkt door een moderator:
Zo te zien heb je nog niet eens functies gemaakt voor som en verschil.

Wat je mogelijk kan doen.
Een Array maken waar je alle dingen in zet die uitgevoerd moeten worden.
Dus dan komt er bijvoorbeeld in te staan: {"1", "+", "2"}

Vervolgens maak je een functie die deze array doorloopt en daarmee dus de bewerkingen uitvoeren. Daar bijgevoegd een case/switch voor de bewerkingen van de operatoren. + - * /
 
Laatst bewerkt:
Yo Ilse!

Goed te zien dat er ook dames zijn die aan het programmeren slaan! Way to go girl! Het antwoord op je vraag was eigenlijk al gegeven, maar ik kan het toch niet laten nog even te reageren. Hieronder een paar codesnippets die misschien wel van pas kunnen komen. Beware, ik heb ze nog niet gecompiled, maar uit mijn hoofd ingetyped, dus er kunnen nog wel een paar foutjes inzitten.

Anyways, dit lijkt me een aardig zetje in je rug. Moet je nog wel zelf even de executeCalculation methode schrijven..... succes!

Greetz van
StringerBEE

Ps. vergeet je niet, dat wanneer een gebruiker twee cijfers typt, bijvoorbeeld '4' en '2', dat ie dan 42 bedoeld?

Code:
//als je gebruik maakt van de i-waarde, kun je de cijfer buttons helemaal
//dynamisch aanmaken :D
JButton[] numberButtons = new JButton[9];
for(int i = 0; i < numberButtons.length; i++){
    numberButtons[i] = new JButton(""+i+1);
    numberButtons[i].addActionListener(this);
    window.add(numberButtons[i]);
}



//zo voeg je gemakkelijk de operatorButtons toe
JButton[] operatorButtons = {
    new JButton("+"),
    new JButton("-"),
    new JButton("*"),
    new JButton("/"),
    new JButton("="),
}
//en een lusje voor het toevoegen van de actionlisteners
for(JButton operatorButton : operatorButtons){
    operatorButton.addActionListener(this);
    window.add(operatorButton);
}



//dit word dan je actionPerformed methode
Vector<String> parameters = new Vector<String>();
public void actionPerformed(ActionEvent e){
    if(e.getSource() == operatorButtons[4]){
        executeCalculation(parameters);
        parameters.clear();
    }else{
        parameters.add(e.getSource().getText());
    }
}
 
Laatst bewerkt:
Zo'n rekenmachine is moeilijker dan je denkt. Als je het tenminste echt goed wil doen.. :).

De invoer 4 - +2 is geldige invoer op een "echte" rekenmachine.. Maar als ik jou was zou ik simpel beginnen en en je daar (nog) niet druk overmaken..

Maar als de gebruiker "4 + 2 =" intypt moet het volgende doen:
4 -> zet 4 in scherm.
+ -> onthoud het getal in het scherm in variabele , leeg scherm en onthoud de operator "+" of "-".
2 -> zet 2 in het scherm
= -> Neem het getal in de variable en in je schem en bereken (je hebt operator onthouden!) zet de resultaat in het scherm.

Nu wat JAVA tips, in veel boeken zie je de truc om als actionListener voor je knoppen this te gebruiken. In de actionperformed moet je dan weer uitzoeken welke knop het nu was.. Ik zelf (en vele andere) vinden dit een lelijke oplossing.

De knoppen 1 t/m 9 doen bijna allemaal hetzelfde dus kan je daar een klasse voor maken:

Code:
public class DigitButton extends JButton implements ActionListener {
            final int digit; 
            
            public DigitButton(int digit) {
                super("" + digit); // trucje om het getal als een string te gebruiken..
                this.digit = digit;
                addActionListener(this);
            }
            
            public void actionPerformed(ActionEvent e) {
               invoer.setText(invoer.getText() + digit); //plakt het nieuwe getal aan het bestaande getal... 
            }
    }

met de volgende code maak je 9 buttons aan.

Code:
mainPanel.add(invoer);
        for (int i = 1 ; i<= 9 ; i++) {
            mainPanel.add(new DigitButton(i));
}

Het voordeel hiervan is dat de code van een knop bij elkaar blijft en je ook geen hele grote if else constructie krijgt..

Voor de functie + en - kan je een sortgelijke oplossing verzinnen. Maar je kan ook gewoon aparte actionListener aanmaken voor elke knop. De syntax van deze constructie ziet er een beetje vreemd uit, maar als je eenmaal aangewend ben.. zal je hem erg vaak gebruiken.

Code:
JButton minButton = new JButton("-");
mainPanel.add(minButton);
minButton.addActionListener(new ActionListener() {
       public void actionPerformed(ActionEvent e) {
       //hier de code voor je "-" toets...               
       }
});

Verder nog een tip. Je textfield heeft een getText functie om de tekst op te halen. Dit geeft echter een String terug om hier een int van te maken kan je gebruik maken van Integer.parseInt("123") dit geeft een int terug met 123...

succes..
 
Tja, ben het eigenlijk helemaal eens met bovenstaande posting van SkinFlower. De digitButton is misschien inderdaad een leuke toevoeging. Dat hoef je nu nog niet te implementeren, maar het is wel een leuke extra. Ziet je code er iets object-georienteerder uit.

in veel boeken zie je de truc om als actionListener voor je knoppen this te gebruiken. In de actionperformed moet je dan weer uitzoeken welke knop het nu was.. Ik zelf (en vele andere) vinden dit een lelijke oplossing.

Wat de actionPerformed betreft, ik weet niet of je die opmerking al begrijpt, het is best gevorderde java. Het gebruiken van grote hoeveelheden if-statements word doorgaans als lelijk beschouwd. Normaal gesproken ben ik het roerend eens met de good-habits en code-standards, maar hier wijk ik meestal af hoor. (En veeel programmeurs met mij).

Programmeurs zijn namelijk nogal luie mensen, en doen er alles voor om de code zo kort en overzichtelijk mogelijk te houden. Ze houden namelijk niet zo van typen. Een lijst met if-jes om af te toetsen welke knop een event gooide is minder typewerk, en al je actionlisteners staan overzichtelijk naast elkaar. Is dus ook wel wat voor te zeggen.

oh ja, en voor jou applicatie hoef je helemaal geen lijst met if-jes te gebruiken... kijk maar eens goed ;-)
 
Laatst bewerkt:
Java rekenmachine

Hallo allemaal,

Ik weet niet of ik hier nog mag reageren aangezien er bijna twee jaar geleden voor het laatst is op gereageerd. Toch heb ik nergens kunnen vinden of dit onderwerp is afgesloten. Jammer dat er niet te lezen is of dit vraagstuk opgelost is ondanks alle idee�n en suggesties. Voor mijn studie ben ik nu ook bezig met java en jawel ook ik maak een rekenmachine. Ik heb er al eens een gemaakt welke werkte maar niet geheel foutloos. Heb jullie adviezen en idee�n gelezen. Op het gebied van de knoppen aanmaken en plaatsen heb ik mijn code verfijnd. En hier gaat mijn vraag dan ook over.

Code:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class rekenmachineUpdate extends JFrame {
	protected static final String[] buttontext = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "+", "-", "*", "/",
			"wor", "kwa", "="};
	protected int x;
	protected JFrame frame;
	protected JPanel panel;
	protected JButton[] button; 
	protected JTextField tf;
	protected double invoerveld1;
	protected double invoerveld2;
	protected double resultaat;
	protected double knopwaarde;
	protected String strknopwaarde;	
	public void setup(){		
		tf = new JTextField(15);
		panel = new JPanel();
		panel.setPreferredSize(new Dimension(1200, 1200));
		
		for (x = 0; x <= buttontext.length; x++){
			button[x] = new JButton(buttontext[x]);        //hier nullpointer exeption
			button[x].addActionListener(new knoppen());
			panel.add(button[x]);
		}
		
		frame = new JFrame("Rekenmachine");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setSize(1300, 1300);
		frame.setVisible(true);
		frame.add(panel);		
	}
	
}

Het cre�ren van de buttons, het plaatsen van de buttons en aanmaken van actionlisteners wil ik in een lus realiseren. Hierbij worden de tekens die op de knoppen komen te staan uit de string buttontext gehaald.
Volgens mij moet het zo willen werken, heb mijn cursusboek er nog op na geslagen maar geen fout kunnen vinden. Toch krijg ik bij het runnen van mijn code het bericht: Exception in thread "main" java.lang.NullPointerException, en stopt het programma bij deze regel waar //hier nullpointer exeption achter staat.

Wie weet wat er hier fout is gegaan? heb ik toch nog iets gemist?

De actionPerformed method staat in een eigen class knoppen. Waar de functies van de knoppen zijn geprogrammeerd. De class extends class rekenmachineUpdate.
De bewerkingen plus min enzovoort word ook in een eigen class uitgevoerd die bewerking heet. De class extends ook rekenmachineUpdate. Wanneer deze code nog van belang is voor het antwoord of als iemand deze wil zien voor ideeen dan hoor ik het graag.

Een leuke uitdaging dacht ik zo, en ik ben benieuwd naar jullie reacties en antwoorden.
tips trucs en suggesties zijn altijd welkom.

Groetjes Simon.
 
Laatst bewerkt door een moderator:
@ Simon R,

Welkom op Helpmij.nl.:)

Topics van 2008 mogen met rust gelaten worden, deze zijn niet actueel meer. Daarbij is het hier niet toegestaan mee te liften in iemand zijn/har topic. Graag een eigen topic aanmaken.

Ik sluit deze nu.
slotje.gif
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan