ActionListener abwarten lassen?

Extremefall

Bekanntes Mitglied
Hallo,
ich habe einen Stack A und ein paar Buttons mit Operanden.
Nun soll bei Klick auf den Button der Operand auf den Stack A gelegt werden. Auf Stack B gibt es Operatoren. Wenn nun ein Button gedrückt wird, so wird der Operator auf Stack B gelegt. Nun habe ich folgendes Problem: Die Buttons gehen von 1-9. Wenn ich nun auf den Operandenbutton klicke, wird es auf Stack A gelegt. Nur wie kann ich jetzt mehrstellige Zahlen akzeptieren? Da muss ja gewartet werden, bis ein Operator gedrückt wird. Wie löse ich es am besten? Mit einer Schleife oder wie ist so etwas möglich?
 
willst du einen taschenrechner programmieren? musst du es mit stacks machen?

eine Möglichkeit wäre erstmal jeden Operand (edit: bzw jede Ziffer - der gesamte StringBuilder entspricht dann dem Operanden) in einem StringBuilder zwischenzuspeichern. Wenn dann ein Operator gedrückt wird, legst du sowohl den StringBuilder in Stack A als auch den Operator in Stack B.

Andere Möglichkeit wäre es gleich anders zu machen 🙂
 
Zuletzt bearbeitet:
Soweit so gut, aber ich muss es dann noch nach String casten. Wenn ich die Methode toString() verwende, klappt es leider nicht, da ich es dann von String in int casten muss. Wie kann man daa Problem lösen? Also muss ich den Stringbuilder, den ich dem Stack übergeben habe, irgendwie in einen int casten. Geht das und wenn ja, wie?
 
Zuletzt bearbeitet:
Danke 🙂 Nun wäre das Problem allerdings, dass die Methode nicht weiß, dass es sich um einen Integer handelt. Die denkt immer noch, es ist ein Object. Deswegen kann ich auch nicht schreiben:

int operandi = KlasseA.operand.top();
bzw. es casten:
int operandi = (int) KlasseA.operand.top();

Es sollte so ungefähr aussehen:
int operand1 = KlasseA.operand.top();
KlasseA.operanden.pop();
int operand2 = (int) KlasseA.operand.top();
String operator (String) KlasseA.operator.top();
KlasseA.operator.pop();
 
Zuletzt bearbeitet:
Java:
public void gebezwischenresultat(){
		String operand1 = (String) operanden.top();
		operanden.pop();
		String operand2 = (String) operanden.top();
		operanden.pop();
		String operator = (String) operatoren.top();
		operatoren.pop();
		int operand1integer = Integer.parseInt(operand1); 
		int operand2integer = Integer.parseInt(operand2);
		...
	}
	
	public void actionPerformed(ActionEvent e) {
	...
if (e.getSource()==multiplizieren){
	...
operanden.push(Integer.parseInt(operandenstrings.toString()));
	sizeoperanden++;
	operandenstrings.setLength(0);
	if (operatoren.isEmpty()){
		operatoren.push("*");
	}
	else {
		checkoperator("*",operatoren.top());
		System.out.println(""+operatorstand);
		if(operatorstand == "Hoeherwertig"){
			operatoren.push("*");
		}
		else if (operatorstand == "Gleichwertig"){
				if (sizeoperanden >=2){
					gebezwischenresultat();
				System.out.println(zwischenergebnis);
				}
				}
	}
	}
operandenstrings ist der StringBuilder und operantoren und operanden sind die Stacks.

Das ist der wichtige Code.
 
Zuletzt bearbeitet:
Also meine Absicht in der Methode zum rechnen ist folgende:
Der Operator wird über die Parameter geliefert.

Nur wie kann ich vom operandenstack den ersten und zweiten Operanden von oben nehmen, ihn in einer Variable zu speichern? Das Problem ist nämlich, dass der StringBuder schon ein Integer ist und ich somit nicht mehr fasten muss. Trotzdem funktioniert int als Variable nicht, da der Stack als Parameter Object hat.
 
Ein StringBuilder ist niemals ein Integer, er ist ein StringBuilder. Und auch durch casten wird er nicht zu einem Integer, es fliegt stattdessen eine ClassCastException (eben weil ein StringBuilder niemals ein Integer, sondern ein StringBuilder ist).

Entweder hast du dich nur unklar ausgedrückt, oder dein Gehirn befindet sich in einem Zustand tiefster Konfusion.
 
Zuletzt bearbeitet:
Ich verstehe das aktuelle Problem nicht. Wenn du Integer hast, kannst du damit rechnen (oder sie sogar auf den Stack packen). Bei welcher Zeile genau hängst du?
 
Das ist klar. Ich brauche nur für einen TR auch zweistellige Zahlen. Bisher hatte ich die Zahlen 1-9 als Buttons und bei einem Klick auf den Operandenstack gelegt. Allerdings muss man ja auch zweistellige Zahlen registrieren, so habe ich einen StringBuilder genommen, den immer bei einem Klick ergänzt, bis ein Operator geklickt wurde und dann den StringBuilder auf den Stack gelegt. Nun hänge ich bei folgendem Schritt: Wenn der zweite Operator niedriger oder gleichwertig ist, soll gerechnet werden. Dazu wird der erste und zweite operand von oben genommen und der operator ist der erste von oben vom Stapel. Nun müsste es wie folgt sein:

operanden.top();
operanden.pop();
operanden.top();
operanden.pop();
operatoren.top();
operatoren.pop();

Nun würde ich diese Werte gerne in Variablen speichern und damit rechnen. Da hänge ich fest.
 

Neue Themen


Zurück
Oben