Stack-Operationen

Status
Nicht offen für weitere Antworten.

Sindbad1983

Top Contributor
Hi!

Folgendes Problem:

Eine Stack-Maschine soll erlauben, beliebig viele double-Zahlen auf den Stack zu legen (Operation push). Weiters definiert die Stack-Maschine die Operationen Addition, Subtraktion, Multiplikation und Division, die jeweils die zwei obersten Zahlen vom Stack nehmen, mit diesen Zahlen die entsprechenden Operationen ausführen und das Ergebnis wieder auf den Stack legen:

Meine Frage: Wie kann ich das 2.oberste Element vom Stack nehmen??



Code:
package Stackoperation;

public class Stack {
	
	private double data[];
	int top=0;
	double oberstes=0.0;
	double zweitOberstes=0.0;
	double ergebnis=0.0;
	
	public Stack(int size){
		data=new double[size];
	}
	
	public void push(double item){
		
		data[top]=item;	
		top++;
	}
	
                //oberstes Element herausnehmen! ->funktioniert! 
	public double popOberstes(){
		top--;
		return data[top];
		
	}
	
                //2.oberstes Element herausnehmen->funktioniert nicht!  
	public double popZweitOberstes(){
		double zahl=data[top-1];
		data[top-1]=top;
		top--;
		
		return zahl;
	}
	
                //alle Elemente ausgeben
	public  double[] getAllElements(){
		return data;
	}

                //Ausgabe
                public String toString(){
		StringBuffer sb=new StringBuffer();
		
		
		for(int i=0; i<top;i++){
			sb.append(data[i]+"  ");
			
		}
		return sb.toString();
		
	}
}

Danke!
Sind die anderen Operationen korrekt?
 
R

Roar

Gast
warum wilslt du an das zweite element? popp doch zuerst das oberste element runter, und dann ist dein wzeites wieder das oberste und kannst das ganz normal poppen. sprich:
bum = pop();
dasWasDuHabenWillst = pop();
und da ich davon ausgehe dass du die beiden ja eh zusammen verwenden willst hast du damit schon dein problem gelöst
 

mic_checker

Top Contributor
Du musst beim pushen noch gucken ob du nicht über die grenzen des arrays hinaus gehst....also evtl. array vergrößern wenn notwendig...
 

Sindbad1983

Top Contributor
naja..das ist die Angabe:

Realisieren Sie eine Stack-Maschine für einfache Double-Arithmetik. Die Stack-Maschine soll erlauben,
beliebig viele double-Zahlen auf den Stack zu legen (Operation push). Weiters definiert die Stack-
Maschine die Operationen Addition, Subtraktion, Multiplikation und Division, die jeweils die zwei
obersten Zahlen vom Stack nehmen, mit diesen Zahlen die entsprechenden Operationen ausführen und das
Ergebnis wieder auf den Stack legen. Beachten Sie dabei auch die Möglichkeit verschiedener Exceptions
(z.B. Division durch 0, Stack-Underflow, ....).


Ich muss die oberen 2 z.B. addieren und dann das Ergebnis hineinschreiben!

also 1 2 3 4 5 6

wird zu 1 2 3 4 11

denk ich mal, dass das so gemeint ist!


Aber das funktioniert nicht:

die Methode popZweitOberstes() hab ich jetzt weggelassen und durch popOberstes ersetzt! :roll:


Code:
public class Stack {
	
	private double data[];
	int top=0;
	double oberstes=0.0;
	double zweitOberstes=0.0;
	double ergebnis=0.0;
	
	public Stack(int size){
		data=new double[size];
	}
	
	public void push(double item){
		
		data[top]=item;	
		top++;
	}
	
	public double popOberstes(){
		top--;
		return data[top];
		
	}
	
	
	public  double[] getAllElements(){
		return data;
	}
	
	public void makeOperation (char operation){
		if(operation=='+'){
			addiere();
		}
		else if(operation=='-'){
			subtrahiere();
		}
		else if(operation=='*'){
			multipliziere();
		}
		else if(operation=='%'){
			dividiere();
		}
		else{
			System.out.println("Operation ist nicht korrekt!");
		}
	}
	
	
	
	public void addiere(){
		oberstes=popOberstes();
		zweitOberstes=popOberstes();
		
		ergebnis=oberstes+zweitOberstes;
		data[top]=ergebnis;
		
	}
	
	public void subtrahiere(){
		oberstes=popOberstes();
		zweitOberstes=popOberstes();
		
		ergebnis=oberstes-zweitOberstes;
		data[top]=ergebnis;
		
	}


	public void multipliziere(){
		oberstes=popOberstes();
		zweitOberstes=popOberstes();
	
		ergebnis=oberstes*zweitOberstes;
		data[top]=ergebnis;
	
	}


	public void dividiere(){
		oberstes=popOberstes();
		zweitOberstes=popOberstes();
	
		ergebnis=oberstes%zweitOberstes;
		data[top]=ergebnis;
	
	}
	
	public String toString(){
		StringBuffer sb=new StringBuffer();
		
		
		for(int i=0; i<top;i++){
			sb.append(data[i]+"  ");
			
		}
		return sb.toString();
		
	}
	
	



}

----------

Code:
public class Stacktest {
	
	public static void main(String [] args){
		
		Stack stack1=new Stack(10);
		
		stack1.push(1.0);
		stack1.push(5.0);
		stack1.push(12.0);
		stack1.push(41.0);
		stack1.makeOperation('+');

		System.out.println(stack1);
	
		
		
		
		
	}

}


Ausgabe: 1.0 5.0

:cry:
 

mic_checker

Top Contributor
Das Problem mit dem push() besteht aber weiterhin, laut Aufgabenstellung sollst du ja "beliebig" viele auf den Stack pushen können, also musst du dein Array vergrößern wenn nötig.
 

mic_checker

Top Contributor
Außerdem solltest du mal gucken ob du dem Stack überhaupt erstma den richtigen Input gibst. Der sieht nach deinen push Operationen ja so aus:

(+)
41
12
5
1

Das + bezieht sich aber nur auf die obersten beiden, also auf 41 und 12. Willst du jetzt alle addieren also 5 + 1 + 12 + 41 oder was willst du eigentlich bezwecken?
 

Sindbad1983

Top Contributor
naja..und das mit dem Array vergrößern...
da kann ich ja noch ne eigene Methode schreiben, die ständig die Anzahl noch freier Plätze prüft und bei Bedarf das Array einfach verdoppelt...
das ist glaub ich nicht das Problem!
Mein Problem ist, dass er die Addition der beiden obersten nicht durchführt bzw. das Ergebnis nicht ausgegeben wird!
 

mic_checker

Top Contributor
das liegt an deinem "top" in der ausgabe (toString()).

Wenn du das tun willst - möchtest du dann alle die unter dem Operator-Zeichen stehen addieren?

Ausserdem sieht der Stack nach + der beiden obersten bei dir danach so aus:

41.0
53.0
5.0
1.0

was ja sicher nicht gewollt ist ...
 

Sindbad1983

Top Contributor
1.0 5.0 53.0


:lol: :lol:

es geht!

Code:
public String toString(){
		StringBuffer sb=new StringBuffer();
		
		
		for(int i=0; i<=top;i++){
			sb.append(data[i]+"  ");
			
		}
		return sb.toString();
		
	}

Danke,gute Nacht!
 

mic_checker

Top Contributor
Ja , aber:

- wenn du makeOperation nicht aufrufst wird eine 0.0 am Ende ausgegeben
- der Stack ist nicht richtig geordnet, wie du oben siehst sieht der Stack noch nicht so aus wie er sollte. Imho sollte er danach nämlich so aussehn:

53.0
5.0
1.0

und nicht:

41.0
53.0
5.0
1.0
 

Sindbad1983

Top Contributor
ich weiß nicht genau, was du jetzt meinst...


bei mir passt aber eh die Ausgabe oder?


Code:
public class Stacktest {
	
	public static void main(String [] args){
		
		Stack stack1=new Stack(100);
		
		stack1.push(1.0);
		stack1.push(8.0);
		stack1.push(5.0);
		stack1.push(12.0);
		stack1.push(41.0);
		stack1.push(13.0);
		stack1.makeOperation('+');
		
		
		
		System.out.println(stack1);
		
		
		
		
		
		
	}

}

Ausgabe:

1.0 8.0 5.0 12.0 54.0

Das stimmt auch so oder?


was nicht stimmt ist, wenn ich 2 Operationen hintereinander ausführe:

also z.B.

Code:
public class Stacktest {
	
	public static void main(String [] args){
		
		Stack stack1=new Stack(100);
		
		stack1.push(1.0);
		stack1.push(8.0);
		stack1.push(5.0);
		stack1.push(12.0);
		stack1.push(41.0);
		stack1.push(13.0);
		stack1.makeOperation('+');
		
		
		
		System.out.println(stack1);
		
		stack1.makeOperation('+');
		
		System.out.println(stack1);
		
		
	}

}

dann kommt das raus:

1.0 8.0 5.0 12.0 54.0
1.0 8.0 17.0


und das ist nicht das, was ich will..

kannst du mir da einen genaueren Hinweis geben bitte, worans liegt...
 

mic_checker

Top Contributor
Was ich meine:
Lass dir mal das komplette Array ausgeben, dann siehst du das "hinter" top noch was ist, was da eigentlich nicht hingehört.
 

Sindbad1983

Top Contributor
ok meinst du das?



Code:
double [] data=stack1.getAllElements();
		
		
		for(int i=0;i<data.length;i++){
			System.out.print(data[i]+" ");
		}


Ausgabe:

1.0 8.0 5.0 12.0 54.0
1.0 8.0 17.0
1.0 8.0 17.0 12.0 54.0 13.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 .........


Naja..wie kann man das lösen?
 

mic_checker

Top Contributor
Ja ich meinte das, dadurch das "hinten" noch Werte stehen die da nicht stehen dürften wird das Ergebnis verfälscht.

Du kannst ja so vorgehen: Entsprechend dem ausgewählten Operator wird die Operation ausgeführt, bspw. eine Addition. Die beiden obersten Zahlen werden vom Stack genommen und das Ergebnis wird gepusht. So steht dann nach:

Code:
      stack1.push(1.0); 
      stack1.push(5.0); 
      stack1.push(12.0); 
      stack1.push(41.0);
      stack1.makeOperation(...);
//etc. pp.

53
5
1

Und hinter 53 kommt kein Element mehr. Also einfach noch vom Stack die beiden poppen und das Ergebnis pushen....
 

Sindbad1983

Top Contributor
naja..jetzt bin ich sowieso auf ein Riesenproblem draufgekommen! :-(((

Das ganze soll ja variabel sein...das heißt Array kann ich ja dann sowieso keins nehmen oder?

Aber ich wie kann ich einen Stack sonst realisieren?
Mit einer ArrayList? LinkedList?
Gibts da auch ähnliche Methoden wie push und pop?
 

Sindbad1983

Top Contributor
nein..tut mir leid..ich komm nicht drauf..spiel mich jetzt schon so lang! :cry:


Er zeigt trotzdem immer die Zahl an, die nicht da sein soll! :-(


Code:
public class Stack {
	
	private double data[];
	int top=0;
	double oberstes=0.0;
	double zweitOberstes=0.0;
	double ergebnis=0.0;
	
	public Stack(int size){
		data=new double[size];
	}
	
	public double push(double item){
		
		data[top]=item;	
		top++;
		return item;
	}
	
	public double popOberstes(){
		top--;
		
		return data[top];
		
	}
	
	public int size(){
		return data.length;
	}
	
	
	public  double[] getAllElements(){
		return data;
	}
	
	public void makeOperation (char operation){
		if(operation=='+'){
			addiere();
		}
	                else{
			System.out.println("Operation ist nicht korrekt!");
		}
	}
	
	
	
	public void addiere(){
		oberstes=popOberstes();
		
		zweitOberstes=popOberstes();
		
		ergebnis=oberstes+zweitOberstes;
		data[top+1]=push(ergebnis);
		
	
		
	}
	
		
	public String toString(){
		StringBuffer sb=new StringBuffer();
		
		
		for(int i=0; i<top;i++){
			sb.append(data[i]+"  ");
			
		}
		return sb.toString();
		
	}
	
	



}

-----------------

Code:
public class Stacktest {
	
	public static void main(String [] args){
		
		Stack stack1=new Stack(10);
		
		stack1.push(1.0);
		stack1.push(8.0);
		stack1.push(5.0);
		stack1.push(12.0);
		stack1.push(41.0);
		stack1.push(13.0);
		
		
		
		System.out.println(stack1);
		

		
		
		
		stack1.makeOperation('+');
		System.out.println("Operation ausgeführt: "+stack1);
		
		
		
		double [] data2=stack1.getAllElements();
		
		
		System.out.print("Veränderter Stack: ");
		for(int i=0;i<data2.length;i++){
			System.out.print(data2[i]+" ");
		}
		
	
		
		
	}

}

Danke!
 

mic_checker

Top Contributor
Du könntest mit ArrayList arbeiten, dann implementierst du die push() Methode halt entsprechend, du kannst ja Elemente mit add(...) hinzufügen und mit remove(...) entfernen, sollte nicht schwer sein.

Zu deinem Prob oben:
Muss mir das ma zu Hause angucken , wenn ich was testen kann, hab jetzt net viel Zeit.
 

Sindbad1983

Top Contributor
ok..danke..das wär spitze!
Ich weiß da nämlich echt nicht mehr weiter!

In der Zwischenzeit werd ich mal ArrayList probieren! :-(

Also bis dann!
Danke Mic ! ;-)
ciao,Tommy
 

mic_checker

Top Contributor
So sollte es klappen:

Code:
public class StackTest {
   
   public static void main(String [] args) {      
      Stack stack1 = new Stack();
      
      stack1.push(1.0);
      stack1.push(8.0);
      stack1.push(5.0);
      stack1.push(12.0);
      stack1.push(41.0);
      stack1.push(13.0); 
      
      while(stack1.size() > 1) 
      	stack1.makeOperation('+');
            
      System.out.println("Ergebnis = "+stack1);
   }
}

Code:
import java.util.List;
import java.util.ArrayList;

public class Stack {
	private List al;
	
	public Stack() {
		al = new ArrayList();
	}
	
	public double push(double item) {
		al.add(new Double(item));
		
		return item;
	}
	
	public double pop() {
		return ((Double)al.remove(al.size()-1)).doubleValue();		
	}
	   
  	public int size(){
     	return al.size();
   }
   
   public void makeOperation (char operation){
      if(operation=='+'){
         addiere();
      } else {
         System.out.println("Operation ist nicht korrekt!");
      }
   }   
   
   public void addiere() {
		push(pop() + pop());      
   }
         
   public String toString() {
      StringBuffer sb=new StringBuffer();     
      
      for(int i = 0;i < al.size();i++) 
         sb.append(al.get(i)+"  ");       
      
      return sb.toString();      
   }
}

Habs gerad nur schnell aufgesetzt, wenn Fehler auftauchen sag bitte bescheid.....
 

Sindbad1983

Top Contributor
danke für die viele Mühe.. :###


aber wieso addierst du jetzt alle Werte ??
Das ist ja nicht die Aufgabe! (siehe Angabe)
Es sollen ja nur die obersten 2 addiert werden.. ???:L

weil Ergebnis=80 sind alle zusammen !?!?!
 

Sindbad1983

Top Contributor
geil es geht! :applaus: :applaus:

Ausgabe:
Stack ohne Operationen: 1.0 8.0 5.0 12.0 41.0 13.0
Stack nach 1.Operation: 1.0 8.0 5.0 12.0 54.0
Stack nach 2.Operation: 1.0 8.0 5.0 648.0
Stack nach 3.Operation: 1.0 8.0 643.0


Code:
import java.util.List; 
import java.util.ArrayList; 

public class Stack { 
	
	private List list;
	double ergebnis=0.0;
	double oberstes=0.0;
	double zweitOberstes=0.0;
	
	
	public Stack(){
		list=new ArrayList();
	}
	
	public double push(double item){
		list.add(new Double(item));
		
		return item;
		
	}
	
	public double pop(){
		return ((Double)list.remove(list.size()-1)).doubleValue();     
	}
	
	public int size(){
		return list.size();
	}
	
	 public void makeOperation (char operation){ 
	      if(operation=='+'){ 
	         addiere(); 
	      }
	      else if(operation=='-'){ 
	         subtrahiere(); 
	      }
	      else if(operation=='*'){
	    	  multipliziere();
	      }
	      else if(operation=='%'){
	    	  dividiere();
	      }
	      else { 
	         System.out.println("Operation ist nicht korrekt!"); 
	      } 
	   }    
	 
	 public double addiere(){
		 
		 oberstes=pop();
		 zweitOberstes=pop();
		 
		 ergebnis=oberstes+zweitOberstes;
		 
		 push(ergebnis);
		 
		 return ergebnis;
		 
	 }
	 
	 public double subtrahiere(){
		 
		 oberstes=pop();
		 zweitOberstes=pop();
		 
		 ergebnis=oberstes-zweitOberstes;
		 
		 push(ergebnis);
		 
		 return ergebnis;
		 
	 }
 
	 public double multipliziere(){
	 
		 oberstes=pop();
		 zweitOberstes=pop();
		 
		 ergebnis=oberstes*zweitOberstes;
	 
		 push(ergebnis);
	 
		 return ergebnis;
	 
	 }
	 
	 public double dividiere(){
		 
			 oberstes=pop();
			 zweitOberstes=pop();
			 
			 ergebnis=oberstes%zweitOberstes;
		 
			 push(ergebnis);
		 
			 return ergebnis;
		 
		 }
	 
	 public String toString() { 
	      StringBuffer sb=new StringBuffer();      
	      
	      for(int i = 0;i < list.size();i++) {
	         sb.append(list.get(i)+"  ");        
	      } 
	      return sb.toString();      
	} 



	
}

Danke für deine Hilfe vorerst mal! :oops:

Es kommen nämlich sicher noch ein paar GUI Fragen...
 

mic_checker

Top Contributor
Du hättest nichts am Code ändern müssen ;)

Ich hab gedacht du wolltest alle Werte addieren, deswegen das Konstrukt in der Schleife, wenn du das ganze wegmachst und nur einmal makeOperation aufrufst siehst du das es ordnungsgemäß funktioniert ;)
 

Sindbad1983

Top Contributor
Es geht nämlich gleich weiter...

ich brauch eine grafische Benutzeroberfläche für die StackMachine !
->unter der Verwendung des Java Swing Frameworks.
Die Benutzerschnittstelle gliedert sich in 3 Teile:
Eingabe: Zum Einlesen eines Wertes und einen entsprechenden Button zum pushen auf den Stack
Operationen: ein Panel mit Buttons für die vier Operationen
Ausgabe: Zur Visualisierung des Stacks.

Dabei soll man in der Lösung auf Wiederverwendbarkeit und möglichst strikte Trennung von
Model, View und Control Acht geben!


Keine Ahnung, wie das gemeint ist mit dem MVC-Konzept!
Wie kann ich da sowas implementieren?
 

mic_checker

Top Contributor
Zum MVC kannst du mal im Forum suchen , z.B. gibt es im FAQ Bereich nen Artikel zu "Design Patterns", wo auch das MVC behandelt wird.

Ansonsten kannst du ja z.B. ein JTextField nutzen um eine Zahl einzugeben, dann vier JButtons für je eine Operation und schließlich zur Visualisierung des ganzen z.B. eine JList, wobei du beim pushen die Elemente jeweils an die erste Stelle einfügst , so dass in der JList immer das zuletzt gepushte ganz oben steht.

Kannst das natürlich auch anders machen.

Edit:
Den FAQ Beitrag zu Design Patterns findest du hier
 

Sindbad1983

Top Contributor
boa...das ist ja eine Katastrophe....
das check ich nicht!
Da muss ich ja fast wieder alles umschreiben, wenn ich das wirklich so mit MVC implementieren will, oder!
:-(


Naja..ich mein:

1.Model wär jetzt meine Klasse Stack mit den Operationen pop, push, addiere-dividiere etc.

2.View wäre dann die ganze GUI-Implementierung...
da könn ich zwei Klassen machen:

eine für den linken Teil: StackMachineOutputPanel mit Buttons und Feld zum eingeben
eine für den rechten Teil: StackMachineOutputPanel mit der Ausgabe der Werte


und dann noch irgendeine Controller-Klasse..was die aber genau macht, weiß ich noch nicht... :autsch:
 

Sindbad1983

Top Contributor
kann mir bitte jemand bei dem Layout des View helfen?

1. soll ich das ganze von JApplet oder von JFrame ableiten?
oder isses egal?
2. wie kann ich die Größe des z.B. JFrame bestimmen? mit setSize() hats nicht funktioniert! :-(
3. ich möcht 2 Hälften:
in der linken sollen die 5 Button angeordnet sein (Add,Sub,Mult,Div,Push)-> untereinander und ein TextField in dem man die neue Zahl dem Stack hinzufügen kann!

in der rechten soll das Array in Form einer JList ausgegeben werden


also so in etwa:




-------------------------------------
Addieren


Subtrahieren

1
Multiplizieren 5
7
4
Dividieren 2
--------------------------------------


Push JTEXTFIELD




naja..so ungefähr

wie könnt ich das machen?

z.B. Container c; JPanel p1, JPanel p2 aber mit welchem Layout jeweils?
das verwirrt mich voll!
Kann mir da bitte jemand helfen?
 

mic_checker

Top Contributor
Gibt da natürlich viele verschiedene Möglichkeiten...

Wie kommst du auf JApplet? Leite von JFrame ab.

Du könntest dein Fenster erstmal in zwei Bereiche unterteilen, entweder z.B. mit nem GridLayout (2 Spalten, 1 Zeile) oder mit nem BorderLayout (in Westen und Osten) etc. denke mal nicht das du zu nem komplexeren Layout-Manager greifen musst.

Wenn du zwei geteilte "Bildschirme" haben willst könntest du auch ein JSplitPane holen, kannst es dir ja mal anschauen, denke eher durch Verwendung der oben genannten kommst du weiter.

Im linken Teilfenster kannst du wiederrum zum GridLayout greifen und 6 Zeilen, 1 Spalte machen und das ganze auf ein JPanel machen. Ins rechte Fenster dann halt einfach die JList reinpacken.

Im Prinzip bist du recht ungebunden, die einfachen Layout-Manager sollten ausreichend sein für die Bedürfnisse.

Ansonsten kannst du es ja noch posten wenn du Fragen hast.
 

Sindbad1983

Top Contributor
naja..ich hab jetzt mal begonnen, aber es wird nicht so angezeigt, wie ich mir das vorstelle!

Also wenn das Fenster erscheint mit 300,300 sieht man darin gar nichts!
Erst wenn ich es ganz öffne(auf den ganzen Bilrdschirm vergrößere) sieht man gaaanz unten das JPanel mit den Button und ganz oben JPanel 2 aber leider ohne JList!
Und in der Mitte und links und rechts ist aalles frei! :bahnhof:

Wie kann man das ändern? Mensch ich hasse BorderLayout() :bloed:





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

public class StackViewer extends JFrame {

                    Stack model;
	
	
	private JButton add,sub,mult,div,push;
	private JTextField zahl;
	private JList list;
	private JPanel input,output;
	
	public StackViewer(String titel){
		super(titel);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(300,300);
		setLocation(300,300);
		setVisible(true);
		
		
		Container cp=getContentPane();
		cp.setLayout(new BorderLayout());
		
	
		input=new JPanel();
		cp.add(input, BorderLayout.SOUTH);
		input.setBackground(Color.blue);
		
	
	    
	    
	    add=new JButton("Addiere");
	    sub=new JButton("Subtrahiere");
	    mult=new JButton("Multipliziere");
	    div=new JButton("Dividiere");
	    push=new JButton("Hinzufügen");
	    
	    input.add(add);
	    input.add(sub);
	    input.add(mult);
	    input.add(div);
	    input.add(push);
	    
	    output=new JPanel();
	    cp.add(output, BorderLayout.NORTH);
	    output.setBackground(Color.red);
	 
	    
	    
	    list=new JList();
	    output.add(list);
	  

	
	
	}
	
	 public static void main(String[] args)
	    {
	      new StackViewer("Stack-Maschine");
	    }


	
	
	
}

Ganz oben hab ich ja Stack model deklariert! Wo muss ich model übergeben, um auf die Daten im Stack (der Klasse Stack) Zugriff zu haben im GUI?
 

mic_checker

Top Contributor
Probiers mal so (hab die imports jetzt weggelassen):

Code:
public class StackViewer extends JFrame {
   Stack model;
   
   
   private JButton add,sub,mult,div,push;
   private JTextField zahl;
   private JList list;
   private JPanel input,output;
   
   public StackViewer(String titel){
      super(titel);      
      
      Container cp=getContentPane();
      cp.setLayout(new BorderLayout());
      
   
		input=new JPanel();
      
       add=new JButton("Addiere");
       sub=new JButton("Subtrahiere");
       mult=new JButton("Multipliziere");
       div=new JButton("Dividiere");
       push=new JButton("Hinzufügen");
      
       input.add(add);
       input.add(sub);
       input.add(mult);
       input.add(div);
       input.add(push);       
       input.setBackground(Color.blue);
      
       output=new JPanel();
       list = new JList();
       output.add(new JScrollPane(list)); 
       output.setBackground(Color.red);
       
       cp.add(input, BorderLayout.SOUTH);  
       cp.add(output, BorderLayout.NORTH);
   }
   
    public static void main(String[] args)
    {
    	StackViewer sv = new StackViewer("Stack-Maschine");
      sv.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     	sv.setSize(500,500);
      sv.setLocation(200,200);
      sv.setVisible(true);
    }   
}
 

Sindbad1983

Top Contributor
super danke!
Schaut schon gut aus!

Ganz oben hab ich ja Stack model deklariert! Wo muss ich model übergeben, um auf die Daten im Stack (der Klasse Stack) Zugriff zu haben im GUI?
Oder muss ich da noch was eigenes entwerfen?

Jetzt fehlen halt noch die actionPerformed-Methoden und dann die Verbindung zur Klasse Stack, dass ich auf die Methoden Zugriff habe...

danach muss ich mir noch Gedanken über MVC machen..da wird wohl noch ne Klasse StackController fällig!
 

Sindbad1983

Top Contributor
Kann mir bitte jemand helfen?

Ich komm einfach nicht drauf, wie ich da jetzt die Verbindung herstellen kann zwischen Model und View...

Was muss ich da übergeben?
Wie geht das, dass in der JList die Zahlen angezeigt werden, die ich auf den Stack pushe???


Die Klasse Stack ist mein Model!
Die Klasse StackViewer meine View!


Code:
public class StackViewer extends JFrame implements ActionListener{ 

	   Stack model=new Stack(); 
	    
	   private JButton add,sub,mult,div,push; 
	   private JTextField zahl; 
	   private JList list; 
	   private JPanel input,output; 
	    
	   public StackViewer(String titel){ 
	      super(titel); 
	  
	      Container cp=getContentPane(); 
	      cp.setLayout(new BorderLayout()); 
	       
	    
	      input=new JPanel(); 
	   
	       
	       add=new JButton("Addiere"); 
	       sub=new JButton("Subtrahiere"); 
	       mult=new JButton("Multipliziere"); 
	       div=new JButton("Dividiere"); 
	       push=new JButton("Hinzufügen"); 
	       zahl=new JTextField(10);
	       
	       input.add(add); 
	       input.add(sub); 
	       input.add(mult); 
	       input.add(div); 
	       input.add(push); 
	       input.add(zahl);
	       input.setBackground(Color.red);
	       
	       cp.add(input, BorderLayout.SOUTH);
	       
	       
	       
	       
	       output=new JPanel(); 
	       cp.add(output, BorderLayout.NORTH); 
	       output.setBackground(Color.red); 
	    
	       
	       //list=new JList(model) wär für mich logisch! Das stimmt aber nicht! :-(
	       list=new JList(); 
	       output.add(new JScrollPane(list)); 


	    
	    
	   } 
	   
	   public void actionPerformed(ActionEvent e){
		   //Button-Ereignisse
                                           //model.addiere()...
		  
		   
	   }
	
	}
Danke!
 

mic_checker

Top Contributor
Also du kannst entweder mit einem DefaultListModel arbeiten und dort mit addElement(...) die einzelnen Elemente die du drauf pushst hinzufügen oder du schreibst dein eigenes Model, leitest deine Klasse also z.B. von AbstractListModel ab etc.

Würde ich jetzt zumindest mal sagen, was du benutzt ist ja dann deine Sache ;)
 

Sindbad1983

Top Contributor
Hi Mic!

Ich hab jetzt einen neuen Ansatz gewählt, der glaub ich Früchte tragen könnte!
Ich hab eine zusätzliche Klasse StackPanel gemacht!
Leider zeigt er mir momentan nur ein leeres Panel an!
Weißt du zufällig, woran das liegt?

Ist der Ansatz jetzt besser?

Code:
import java.util.List; 
import java.util.ArrayList; 

import javax.swing.ListModel;
import javax.swing.event.ListDataListener;

public class Stack implements ListModel { 
	
	private List list;
	double ergebnis=0.0;
	double oberstes=0.0;
	double zweitOberstes=0.0;
	
	
	public Stack(){
		list=new ArrayList();
	}
	
	public double push(double item){
		list.add(new Double(item));
		
		return item;
		
	}
	
	public double pop(){
		return ((Double)list.remove(list.size()-1)).doubleValue();     
	}
	
	public int size(){
		return list.size();
	}
	
	 public void makeOperation (char operation){ 
	      if(operation=='+'){ 
	         addiere(); 
	      }
	      else if(operation=='-'){ 
	         subtrahiere(); 
	      }
	      else if(operation=='*'){
	    	  multipliziere();
	      }
	      else if(operation=='%'){
	    	  dividiere();
	      }
	      else { 
	         System.out.println("Operation ist nicht korrekt!"); 
	      } 
	   }    
	 
	 public double addiere(){
		 
		 oberstes=pop();
		 zweitOberstes=pop();
		 
		 ergebnis=oberstes+zweitOberstes;
		 
		 push(ergebnis);
		 
		 return ergebnis;
		 
	 }
	 
	 public double subtrahiere(){
		 
		 oberstes=pop();
		 zweitOberstes=pop();
		 
		 ergebnis=oberstes-zweitOberstes;
		 
		 push(ergebnis);
		 
		 return ergebnis;
		 
	 }
 
	 public double multipliziere(){
	 
		 oberstes=pop();
		 zweitOberstes=pop();
		 
		 ergebnis=oberstes*zweitOberstes;
	 
		 push(ergebnis);
	 
		 return ergebnis;
	 
	 }
	 
	 public double dividiere(){
		 
			 oberstes=pop();
			 zweitOberstes=pop();
			 
			 ergebnis=oberstes%zweitOberstes;
		 
			 push(ergebnis);
		 
			 return ergebnis;
		 
		 }
	 
	 public String toString() { 
	      StringBuffer sb=new StringBuffer();      
	      
	      for(int i = 0;i < list.size();i++) {
	         sb.append(list.get(i)+"  ");        
	      } 
	      return sb.toString();      
	}

	public int getSize() {
		return list.size();
	}

	public Object getElementAt(int arg0) {
		// TODO Auto-generated method stub
		return null;
	}

	public void addListDataListener(ListDataListener arg0) {
		// TODO Auto-generated method stub
		
	}

	public void removeListDataListener(ListDataListener arg0) {
		// TODO Auto-generated method stub
		
	} 



	
}

-------------------

Code:
import java.awt.*;
import javax.swing.*;
	public class StackViewer extends JFrame { 

	  StackPanel panel;
	  Stack model;
	  
	    
	   public StackViewer(String titel){ 
	      super(titel); 
	     
	  
	      Container cp=getContentPane(); 
	      cp.setLayout(new BorderLayout()); 
	      
	      Stack model=new Stack();
	      
	      panel=new StackPanel(model);
	      
	      cp.add(panel, BorderLayout.CENTER);
	   } 
	   
	   public static void main(String[] args){ 
	   

	      StackViewer sv= new StackViewer("Stack-Maschine"); 
	      sv.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	      sv.setSize(630,200); 
	      sv.setLocation(300,300); 
	      sv.setVisible(true); 
	  }
	
	}

--------


Code:
import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

public class StackPanel extends JPanel implements ActionListener{
	
	
	  
	   private JButton add,sub,mult,div,push; 
	   private JTextField zahl; 
	   private JList list; 
	   private JPanel input,output; 
	   
	   
	   public StackPanel(Stack model){
		   
		   JPanel input=new JPanel();

	       add=new JButton("Addiere"); 
	       sub=new JButton("Subtrahiere"); 
	       mult=new JButton("Multipliziere"); 
	       div=new JButton("Dividiere"); 
	       push=new JButton("Hinzufügen"); 
	       zahl=new JTextField(10);
	       
	       input.add(add); 
	       input.add(sub); 
	       input.add(mult); 
	       input.add(div); 
	       input.add(push); 
	       input.add(zahl);
	       input.setBackground(Color.red);
	       
	       

	       
	       output=new JPanel(); 
	       output.setBackground(Color.red); 
	    
	       
	       list = new JList(model);
	       list.setPrototypeCellValue("9999/9999");
	       JScrollPane scrollPane = new JScrollPane(list);
	       scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
	   

	   }
	   
	   
	   public void actionPerformed(ActionEvent e){
		   //Implementierung add, sub, mult...etc.
		   
	   }
	
	
	
	
	

}
 

mic_checker

Top Contributor
Das liegt daran:
In deiner StackPanel Klasse erzeugst du neue JPanel, auf die du die Komponenten hinzufügst. Aber du willst ja nicht auf diese JPanel hinzfügen sondern auf dein Stackpanel.

Also anstatt:

Code:
input.add(...);

das:

Code:
add(...);

Nur warum machst du es jetzt über ein solches StackPanel?
Ob das unbedingt besser ist.....kannst es ja auch mal im Forums Chat probieren....
 

Sindbad1983

Top Contributor
Ja...dann füg ich die Buttons etc. dem StackPanel zu, ok? Aber ich kann doch dann wieder auf das Stackpanel z.B. 2 Panels drauflegen, oder? also input und output, oder? denn wie ordne ich sonst die Komponenten an?
Das muss doch gehen oder? ..und dann die Komponenten den 2 Panels zuordnen....

keine Ahnung, warum er mir jetzt die JList nicht anzeigt! :bahnhof:

hab sie ganz normal hinzugefügt..sichtbar sind aber nur die Button


Code:
import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

public class StackPanel extends JPanel implements ActionListener{
	
	
	  
	   private JButton add,sub,mult,div,push; 
	   private JTextField zahl; 
	   private JList list; 
	   private JPanel input,output; 
	   
	   
	   public StackPanel(Stack model){
		  
                           JPanel input=new JPanel();

	       add=new JButton("Addiere"); 
	       sub=new JButton("Subtrahiere"); 
	       mult=new JButton("Multipliziere"); 
	       div=new JButton("Dividiere"); 
	       push=new JButton("Hinzufügen"); 
	       zahl=new JTextField(10);
	       
	       add(add); 
	       add(sub); 
	       add(mult); 
	       add(div); 
	       add(push); 
	       add(zahl);
	       //input.setBackground(Color.red);
	       
	       

	       
	       output=new JPanel(); 
	      // output.setBackground(Color.blue); 
	    
	       
	       list = new JList(model);
	       list.setPrototypeCellValue("9999/9999");
	      
	       JScrollPane scrollPane = new JScrollPane(list);
	       scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
	       add(list);

	   }
	   
	   
	   public void actionPerformed(ActionEvent e){
		   //Implementierung add, sub, mult...etc.
		   
	   }
	
	
	
	
	

}
 

Wildcard

Top Contributor
Wenn du eine Komponente in eine ScrollPane legst, musst du die ScrollPane adden, und nicht die Komponente selber.
Sowas nennt sich Decorator-Pattern, die ScrollPane ist für deine GUI praktisch transparent und legt sich einfach als eine Art Rahmen um die Komponente.
 

mic_checker

Top Contributor
Du kannst in StackPanel doch dein Layout setzen mit setLayout(...).

Dann kannst du auch , wenn du das willst, die zwei Panels behalten und fügst die Panels entsprechend hinzu, nur dran denken add(...) aufzurufen.

Mit Forums Chat meinte ich den IRC Chat dieses Forums (#java-forum.net)
 

Sindbad1983

Top Contributor
So jetzt sitz ich schon wieder seit 2 Stunden an diesem blöden Problem!!! :autsch:

Ich probier und probier und komm einfach nur drauf!

Wenn ich eine Zahl auf den Stack pushen möchte, dann sollte(sobald ich den Button push drücke) auch die Zahl in der JList ersichtlich sein! Nur sieht man sie nicht!
Versteh ich echt nicht!

Kannst du mir bitte nochmal helfen?
*schlechtesGewissenhab*




Klasse Stack ist gleich geblieben!
---------------------

Code:
import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

public class StackPanel extends JPanel implements ActionListener{
	
	
	  
	   private JButton add,sub,mult,div,push; 
	   private JTextField zahl; 
	   private JList list; 
	   private JPanel input,output; 
	   double pushZahl;
	   Stack myvalues;
	   
	   
	   public StackPanel(Stack model){
		  
		   
		   myvalues=model;
		   
		   JPanel input=new JPanel();

	       add=new JButton("Addiere"); 
	       add.addActionListener(this);
	       sub=new JButton("Subtrahiere"); 
	       sub.addActionListener(this);
	       mult=new JButton("Multipliziere"); 
	       mult.addActionListener(this);
	       div=new JButton("Dividiere"); 
	       div.addActionListener(this);
	       push=new JButton("Hinzufügen"); 
	       push.addActionListener(this);
	       zahl=new JTextField(8);
	       
	       add(add); 
	       add(sub); 
	       add(mult); 
	       add(div); 
	       add(push); 
	       add(zahl);

	       output=new JPanel(); 
	       
	       list = new JList(myvalues);
	       list.setPrototypeCellValue("9999/9999");
	       list.setFixedCellHeight(15);
	       list.setFixedCellWidth(150);
	      
	       JScrollPane scrollPane = new JScrollPane(list);
	       scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
	       add(scrollPane);
	   }
	   
	   
	   public void actionPerformed(ActionEvent e){
		  if(e.getSource()==push){
			  
			 try{
			 pushZahl= Double.parseDouble(zahl.getText());
			 myvalues.push(pushZahl);
			 }
			 catch(Exception e1){};
		  }
		  repaint();
		   
	   }
}

-----------------------------
in StackViewer hab ich eigentlich auch nichts verändert!

Code:
	public class StackViewer extends JFrame { 

	  StackPanel panel;
	  Stack model;
	  
	    
	   public StackViewer(String titel){ 
	      super(titel); 
	     
	  
	      Container cp=getContentPane(); 
	      cp.setLayout(new BorderLayout()); 
	      
	      model=new Stack();
	      
	      panel=new StackPanel(model);
	      
	      cp.add(panel, BorderLayout.CENTER);
	   } 
	   
	   public static void main(String[] args){ 
	   

	      StackViewer sv= new StackViewer("Stack-Maschine"); 
	      sv.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	      sv.setSize(630,200); 
	      sv.setLocation(300,300); 
	      sv.setVisible(true); 
	  }
	
	}
 

mic_checker

Top Contributor
Jetzt müsste die Liste zumindest angezeigt werden oder?

Hab bisher wenn von AbstractListModel abgeleitet (kannst dir auch mal DefaultListModel angucken), aber wenn ich mich nicht täusche dann werden in ListModel doch die Elemente in einem Vector verwaltet:

This interface defines the methods components like JList use to get the value of each cell in a list and the length of the list. Logically the model is a vector, indices vary from 0 to ListDataModel.getSize() - 1. Any change to the contents or length of the data model must be reported to all of the ListDataListeners.
-> API ListModel.

Vielleicht müsstest du das bei dir auch machen, kann aber nichts sicher sagen, da ich bisher nicht mit dem Interface gearbeitet hab. Bis ich Code etc. genau testen kann dürfte es auch bis heute abend dauern....

Ansonsten kannst du dir auch mal das anschauen:

Advanced JList Programming
 

mic_checker

Top Contributor
Also, damit du die Werte in der JList angezeigt bekommst musst du lediglich die Methode getElementAt richtig implementieren:

Code:
   public Object getElementAt(int arg0) {
	return list.get(arg0);
   }

Sollte eigentlich so klappen, falls nicht sag bescheid.
 

Sindbad1983

Top Contributor
geil..es geht!

Du bist echt spitze!

Danke!!!!!!!

Hab mich jetzt noch ein bissl mit den Layouts gespielt!
Werd jetzt noch die anderen actionPerformed-Methoden implementieren!
Hoffe, ich darf dich nochmal fragen, falls ich Probleme hab!#

Danke nochmal Mic! :)

ciao,Tommy
 

mic_checker

Top Contributor
Noch was:
Du solltest bevor du best. Operationen ausführst (Addition etc.) noch checken ob überhaupt 2 Elemente auf dem Stack / bzw. in der Liste sind.

Hab eben gesehen das ich davon ausging das noch welche drauf sind, sollte man aber sicherheitshalber vorher überprüfen.

Für jede weitere Frage 5 Euro auf folgendes Konto... ;)
 

Sindbad1983

Top Contributor
So...mein Programm ist jetzt fast fertig:

Es gibt nur mehr ein kleines Problem mit dem MVC..wenn ich zwei Fenster öffne, und beim anderen was verändere wird es nicht aktualisiert..und das sollte es aber, oder?


Irgendwo dürfte ich da einen kleinen Fehler haben!
Kann mir da bitte nochmal jemand helfen? :oops:

Hier das ganze Programm(für alle, dies interessiert):


Code:
public class Stack implements ListModel { 
	
	private List list;
	private List subscribers;
	double ergebnis=0.0;
	double oberstes=0.0;
	double zweitOberstes=0.0;
	
	
	public Stack(){
		list=new ArrayList();
		subscribers=new ArrayList();
		
	}
	
	public void subscribe(NotificationReceiver r){
		subscribers.add(r);
	}
	
	public void mainfunction(){
		for(int i=0;i<subscribers.size();i++){
			((NotificationReceiver)subscribers.get(i)).notifyOberservers();
		}
	}
	
	public double push(double item){
		list.add(new Double(item));
		mainfunction();
		
		return item;
		
		
	}
	
	public double pop()throws NoElementException{
		if(list.size()<2){
			throw new NoElementException("Zu wenig Elemente im Stack");
			
		}
		
		
		return ((Double)list.remove(list.size()-1)).doubleValue();     
	}
	
	

	
	public int size(){
		return list.size();
	}
	
	 public void makeOperation (char operation){ 
	      if(operation=='+'){ 
	         addiere(); 
	      }
	      else if(operation=='-'){ 
	         subtrahiere(); 
	      }
	      else if(operation=='*'){
	    	  multipliziere();
	      }
	      else if(operation=='%'){
	    	  
	    	  try {
				dividiere();
			} catch (ZeroDivisionException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	      }
	      else { 
	         System.out.println("Operation ist nicht korrekt!"); 
	      } 
	   }    
	 
	 public double addiere(){
		 
		 try {
			oberstes=pop();
		} catch (NoElementException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 try {
			zweitOberstes=pop();
		} catch (NoElementException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 
		 ergebnis=oberstes+zweitOberstes;
		 
		 push(ergebnis);
		 
		 return ergebnis;
		 
	 }
	 
	 public double subtrahiere(){
		 
		 try {
			oberstes=pop();
		} catch (NoElementException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 try {
			zweitOberstes=pop();
		} catch (NoElementException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 
		 ergebnis=oberstes-zweitOberstes;
		 
		 push(ergebnis);
		 
		 return ergebnis;
		 
	 }
 
	 public double multipliziere(){
	 
		 try {
			oberstes=pop();
		} catch (NoElementException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		 try {
			zweitOberstes=pop();
		} catch (NoElementException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 
		 ergebnis=oberstes*zweitOberstes;
	 
		 push(ergebnis);
	 
		 return ergebnis;
	 
	 }
	 
	 public double dividiere() throws ZeroDivisionException{
		 
			 try {
				oberstes=pop();
			} catch (NoElementException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			 try {
				zweitOberstes=pop();
			} catch (NoElementException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			 
			 if((oberstes==0)&(zweitOberstes==0)){
				 throw new ZeroDivisionException("Division durch 0 nicht erlaubt");
			 }
			 
			 ergebnis=oberstes%zweitOberstes;
		 
			 push(ergebnis);
		 
			 return ergebnis;
		 
		 }
	 
	 public String toString() { 
	      StringBuffer sb=new StringBuffer();      
	      
	      for(int i = 0;i < list.size();i++) {
	         sb.append(list.get(i)+"  ");        
	      } 
	      return sb.toString();      
	}

	public int getSize() {
		return list.size();
	}

	public Object getElementAt(int arg0) { 
		   return list.get(arg0); 
		   } 

	public void addListDataListener(ListDataListener arg0) {
		// TODO Auto-generated method stub
		
	}

	public void removeListDataListener(ListDataListener arg0) {
		// TODO Auto-generated method stub
		
	} 



	
}



Code:
import java.awt.*;

import javax.swing.*;

import java.awt.event.*;

public class StackPanel extends JPanel implements ActionListener, NotificationReceiver{
	
	
	  
	   private JButton add,sub,mult,div,pushButton; 
	   private JTextField zahl; 
	   private JList list; 
	   private JPanel general,input,output; 
	   double pushZahl;
	   Stack myvalues;
	   int cnt=0;
	   
	   
	   public StackPanel(Stack model){
		  
		   
		   myvalues=model;
		   myvalues.subscribe(this);
		   
		   JPanel general=new JPanel();
		   general.setLayout(new GridLayout(2,1));
		   
		   
		   
	      
	       output=new JPanel(); 
	       
	       list = new JList(myvalues);
	       list.setPrototypeCellValue("9999/9999");
	       list.setFixedCellHeight(15);
	       list.setFixedCellWidth(150);
	      
	       JScrollPane scrollPane = new JScrollPane(list);
	       scrollPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
	       output.add(scrollPane);
	       output.setBackground(Color.red);
	       general.add(output);

		   
		   JPanel input=new JPanel();
		   input.setLayout(new FlowLayout());

	       add=new JButton("Addiere"); 
	       add.addActionListener(this);
	       sub=new JButton("Subtrahiere"); 
	       sub.addActionListener(this);
	       mult=new JButton("Multipliziere"); 
	       mult.addActionListener(this);
	       div=new JButton("Dividiere"); 
	       div.addActionListener(this);
	       pushButton=new JButton("Hinzufügen"); 
	       pushButton.addActionListener(this);
	       zahl=new JTextField(8);
	       
	       
	       input.add(add); 
	       input.add(sub); 
	       input.add(mult); 
	       input.add(div); 
	       input.add(pushButton); 
	       input.add(zahl);
	       input.setBackground(Color.blue);
	       
	       general.add(input);
	       
	       
	       
	       add(general);
	   }
	   
	   public int makeBigger(int cnt){
		   cnt--;
		   return cnt;
	   }
	   
	   
	   public void actionPerformed(ActionEvent e){
		  if(e.getSource()==pushButton){
			  cnt++;
			  makeBigger(cnt);
			  list.setFixedCellHeight(15+cnt);
			 try{
			 pushZahl= Double.parseDouble(zahl.getText());
			 myvalues.push(pushZahl);
			 zahl.setText(null);
			 }
			 catch(Exception e1){};
		  }else if(e.getSource()==add){
			  myvalues.addiere();
			  
		  }else if(e.getSource()==sub){
			  myvalues.subtrahiere();
		  }else if(e.getSource()==mult){
			  myvalues.multipliziere();
		  }else if(e.getSource()==div){
			  try {
				myvalues.dividiere();
			} catch (ZeroDivisionException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		  }
		
		   repaint();
	   }

	public void notifyOberservers() {
		repaint();
		
		
	}
}



Code:
	import java.awt.BorderLayout;
	import java.awt.Color;
	import java.awt.Container;
	import java.awt.event.ActionEvent;
	import java.awt.event.ActionListener;
	
	import javax.swing.*;
	import javax.swing.JFrame;
	import javax.swing.JList;
	import javax.swing.JPanel;
	import javax.swing.JScrollPane;
	import javax.swing.JTextField;
	

	public class StackViewer extends JFrame { 

	  StackPanel panel;
	  Stack model;
	  
	    
	   public StackViewer(String titel){ 
	      super(titel); 
	      
	  
	      Container cp=getContentPane(); 
	      cp.setLayout(new BorderLayout()); 
	     
	      
	      
	      model=new Stack();
	      
	      panel=new StackPanel(model);
	      
	      cp.setLayout(new BorderLayout());
	     
	      cp.add(panel);
	    
	   } 
	   
	   public static void main(String[] args){ 
	   

	      StackViewer sv= new StackViewer("Stack-Maschine"); 
	      sv.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	      sv.setSize(630,320); 
	      sv.setLocation(300,300); 
	      sv.setVisible(true); 
	  }
	
	}




Code:
public class ZeroDivisionException extends Exception {
	
	ZeroDivisionException(String e){
		super(e);
	}
	

}


Code:
public class NoElementException extends Exception {
	
	public NoElementException(String e){
		super(e);
	}

}


Code:
public interface NotificationReceiver {
	
	public void notifyOberservers();

}

Danke Mic für deine Hilfe!! :applaus:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A stack Java Basics - Anfänger-Themen 14
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
V Ist Off-Heap-Speicher dasselbe wie Stack-Speicher? Java Basics - Anfänger-Themen 2
izoards Stack... Java Basics - Anfänger-Themen 17
Csircc Rekursive Methode Stack Overflow Java Basics - Anfänger-Themen 10
B Zahlenfolge von Queue in Stack Java Basics - Anfänger-Themen 29
L Stack bilden, push und pop Java Basics - Anfänger-Themen 16
KogoroMori21 Stack und Heap Speicher Java Basics - Anfänger-Themen 1
G Stack und Queue Arbeitsblatt Java Basics - Anfänger-Themen 3
G Stack programmieren Java Basics - Anfänger-Themen 6
Z Datentypen Stack based calculator Java Basics - Anfänger-Themen 8
F speicherort stack oder heap Java Basics - Anfänger-Themen 1
S Rekursiven Stack Java Basics - Anfänger-Themen 6
Curtis_MC Collections Zufälliges Element aus Stack Java Basics - Anfänger-Themen 2
D Queue vs. Stack Java Basics - Anfänger-Themen 6
P Stack, Heap Java Basics - Anfänger-Themen 13
D Erste Schritte Stack im Rollenspiel Java Basics - Anfänger-Themen 76
J Stack mit Benutzereingabe Java Basics - Anfänger-Themen 17
J Liste,Queue,Stack sortieren Java Basics - Anfänger-Themen 2
C Stack und Queue in Aktion (Bitte Hilfe für die Klausur) Java Basics - Anfänger-Themen 7
S Sequenz von Zahlen bei einem Stack möglich oder nicht möglich? Java Basics - Anfänger-Themen 5
E Stack vs Queue - Gemeinsamkeiten / Unterschiede Java Basics - Anfänger-Themen 7
C Laufzeit von Stack Operation Java Basics - Anfänger-Themen 5
4 Stack over flow bei rekursiver Tiefensuche Java Basics - Anfänger-Themen 5
J Quicksort mit Stack Java Basics - Anfänger-Themen 4
A Anzahl der Elemente in einem Stack wiedergeben Java Basics - Anfänger-Themen 3
T Stack Overflow - Rekursive Fibonacci Java Basics - Anfänger-Themen 10
K Tiefen- und Breitensuche beim Baum durch Stack und Warteschlange Java Basics - Anfänger-Themen 1
L Liste mittels Stack implementieren Java Basics - Anfänger-Themen 0
A Stack programmieren -> Unklarheiten Java Basics - Anfänger-Themen 1
C Stack - listenbasierte Implementierung Java Basics - Anfänger-Themen 4
L Mit rekursiven Aufrufen einen Stack emulieren Java Basics - Anfänger-Themen 1
T Frage zu Java Stack Java Basics - Anfänger-Themen 5
D Stack-Objekt - LIFO - wait(); notify(); Java Basics - Anfänger-Themen 0
J Array von Objekten, wie schauts im Heap / Stack aus ? Java Basics - Anfänger-Themen 7
M Frage zu Stack und Heap Java Basics - Anfänger-Themen 1
Farbenfroh Suche Übungsaufgaben: BinaryTree, Stack Java Basics - Anfänger-Themen 0
D Aufgabe: Stack mit Iterator Java Basics - Anfänger-Themen 8
X Stack mit Oberklasse, wieso funktioniert es nicht? Java Basics - Anfänger-Themen 8
B Stack/Heap Frage Java Basics - Anfänger-Themen 36
K Probleme mit stack Java Basics - Anfänger-Themen 7
K Wofür wird heute noch die Stack Klasse in Java genutzt Java Basics - Anfänger-Themen 4
F Rekursion Tiefensuch-Problem - Stack Overflow Java Basics - Anfänger-Themen 9
P LinkedList - Stack ... grundlegende Frage Java Basics - Anfänger-Themen 5
B Stack in eine verkettete Liste pushen Java Basics - Anfänger-Themen 4
J OOP Warum braucht man den Stack Java Basics - Anfänger-Themen 3
B Queue mit Daten aus einem Stack füllen Java Basics - Anfänger-Themen 21
G Stack invertieren Java Basics - Anfänger-Themen 3
H Pseudo-Stack (char[] stackArray) mit Zeichen aus einer .txt-Datei befüllen Java Basics - Anfänger-Themen 5
S Stack Problem mit Objekt Java Basics - Anfänger-Themen 2
X String mit String von Objekt im Stack vergleichen? Java Basics - Anfänger-Themen 14
D Stack auslesen mit pop Java Basics - Anfänger-Themen 2
S Stack als verkettete liste/ toString methode Java Basics - Anfänger-Themen 3
S Exceptions bei push/pop in Stack Java Basics - Anfänger-Themen 8
S Eigene Stack Klasse Java Basics - Anfänger-Themen 26
S Stack: Klasseninvariante Java Basics - Anfänger-Themen 4
L OOP Wrapper Klassen - Stack-Aufgabe Java Basics - Anfänger-Themen 2
M Frage zu Stack Java Basics - Anfänger-Themen 3
D Problem mit Set, Stack und Random Java Basics - Anfänger-Themen 2
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
T Probleme bei einen Stack der über drei Dateien funktionieren soll Java Basics - Anfänger-Themen 5
V java.util.Stack Java Basics - Anfänger-Themen 9
K Stack und immer gleiches Objekt Java Basics - Anfänger-Themen 11
kulturfenster Stack / Queue Implementationen Java Basics - Anfänger-Themen 11
S Stack einlesen. Java Basics - Anfänger-Themen 2
E Stack kann nicht implimentiert werden Java Basics - Anfänger-Themen 11
E Eigene Stack Klasse schreiben Java Basics - Anfänger-Themen 12
J Stack Java Basics - Anfänger-Themen 3
K min-int-Wert in'nem Stack Java Basics - Anfänger-Themen 8
L Stack UpnRechner Java Basics - Anfänger-Themen 4
B Stack mit Bildern füllen Java Basics - Anfänger-Themen 2
B Stack mit Strings in zufälliger Reihenfolge füllen Java Basics - Anfänger-Themen 4
J Stack, der Integer-Zahlen enthält Java Basics - Anfänger-Themen 3
K Array Stack Java Basics - Anfänger-Themen 6
O Stack-Klasse Java Basics - Anfänger-Themen 7
S Stack mit Arrays Java Basics - Anfänger-Themen 3
T generischer stack Java Basics - Anfänger-Themen 3
Z Keller/Stack Problem Java Basics - Anfänger-Themen 11
H Stack und Queue Java Basics - Anfänger-Themen 6
M Stack SetValTop Java Basics - Anfänger-Themen 6
G Die Klasse Stack selber schreiben. Java Basics - Anfänger-Themen 2
F Klammertest mit Stack implementieren Java Basics - Anfänger-Themen 5
X Stack Java Basics - Anfänger-Themen 14
J Morgen Java-Klausur. Stack, Heap, Method-Area Java Basics - Anfänger-Themen 2
H Unterschied zwischen Stack und Array Java Basics - Anfänger-Themen 3
F MergeSort iterativ mit Hilfe von Stack Java Basics - Anfänger-Themen 5
S stack Java Basics - Anfänger-Themen 3
S Stack invertieren Java Basics - Anfänger-Themen 14
S Stack.pop() wie genau funktioniert das? Java Basics - Anfänger-Themen 3
A Stack, Frage zur Methode push Java Basics - Anfänger-Themen 4
C Anzahl der Elemente auf einem Stack Java Basics - Anfänger-Themen 4
D Stack chaos Java Basics - Anfänger-Themen 2
megachucky kleines problem mit nem STACK Java Basics - Anfänger-Themen 8
I Stack ist auf einmal empty Java Basics - Anfänger-Themen 3
R Beispiele für Stack & Visualisierung Java Basics - Anfänger-Themen 2
R Stack: Wieso funktioiert das? Java Basics - Anfänger-Themen 2
B eine kleine leichte aufgabe mit einem stack programmieren Java Basics - Anfänger-Themen 2
N Stack-Probleme Java Basics - Anfänger-Themen 2
K Stack Overflow Java Basics - Anfänger-Themen 2
H Frage zu arithmetischen Operationen Java Basics - Anfänger-Themen 20

Ähnliche Java Themen

Neue Themen


Oben