# Stack-Operationen



## Sindbad1983 (17. Mai 2005)

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??




```
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?


----------



## Roar (17. Mai 2005)

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 (17. Mai 2005)

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


----------



## Sindbad1983 (17. Mai 2005)

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: 



```
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();
		
	}
	
	



}
```

----------


```
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 (17. Mai 2005)

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 (17. Mai 2005)

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 (17. Mai 2005)

> 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.



das möcht ich tun!  :wink:


----------



## Sindbad1983 (17. Mai 2005)

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 (17. Mai 2005)

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 (17. Mai 2005)

1.0  5.0  53.0  


 :lol:   :lol: 

es geht! 


```
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 (17. Mai 2005)

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 (17. Mai 2005)

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


bei mir passt aber eh die Ausgabe oder?



```
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.


```
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 (17. Mai 2005)

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 (18. Mai 2005)

ok meinst du das?




```
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 (18. Mai 2005)

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:


```
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 (18. Mai 2005)

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 (18. Mai 2005)

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! :-(



```
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();
		
	}
	
	



}
```

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


```
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 (18. Mai 2005)

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 (18. Mai 2005)

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 (18. Mai 2005)

So sollte es klappen:


```
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);
   }
}
```


```
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 (18. Mai 2005)

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 (18. Mai 2005)

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  



```
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!   

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


----------



## mic_checker (18. Mai 2005)

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 (18. Mai 2005)

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?


----------



## Sindbad1983 (18. Mai 2005)

ok...stimmt...hast Recht...super!
Danke! Hauptsache es geht! ;-)


----------



## mic_checker (18. Mai 2005)

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 (18. Mai 2005)

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 (18. Mai 2005)

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?


----------



## Sindbad1983 (18. Mai 2005)

naja..die Zahlen sollen auf der rechten Seite untereinander stehen!


----------



## mic_checker (18. Mai 2005)

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 (19. Mai 2005)

wie kann ich die Größe des Fensters bestimmen, das geöffnet wird(in dem dann der Inhalt zu sehen ist)...


----------



## mic_checker (19. Mai 2005)

getSize() ?


----------



## Sindbad1983 (20. Mai 2005)

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: 






```
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 (20. Mai 2005)

Probiers mal so (hab die imports jetzt weggelassen):


```
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 (20. Mai 2005)

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 (22. Mai 2005)

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!



```
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 (22. Mai 2005)

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 (22. Mai 2005)

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?


```
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
		
	} 



	
}
```

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


```
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); 
	  }
	
	}
```

--------



```
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 (22. Mai 2005)

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:


```
input.add(...);
```

das:


```
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....


----------



## Gast (22. Mai 2005)

im Forums Chat??


----------



## Sindbad1983 (22. Mai 2005)

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



```
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 (22. Mai 2005)

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 (22. Mai 2005)

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 (23. Mai 2005)

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!
---------------------


```
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! 


```
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 (23. Mai 2005)

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 (23. Mai 2005)

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


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

Sollte eigentlich so klappen, falls nicht sag bescheid.


----------



## Sindbad1983 (23. Mai 2005)

ok...i checks..werds schnell ausprobiern


----------



## Sindbad1983 (23. Mai 2005)

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 (23. Mai 2005)

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 (24. Mai 2005)

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?   

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



```
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
		
	} 



	
}
```




```
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();
		
		
	}
}
```




```
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); 
	  }
	
	}
```





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

}
```



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

}
```



```
public interface NotificationReceiver {
	
	public void notifyOberservers();

}
```

Danke Mic für deine Hilfe!! :applaus:


----------



## mic_checker (24. Mai 2005)

was meinst du damit "wenn du zwei fenster öffnest" ? Meinst du wenn du deinen StackViewer zweimal startest oder was?

Ansonsten kann ich wohl erst wieder heute abend Code posten....


----------



## Sindbad1983 (24. Mai 2005)

naja..welchen Sinn hat dann eigentlich das MVC?
->Dass bei Veränderung des Models alle Sichten benachrichtigt werden, oder täusch ich mich?
->das heißt alle Views werden aktualisiert..

also bei mehreren offenen Fenstern müsste das eigentlich der Fall sein, oder?


----------



## Wildcard (24. Mai 2005)

Hab mir jetzt nicht den ganzen Thread durchgelesen, aber wo hast du jetzt 2 Fenster her, beziehungsweise wie öffnest du das 2. Fenster?
Teilen sie sich ein Model oder haben sie verschiedene?


----------



## mic_checker (24. Mai 2005)

Was anderes:
Dein pop() müsstest du noch etwas ändern, du überprüfst ob size() < 2 ist, aber wenn du poppen() willst reicht es wenn ein Element auf dem Stack liegt, Ansonsten kommt halt beim zweiten pop() der Fehler.....

Verstehe immer noch nicht genau was du mit zwei Fenstern meinst? Zwei StackViewer?


----------



## Sindbad1983 (24. Mai 2005)

Ja..im Eclipse kann man ja mehrere StackViewer öffnen...

naja..is egal!

Ich hab jetzt grad versucht einen KeyListener zu implementieren!
Muss ich diesen KeyListener beim Input-Panel anmelden oder?

Die Zahl, die ich in das Textfield schreibe soll gepushed werden, nachdem ich die Enter-Taste gedrückt hab!
geht leider nicht!  :cry: 




```
public class StackPanel extends JPanel implements ActionListener, KeyListener, 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();
		   
		   //Registrierung
		   general.addKeyListener(this);
		  
		   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();
		   
		   //Registrierung
		 //  input.addKeyListener(this);  ->>mit dem gehts auch nicht
		   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();
		
		
	}

	public void keyTyped(KeyEvent event) {
		
		
	}

	public void keyPressed(KeyEvent event) {
		if(event.getKeyChar()==KeyEvent.VK_ENTER){
			try{
			 pushZahl= Double.parseDouble(zahl.getText());
			 myvalues.push(pushZahl);
			 zahl.setText(null);
			}catch(Exception e){};
		
		}
		repaint();
	}

	public void keyReleased(KeyEvent event) {
		// TODO Auto-generated method stub
		
	}
}
```


----------



## Sindbad1983 (24. Mai 2005)

ich versteh das nicht!
Ich such da stundenlang nach Fehlern und find aber keinen bzw. die richtige Lösung! 
Wie macht ihr das?
Habt ihr nen Tipp für mich?
Oder ist das einfach nur die Erfahrung, die da weiterhilft?


----------



## Wildcard (24. Mai 2005)

Wenn du das Programm mehrmals startest sind die unabhängig voneinander, was bedeutet das sie auch unterschiedliche Models haben und sich deshalb natürlich nicht gegenseitig aktualisieren. Währ ja auch ziemlich dämlich...  :wink: 
KeyEvents werden nur gefeuert wenn die Komponente auch den Focus hat. Ein Panel ist von Natur aus erst mal nicht fokusierbar, du musst daher noch 

```
input.setFocusable(true) ;
```
aufrufen


----------



## Sindbad1983 (24. Mai 2005)

:lol:  8)  :lol: 

ok..ich bin selber draufgekommen!!  :bae: 

Man muss das TextField registrieren und nicht das JPanel!! 


```
zahl=new JTextField(8);
zahl.addKeyListener(this);
```


----------



## Sindbad1983 (24. Mai 2005)

also mit deinem Vorschlag funktionierts leider nicht!  :cry: 



```
JPanel input=new JPanel();
		   input.addKeyListener(this);
		   input.setFocusable(true);
```


----------



## Wildcard (24. Mai 2005)

hast du auch auf das Panel draufgeklickt oder input.requestFocus() aufgerufen?
Ist aber auch egal, wenn der Listener sowieso für das TextFeld bestimmt ist, ist er da auch besser aufgehoben. Dachte nur do wolltest einen Listener auf dem Panel haben.  :wink:


----------

