Grafischen Taschenrechner programmieren - Frage dazu

Jack159

Bekanntes Mitglied
Ich bin gerade dabei einen simplen Taschenrechner zu programmieren.
Erstmal will ich nur einen abgespeckten Taschenrechner programmieren:

http://img208.imageshack.us/img208/3479/taschnrechner.jpg

Ziel soll sein, dass ich auf die "1" klicke, dann auf "+", dann auf die "2" und dann auf "=".
Wenn ich jetzt die 1 anklicke, soll "1" im Textfeld stehen. Klicke ich danach + an, soll dann "1+" im Textfeld stehen. Klicke ich die 2 an, soll dann "1+2" im Textfeld stehen. Beim Klick auf = soll dann das der Inhalt des Textfeldes gelöscht werden und stattdessen das Ergebniss dort ausgegeben werden.

Mein Problem ist nur, dass ich nicht weiß, wie ich dem Textfeld mehr als 1 Sache hinzufügen kann.
Wenn ich also die 1 anklicke, steht dann 1 im Textfeld. Wenn ich jetzt + anklicke, soll 1+ im Textfeld stehen. Die 1 soll also nicht überschrieben werden. Wie genau mache ich das?
 
Java:
Textfeld.getText() += "Neuer Text"

Damit zeigt der mir einen Fehler an.

Ich habs jetzt zumindest erstmal hinbekommen, dass wenn ich auf 1 klicke, 1 in dem Textfeld erscheint.
Klicke ich danach aber z.b. auf 2, verschwindet die 1 wieder aus dem Textfeld und es steht nur die 2 da.

Hier mal mein Code

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;


public class NullLayout  {

	JButton button1;
	JButton button2;
	JButton buttonPlus;
	JButton buttonGleich;
	JTextField field;
	
	String x;
	
	
	
	public static void main (String[] args) {
		NullLayout gui = new NullLayout();
		gui.los();
		
	}
	
	
	public void los() {
		
		JFrame frame = new JFrame();
		button1 = new JButton("1");
		button2 = new JButton("2");
		buttonPlus = new JButton("+");
		buttonGleich = new JButton("=");
		field = new JTextField(20);
		
		
		button1.addActionListener(new button1Listener());
		button2.addActionListener(new button2Listener());
		buttonPlus.addActionListener(new buttonPlusListener());
		
		
		
		frame.setSize(600,600);
		frame.setVisible(true);
		frame.setLayout(null);
		
		
		frame.add(button1);
		button1.setBounds(50,250,100,100);
		frame.add(button2);
		button2.setBounds(200,250,100,100);
		frame.add(buttonPlus);
		buttonPlus.setBounds(350,250,100,100);
		frame.add(buttonGleich);
		buttonGleich.setBounds(350,400,100,100);
		
		frame.add(field);
		field.setBounds(100,100,300,25);

		
}
	
	class button1Listener implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			field.setText("1");
			
		}
	}
	
	class button2Listener implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			field.setText("2");
			
		}
	}
	
	class buttonPlusListener implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			field.setText("+");
			
		}
	}
	

}
 
Java:
field.setText(field.getText() + "neuer Text");

Damit funktioniert es soweit.
Mein jetztiges Problem ist, dass ich dann den Ausdruck z.b. "1+2" irgendwie nicht ausgerechnet bekomme. Mein Ansatz war, erstmal den String "1+2" in einen int umzuwandeln, damit der Ausdruck "1+2" im int ausgerechnet wird (was ja 3 ergibt). Danach wird der int wieder in einen String umgewandelt und an das textfeld übergeben.
Funktioniert aber irgendwie nicht. Wenn ich auf "=" klicke, zeigt er mir immer 0 an.
Hier mein überarbeiteter Code:

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;




public class NullLayout  {

	JButton button1;
	JButton button2;
	JButton buttonPlus;
	JButton buttonGleich;
	JTextField field;
	
	
	String x;
	
	
	
	public static void main (String[] args) {
		NullLayout gui = new NullLayout();
		gui.los();
		
	}
	
	
	public void los() {
		
		JFrame frame = new JFrame();
		button1 = new JButton("1");
		button2 = new JButton("2");
		buttonPlus = new JButton("+");
		buttonGleich = new JButton("=");
		field = new JTextField(20);
		
		
		
		button1.addActionListener(new button1Listener());
		button2.addActionListener(new button2Listener());
		buttonPlus.addActionListener(new buttonPlusListener());
		buttonGleich.addActionListener(new buttonGleichListener());
		
		
		
		
		frame.setSize(600,600);
		frame.setVisible(true);
		frame.setLayout(null);
		
		
		frame.add(button1);
		button1.setBounds(50,250,100,100);
		frame.add(button2);
		button2.setBounds(200,250,100,100);
		frame.add(buttonPlus);
		buttonPlus.setBounds(350,250,100,100);
		frame.add(buttonGleich);
		buttonGleich.setBounds(350,400,100,100);
		
		frame.add(field);
		field.setBounds(100,100,300,25);

		
}
	
	class button1Listener implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			field.setText(field.getText() + "1");
			
		}
	}
	
	class button2Listener implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			field.setText(field.getText() + "2");
			
		}
	}
	
	class buttonPlusListener implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			field.setText(field.getText() + "+");
			
		}
	}
	
	class buttonGleichListener implements ActionListener {
		
		public void actionPerformed(ActionEvent event) {
			String text = field.getText();
			int ergebniss = 0;
			
			try {
				ergebniss = Integer.parseInt (text);
				} catch (Exception E){
					
				}
			
				String textErgebniss = Integer.toString(ergebniss);
				field.setText(textErgebniss);
		}
	}
	
	



}
 
Zuletzt bearbeitet:
Damit funktioniert es soweit.
Mein jetztiges Problem ist, dass ich dann den Ausdruck z.b. "1+2" irgendwie nicht ausgerechnet bekomme.

ROTFL!!1!!einself!!!

Sorry, aber ein String ist ein String ist ein String - und kein int. Für Solche Probleme gibt es prinzipiell zwei Herangehensweisen: Die Formel selbst zerlegen und ausrechnen (hier schwirrt irgendwo der Code von Beni für einen Formelparser herum) oder eine dynamische Sprache wie JavaScript aufrufen (was mit der ScriptEngine geht) und den Code ausrechnen lassen. Such mal im Forum, du bist wirklich nicht der Erste, der das machen will.
 
Du meinst beim simplen casten von String zu Int erkennt Java, dass es sich um eine Rechenoperation mit 2 Integern und einem Rechenzeichen handelt und interpretiert das auch noch richtig?

Wenn du String x = "1" + "2" schreibst kommt "12" raus
 
Dann funktioniert das wohl doch nicht so, wie ich mir das gedacht habe.
Ich habe mir jetzt mal diesen Formel-Parser angeschaut. Das ganze ist wohl doch etwas komplizierter als ich zunächst dachte^^
 
Naja Landei hatte dir ja bereits noch eine Möglichkeit aufgezählt:
Java:
import javax.script.*;


		ScriptEngine engine = new ScriptEngineManager().getEngineByName( "JavaScript" );
		double x = (Double) engine.eval( "1+2" ); //3.0
 
Java:
int x (x = ist die Variabel, in der dann das Int gespeichert wird) = Integer.valueOf(HIER DEINE STRING VARIABEL).intValue();

Das machst du dann mit deinen 2 Variabeln, danach kannst du sie ganz einfach zusammenrechnen z.B. so:

Java:
ergebnisZahl = x + deineZweiteVariabel;

Das Ergebnis wird dann einfach in ergebnisZahl gespeichert.

MfG,
Ghorki
 
So - konstruktiver Vorschlag meinerseits :

Nebenbei - kann die Methode toString für den Operator in den enum gepflanzt werden?
Gefällt mir nicht so.

Es gefällt mir auch sonst einiges nicht so, aber ich bleib mal so nahe wie möglich an der Vorgabe ...

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

public class Taschenrechner2  {

	private enum Operator {
		keiner, plus, minus, mal, durch
	}

	private String toString ( Operator op) {
		switch (op) {
		case plus: return "+";
		case minus: return "-";
		case mal: return "*";
		case durch: return "/";
		default: return "";
		}
	}

	private JButton button1;
	private JButton button2;
	private JButton buttonPlus;
	private JButton buttonGleich;
	private JTextField field;

	private int lValue = 0;
	private int rValue = 0;
	private boolean lValueIsResult = false;
	private Operator lastOperator = Operator.keiner;

	public static void main (String[] args) {
		Taschenrechner2 gui = new Taschenrechner2();
		gui.los();
	}

	public void los() {
		JFrame frame = new JFrame();
		button1 = new JButton("1");
		button2 = new JButton("2");
		buttonPlus = new JButton("+");
		buttonGleich = new JButton("=");
		field = new JTextField(20);

		button1.addActionListener(new button1Listener());
		button2.addActionListener(new button2Listener());
		buttonPlus.addActionListener(new buttonPlusListener());
		buttonGleich.addActionListener(new buttonGleichListener());

		frame.setSize(600,600);
		frame.setVisible(true);
		frame.setLayout(null);

		frame.add(button1);
		button1.setBounds(50,250,100,100);
		frame.add(button2);
		button2.setBounds(200,250,100,100);
		frame.add(buttonPlus);
		buttonPlus.setBounds(350,250,100,100);
		frame.add(buttonGleich);
		buttonGleich.setBounds(350,400,100,100);

		frame.add(field);
		field.setBounds(100,100,300,25);
	}

	private String generateDisplayString() {
		if (lastOperator==Operator.keiner)
			return ""+lValue;
		else if (rValue==0)
			return lValue + toString(lastOperator);
		else
			return lValue + toString(lastOperator) + rValue;
	}

	private void calculate() {
		if (lastOperator!=Operator.keiner) {
			switch (lastOperator) {
			case plus: lValue = lValue + rValue; break;
			case minus: lValue = lValue - rValue; break;
			case mal: lValue = lValue * rValue; break;
			case durch: lValue = lValue / rValue; break;
			}
			lastOperator = Operator.keiner;
			rValue = 0;
			lValueIsResult = true;
		}
	}

	private class button1Listener implements ActionListener {

		public void actionPerformed(ActionEvent event) {
			if (lastOperator==Operator.keiner) {
				if (lValueIsResult) {
					lValue = 1;
					lValueIsResult = false;
				} else {
					lValue = lValue*10+1;
				}
			} else {
				rValue = rValue*10+1;
			}
			field.setText(generateDisplayString());
		}
	}

	private class button2Listener implements ActionListener {

		public void actionPerformed(ActionEvent event) {
			if (lastOperator==Operator.keiner) {
				if (lValueIsResult) {
					lValue = 2;
					lValueIsResult = false;
				} else {
					lValue = lValue*10+2;
				}
				
			} else {
				rValue = rValue*10+2;
			}
			field.setText(generateDisplayString());
		}
	}

	private class buttonPlusListener implements ActionListener {

		public void actionPerformed(ActionEvent event) {
			if (lastOperator!=Operator.keiner)
				calculate();
			lastOperator = Operator.plus;
			field.setText(generateDisplayString());
		}
	}

	private class buttonGleichListener implements ActionListener {

		public void actionPerformed(ActionEvent event) {
			if (rValue != 0)
				calculate();
			field.setText(generateDisplayString());
		}
	}
}
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben