# Taschenrechner



## Mr.Mase (26. Jan 2014)

Hey,

ich muss für die Schule einen simplen Taschenrechner erstellen. 
Voraussetzung: das ganze muss in Startklasse und Fachklasse getrennt sein.

Das alles ist ja eig. kein Problem aber beim Tastenfeld komm ich nicht weiter.
Hab die Oberfläche des Taschenrechners in Eclipse mal erstellt.

Bis hier her klappt alles aber wie mach ich es mit dem Tastenfeld hab ja 10 Tasten 0-9 

muss ich jetzt auch 10 ActionListener schreiben oder geht das irgendwie einfacher ? 

Ich bitte um Hilfe, bin jetzt zwar kein Profi was JAVA anbelangt aber es macht mir Spaß damit zu arbeiten.

Gruß Mr.Mase


----------



## Gucky (26. Jan 2014)

Ja. Da du 10 Buttons hast, musst du auch pro Button je einen Listener haben. Sonst würde jeder Button dasselbe tun.


----------



## kaoZ (26. Jan 2014)

Du kannst auch einfach einen Listener implementieren, den einzelnen Buttons weist du dann sogenannte 
	
	
	
	





```
Action Commands
```
 zu , welche du später in der 
	
	
	
	





```
actionPerformed();
```
 methode z.B mit einem Switch abrufen könntest


```
Button one = new Button("+");
one.setActionCommand("PLUS");

public class Foo implements ActionListener{

...

@Override
public void actionPerformed(ActionEvent event)

switch(event.getActionCommand()){

case "PLUS":
  // do stuff
break;

usw...

}
}
```

natürlich ginge auch ein abruf über 
	
	
	
	





```
event.getSource()
```
 was ich allerdings für unschön halte


----------



## dzim (26. Jan 2014)

Cool, ich wusste gar nicht, dass es so was gibt in Swing... Gibt's das auch noch in JavaFX?


----------



## Mr.Mase (26. Jan 2014)

Hey,

vielen Dank für die hilfreichen Antworten .

Dann mach ich mich mal an die Arbeit

Gruß 

Mr.Mase


----------



## kaoZ (27. Jan 2014)

dzim hat gesagt.:


> Cool, ich wusste gar nicht, dass es so was gibt in Swing... Gibt's das auch noch in JavaFX?




Also in Swing funktioniert das ohne Probleme, verwende ich selber von Zeit zu Zeit, ob es in JavaFX auch funktioniert kann ich dir leider nicht beantworten dazu habe ich mich noch zu wenig damit beschäftigt 

Hier ein schnell zusammgezimmerstes KSKB:



Spoiler: ActionCommand Test





```
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;


public class Foo extends JFrame implements ActionListener{

	JButton btn;
	
	public Foo() {
		super("Testfenster");
		setSize(500,300);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setLocationRelativeTo(null);
		
		btn = new JButton("Klick mich");
		btn.addActionListener(this);
		btn.setActionCommand("Wuhu"); // Action Command für den Button erstellen.
		
		add(btn);
		
		setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent event) {
		
		switch(event.getActionCommand()){
		case "Wuhu":
			btn.setBackground(Color.CYAN);
			btn.setText("Der Wahnsinn !");
		
			break;
		}
		
	}	
	
	public static void main(String[] args) {
		
		new Foo();
	}
}
```


----------



## dzim (28. Jan 2014)

Ich hab gestern mal geschaut und nein, es ist nicht in der API enthalten. Schade, aber auch nicht so schlimm, da ich eh primär FXML verwende und die Handler für jedes Control-Widget eh per annotierter Methode bereit stelle.


----------



## Mr.Mase (7. Feb 2014)

Bin mit meinem Projekt etwas weitergekommen.

Hab aber doch noch einmal eine Frage:

Mein Taschenrechner ist aufgeteilt in Fachklasse und Startklasse, die Eingabe von Zahlen in der GUI klappt soweit, doch wie übergebe ich nun am dümmsten meine Rechnung in die Fachklasse zum rechnen ?

Gruß 

Mr.Mase


----------



## JavaMeister (7. Feb 2014)

Über eine referenz?


----------



## Gucky (7. Feb 2014)

Du müsstest dich entscheiden, ob die Methoden zum Rechnen statisch sind, oder nicht.
Dementsprechend müsstest du die Werte übergeben.


----------



## JavaMeister (7. Feb 2014)

> Du müsstest dich entscheiden, ob die Methoden zum Rechnen statisch sind, oder nicht.



Glaube nicht, dass das die Entscheidung ist.


----------



## Gucky (8. Feb 2014)

Wie meinst du das? Er hat gefragt, wie er seine Rechnung in die Fachklassebekommt. Aber dazu müsste er sich erst entscheiden, ob die Methoden statisch sein sollen oder nicht. Statisch wäre mein Favourit. Da gibt es einen, zwar nicht besonders großen, aber dennoch vorhandenen Unterschied.


----------



## JavaMeister (8. Feb 2014)

Gehen wir kurz davon aus, dass es hierfür relevant wäre. Dann würde sich in einer objektorientierten Sprache eher diese Frage nicht stellen. Weiterhin schreibt der TO,d ass er eine Fachklasse und eine GUI klasse hat. Mit größter Wahrscheinlichkeit hat er dies nicht statisch implementiert.

---

Es ist hier aber nicht relevant, weil egal ob statisch oder nicht statisch in beiden Fällen der Wert einfach über eine Referenz übergeben werden kann oder abgeholt werden kann.

---

@TO: Du kannst auf keinen Fall eine konkrete Antwort erhalten, da wir keinen COde haben.


----------



## Mr.Mase (8. Feb 2014)

Hey,

schon mal danke für die Antworten.

ich geb über die Buttons  Zahl für Zahl ein, die Zwölf wird dann z.B aus einer Eins un einer Zwei zusammengefügt. 
Dann kommt das entsprechende Operationszeichen und die nächste Zahl. 

eig. ist das ja dann eine Zeichenkette doch wie übergebe ich diese ? 
Meine Idee war: 


```
r1.rechnung(Double.parseDouble(txtrDisplay.getText()));
			txtrDisplay.setText(Double.toString(r1.getErgebnis()));
```

Gruß Mr.Mase


----------



## JavaMeister (8. Feb 2014)

Die idee ist doch korrekt.

:bahnhof:


----------



## derSoerrn (8. Feb 2014)

Ich weiß ja nicht genau wie du den Taschenrechner programmierst hast, aber ich würde den String noch darauf überprüfen, ob er z.B. "++" enthält o.ä., da sonst das Programm mMn abstürzen würde.


----------



## Gucky (9. Feb 2014)

BTW halte ich es für besser, wenn du deine Rechnungsmethode den Wert zurückgeben lässt. Damit sparst du dir eine Zeile Code und eine Variable.

Hast du deinen Rechner DAU sicher gemacht? Wenn jemand etwas eingibt, was nicht als double interpretierbar ist, fliegt eine Exception, was unbehandelt zu nervigen Problemen führen kann. Also entweder du fängst die Exception ab oder du sorgst dafür, dass nur passende Zeichen im Feld stehen, was aufwändiger ist, ich aber für die bessere Lösung halte. Guck dir dazu mal die Regex an.


----------



## Mr.Mase (11. Feb 2014)

Hey,

ich hab mich jetzt mal mit den Kleinigkeiten wie Sinus, Cosinus, Tangens, Wurzel...... beschäftigt.

Mit dem Rechnen komm ich leider immer noch nicht weiter....;(
Ich glaube ich denke einfach mal wieder zu kompliziert..


Die Idee mit der Exception ist gut das wird zum Schluss umgesetzt. :toll:

Ich kann durch meine Idee zwar die Rechnung übergeben aber als Ergebnis liefert der Taschenrechner 0.0. Habt ihr noch ne Idee was ich falsch mach ? 
Der Code in der GUI:

```
r1.rechnung(Double.parseDouble(txtrDisplay.getText()));
         r1.rechnung();
         txtrDisplay.setText(Double.toString(r1.getErgebnis()));
```

Der Code in der Fachklasse:

```
ergebnis = Double.parseDouble(getRechnung());
```

Gruß Mr.Mase


----------



## Gucky (11. Feb 2014)

Hast du schon mal debuggt? Guck mal mit Sysouts oder dem Debugger nach, ob die Rechnungswerte überhaupt ankommen und ab wann 0.0 in der Variable steht ubd vollzieh mal alle Schritte nach.


----------



## Mr.Mase (11. Feb 2014)

Hey,

hab jetzt mal alles als String übergeben, das funktioniert aber sobald ich es als Double parse kommt 0.0....


Gruß

Mr.Mase


----------



## Gucky (11. Feb 2014)

Also im String steht der korrekte Wert, ohne irgendwelche anderen Zeichen. Nur Ziffern und ein Punkt maximal?


----------



## Mr.Mase (12. Feb 2014)

Als Beispiel:

ich geb 4 + 5 =  in den Taschenrechner ein, dieser String wird dann auch übergeben.

Gruß 

Mr.Mase


----------

