Taschenrechner-GUI, Hilfe bei der calculate-MEthode!!

thomasjung1

Grünschnabel
Hallo,
ich habe die Aufgabe einen Taschenrechner zu programmieren.
Die Oberfläche habe ich hingekriegt. Bin aber leider bei der Kalkulation der Zahlen hängen geblieben. Hier das, was ich bisher programmiert habe. Es wäre super nett, wenn mir jemand zeigen bzw. schreiben könnte, wo mein Fehler liegt:(
Danke im Vorraus.

Java:
/** @author Thomas Jung
 * @date 19.08.2009
 * @description
 */
package de.ifw.swe;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class Taschenrechner {

	
	
	private JPanel buttonPanel;
	private JTextField display;
	
	public static void main(String[] args) {
		new Taschenrechner();
	}

	
	public Taschenrechner(){
		initGUI();
	}
	
	private void initGUI() {
		
		JPanel displayPanel = new JPanel();
		JFrame frame = new JFrame("Taschenrechner");
		
		displayPanel.setLayout(new BorderLayout());
		display = new JTextField();
		display.setHorizontalAlignment(JTextField.RIGHT);
		
		displayPanel.add(display, BorderLayout.NORTH);
		
		buttonPanel = new JPanel();
		buttonPanel.setLayout(new GridLayout(4,4));
		
		addButton("7", new InsertAction());
		addButton("8", new InsertAction());
		addButton("9", new InsertAction());
		addButton("/", new CommandAction());
		
		addButton("4", new InsertAction());
		addButton("5", new InsertAction());
		addButton("6", new InsertAction());
		addButton("*", new CommandAction());
		
		addButton("1", new InsertAction());
		addButton("2", new InsertAction());
		addButton("3", new InsertAction());
		addButton("-", new CommandAction());
		
		addButton("0", new InsertAction());
		addButton(".", new InsertAction());
		addButton("=", new CommandAction());
		addButton("+", new CommandAction());
		
		displayPanel.add(buttonPanel);
		
		frame.add(displayPanel);
		frame.setVisible(true);
		frame.addWindowListener(new WindowClosingAdapter());
		
		frame.pack();
	}
		
		private void addButton(String _name , ActionListener _actionListener){
			
			JButton jButton = new JButton(_name);
			jButton.addActionListener(_actionListener);
			buttonPanel.add(jButton);
		}
		
		class InsertAction implements ActionListener{
			
			
			public void actionPerformed(ActionEvent _event) {
			String input = _event.getActionCommand();
			display.setText(display.getText()+ input);
				
			}
		}
		
		
		class CommandAction implements ActionListener{

			
			public void actionPerformed(ActionEvent _event) {
				calculate(_event.getActionCommand());
				
			}

			
			private void calculate( String _command) {
				
					
								
				if(_command.equals("+")){
					
					String tmp =  display.getText() +_command;
					System.out.println(tmp + "--> erste eingegebene Zahl");
					
					//System.out.println(_command+ " --> gedrückter Operator");
					
					display.setText(null);
					double wert1 = Double.parseDouble(tmp);
					
					String tmp2 = display.getText();
					System.out.println(tmp2);
					
					double wert2 = Double.parseDouble(tmp2);
					
					double ergebnis = wert1 + wert2;
					
					//double wert = Double.parseDouble(ergebnis);
					
					System.out.println(ergebnis);
					
					
		}
		
	}
		
	}
}
 
Zuletzt bearbeitet von einem Moderator:
So hmm... Sieht ja schonmal ganz gut aus. Nur tuts noch nichts ;)

Also ich würde es so machen:
Sobald eine CommandAction auftritt, parst du das was im inputText steht in eine Zahl und merkst dir diese in einem Feld (lastNumber oder so). In einem weiteren Feld merkst du dir die Aktion die durchgeführt werden soll (vorzugsweise als Enum). Bei der nächsten CommandAction schaust du dann ob es schon eine Zahl und eine Action gibt. Ist dies der Fall liest du die aktuelle Zahl ein und führst mit der vorherigen Zahl die gemerkte Aktion durch und schreibst das Ergebnis in die Ausgabe.
 
Erstmal danke für die schnelle Antwort.
Das Problem ist, dass ich nachvollziehen kann, was du schreibst.JEDOCH kann ich es nicht anwenden. Könntest du mir das vielleicht in Code schreiben. ICh hoffe, das ist jetzt nicht zu viel verlangt:-(
 
Doch das ist zu viel verlangt. Du sollst es ja lernen, ich kann das schon ;)

Womit hast du denn Probleme? Das wichtigste mit dem parsen der Zahl hast du ja schon umgesetzt. Sich das zu merken und mit if wieder abzufragen ist ja nicht so schwierig. Nen großen Trick gibts da nicht.
 
Ja, du hast Recht.

Dann versuche ich es folgender Weise. ICh erkläre idr, was ich vorhabe und du könntest mir ja dann sagen, wo mein Denkfehler ist..



private void calculate( double _wert) {

if(_command.equals("+")){

// ALs Erstes soll er sich die eingegebene Zahl merken und ausgeben(die Ausgabe mache ich jetz einfach so)
String tmp = display.getText();
System.out.println(tmp + "--> erste eingegebene Zahl");

//Danach soll er mir mein + ausgeben
String plus =_command ;
System.out.println(_command+ " --> gedrückter Operator");
//Die eingegebene Zahl und den Operator soll er sich merken
String merke= tmp +plus;
//Um die nächste Zahl eingeben zu können,setze ich meine Textfeld auf null
display.setText(null);
//Gebe nun die zweite Zahl ein
String tmp2 = display.getText();
// PArse danach die erste eingegebeneZahl inkl dem Operator
double wert1 = Double.parseDouble(merke);
//Parse die zweite eingegebene Zahl
double wert2 = Double.parseDouble(tmp2);
//Addiere beide Zahlen und gebe es aus
double ergebnis = wert1 + wert2;
System.out.println(ergebnis);

Was mache ich wo falsch? So komme ich weiter, wenn du mir nur Denkanregungen gibst..;)




}






}
 
Code:
//Die eingegebene Zahl und den Operator soll er sich merken
String merke= tmp +plus;
<---funktioniert so nicht, weglassen

das :
Code:
String plus =_command ;
Kannst du auch weglassen lass es bei _command.

Dann das textfeld auf null setzten ist richtig.


Code:
double wert1 = Double.parseDouble(merke);
//Parse die zweite eingegebene Zahl
double wert2 = Double.parseDouble(tmp2);

parsen auch richtig
Jetzt hast du beide zahlen in wert1 und wert 2 stehen.
jetzt brauchs tdu ne If abfrage.
Schauen ob das '_command' gleich ist mit "+" oder gleich ist mit "-"
wenn gleich mit +
machst du:
Code:
//Addiere beide Zahlen und gebe es aus
double ergebnis = wert1 + wert2;
sonst bei - isses
Code:
double ergebnis = wert1 - wert2;


EDIT: Aso ich seh gerade du hast oben schon geprüft ob es plus ist, dann brauchst du das am Ende wie ich es geschrieben hab, natürlich nicht mehr machen.
Ein anderes Problem ist, das du in die calculate methode reinkommst, sobald du auf zB. plus drückst, dann hast du die erste zahl speicherst sie in 'double wert1', innerhalb der if- Abfrage. Dann gibst du eine 2. Zahl ein, beim drücken auf das gleichheitszeichen kommst du wieder in die Calculate, aber was passiert dann? Dafür gibts keine If abfrage, zudem kommt das in der else if abfrage dann dein double wert1 nicht mehr bekannt ist
 
Zuletzt bearbeitet:
ICh habe es nun folgendermaßen gemacht:


private void calculate(String _command) {

Double zahl1 =Double.parseDouble(display.getText());
display.setText(null);
Double zahl2 =Double.parseDouble(display.getText());
if (_command.equals("+")) {
double ergebnis = zahl1+zahl2;
System.out.println(ergebnis);
}

Ich komme trotzdem nicht weiter Bin am verzweifeln. Bitte um weitere Hilfe!:(
 
Ja wie gesagt, das Problem ist, er kommt da bei einem druck auf plus oder bei einem druck auf dem gleichheitszeichen rein.

Beim druck auf plus kommt er dann rein
display get text <- zb 5
display.setText(null); <-- display set text null
diplay get text <-- steht auf null, also null
if command. equals +
ergebnis = 5 + null
 
Probier erstmal das wenn du in die calculate methode kommst, die Yahl auszugeben die er eingegeben hat, und das command dazu. Die zahl speicherst du dann in einer globalen variable.
 

Neue Beiträge

Zurück