# Java-Test



## baenker (11. Jan 2005)

Hallo zusammen,

aller Anfang ist schwer...das trifft wohl folgende Sache zu.
Ich bin blutiger Anfänger und habe bis Donnerstag (übermorgen, 24.00) eine Aufgabe zu bewältigen, die ich schon angefangen habe. Leider stecke ich fest und weiß nicht wo mein Fehler liegt.
Mein Code ist ziemlich lang, vielleicht (wahrscheinlich) gibt es Kürzungsmöglichkeiten.

Die Aufg.-Stellung lautet wie folgt:
Entwickeln Sie für Ihr java-Programm zur Ratentilgung ein GUI-Fenster, um die Eingabe von Kredit, Zinssatz und Laufzeit über Textfelder zu erfassen. Die Ausgabe des vollständigen Tilgunsplanes soll über geeignete GUI-Klassen z.B. einer Textarea im Fenster erfolgen.

Für eure Hilfe bin ich sehr dankbar.
Bekommt jemand meinen Code funktionsfähig hin?


```
import java.awt.*;
import java.awt.event.*;
import java.text.*;

class Ratentilgung
{
	// enthält die main-Funktion 
	public static void main(String[] arg){
		
		// eine Instanz von MeinFenster konstruieren
		MeinFenster fenster = new MeinFenster();
		
		// Fenster sichtbar machen
		fenster.setVisible(true); 
		
	}// end of main
}// end of class Ratentilgung


// Hier kommt die Definition meiner Fensterklasse 
class MeinFenster extends Frame
{
	// Instanzvariablen
	TextField
		tfKreditbetrag,
		tfZinssatz,
		tfLaufzeit;
	
	Label
		lbName;
	
	Button
		butBerechne;
		
	// TextArea
	TextArea
		textPlan;
		
		
	
	// Konstruktor
	public MeinFenster()  // default oder standard-Konstruktor
	{	
		// Titelleiste -----------------------------------------
		super("Kredit-Manager v1.0");
		
		// Größe des Fensters festlegen
		this.setSize(600, 500); // in Pixel Breite / Höhe
		
		// Layout einstellen -----------------------------------
		GridBagLayout grid = new GridBagLayout();
		GridBagConstraints constr = new GridBagConstraints();
		this.setLayout(grid);
		
		// Farbe Hintergrund
		setBackground(Color.ORANGE);
		
		
		
		// GUI-Komponente konstruieren und aufs Fenster legen---Zeile1----------
		lbName = new Label("Kreditbetrag");
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = 1;
		this.add( lbName, constr);
		
		
		// GUI-Komponente konstruieren
		// Constraints festlegen
		// Komponente auf das Fenster legen
		tfKreditbetrag = new TextField(" ", 10);
		constr.anchor = GridBagConstraints.WEST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( tfKreditbetrag, constr);


		// GUI-Komponente konstruieren 
		// Constraints festlegen
		// Komponente auf das Fenster legen
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr);


		// GUI-Komponente konstruieren----Zeile2------------------------------------- 
		// Constraints festlegen
		// Komponente auf das Fenster legen
		lbName = new Label("Zinssatz");
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = 1;
		this.add( lbName, constr);
		
		
		// GUI-Komponente konstruieren
		// Constraints festlegen
		// Komponente auf das Fenster legen
		tfZinssatz = new TextField(" ", 4);
		constr.anchor = GridBagConstraints.WEST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( tfZinssatz, constr);


		// GUI-Komponente konstruieren 
		// Constraints festlegen
		// Komponente auf das Fenster legen
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr);


		// GUI-Komponente konstruieren----Zeile3------------------------------------- 
		// Constraints festlegen
		// Komponente auf das Fenster legen
		lbName = new Label("Laufzeit");
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = 1;
		this.add( lbName, constr);
		
		
		// GUI-Komponente konstruieren
		// Constraints festlegen
		// Komponente auf das Fenster legen
		tfLaufzeit = new TextField(" ", 2);
		constr.anchor = GridBagConstraints.WEST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( tfLaufzeit, constr);


		// GUI-Komponente konstruieren 
		// Constraints festlegen
		// Komponente auf das Fenster legen
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr);



		// GUI-Komponente konstruieren----Zeile4------------------------------------
		// Constraints festlegen
		// Komponente auf das Fenster legen
		butBerechne = new Button("Berechne");
		constr.fill = GridBagConstraints.BOTH; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( butBerechne, constr);


		// GUI-Komponente konstruieren 
		// Constraints festlegen
		// Komponente auf das Fenster legen
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr);



		// GUI-Komponente konstruieren----Zeile5------------------------------------
		// Constraints festlegen
		// Komponente auf das Fenster legen
		textPlan = new TextArea(10,70);  // Höhe/Breite
		textPlan.setEditable(true);
		constr.gridx = 0; 
		constr.gridy = 8;
		this.add( textPlan, constr);


		// GUI-Komponente konstruieren 
		// Constraints festlegen
		// Komponente auf das Fenster legen
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr);


		this.setVisible(true);
		
		
		// ------------------------------------------
		// Listener anbinden ------------------------
		butBerechne.addActionListener( new MeinActionAdapter());
		this.addWindowListener( new MeinWindowAdapter());
		
		
	}// end of Konstruktor
	
	// weitere Methoden ----------------------------------
	
	
	// innere Klassen ------------------------------------
	
	
	
	// Bei einer Interface-Klasse müssen alle Methoden implementiert werden! 
	class MeinActionAdapter implements ActionListener
	{
		public void actionPerformed( ActionEvent event )
		{
			String strKreditbetrag = tfKreditbetrag.getText();
			String strZinssatz = tfZinssatz.getText();
			String strLaufzeit = tfLaufzeit.getText();
			String strBeschriftung = new String("Jahr   Schuld     Zinsbetrag   Tilgungsrate   Annuitaet   ");
			double erg = 0;
			
			textPlan.append(strBeschriftung);			

			
		}// end of Methode actionPerformed
		
	} // end of inner class MeinActionAdapter
	
		
	// Bei einer Interface-Klasse müssen alle Methoden implementiert werden! 
	class MeinWindowAdapter implements WindowListener
	{
		public void windowOpened( WindowEvent event )
		{
			// leerer Implementierungsblock
		}
		
		public void windowClosed( WindowEvent event )
		{
		}
		
		public void windowClosing( WindowEvent event )
		{
			System.out.println("Fenster geschlossen. Sie koennen dieses Fenster jetzt auch schliessen.");
			
			dispose(); // gibt Ressourcen frei
			
			System.exit(0); // Exitus vom Programm
		}
		
		public void windowIconified( WindowEvent event )
		{
			System.out.println("Fenster minimiert");
		}
		
		public void windowDeiconified( WindowEvent event )
		{
			System.out.println("Fenster aufgeklappt");
		}
		
		public void windowActivated( WindowEvent event )
		{
		}
		
		public void windowDeactivated( WindowEvent event )
		{
		}
			
	}// end of inner class MeinWindowAdapter
	
	
}//end of class MeinFenster

class Tilgung
 	{
 		//Membervariablen
 		double kredit;
 		double zinssatz;
 		int laufzeit;
 		double tilgungsrate;
 	
 	
 		//Konstruktor
 		public Tilgung()
 		{
 			kredit = Double.parseDouble(strKreditbetrag);
 			zinssatz = Double.parseDouble(strZinssatz);
 			laufzeit = Double.parseDouble(strLaufzeit);
 			tilgungsrate = 0;
 		}
 	
 		public Tilgung(double kredit, double zinssatz, int laufzeit)
 		{
 			this.kredit=kredit;
 			this.zinssatz=zinssatz;
 			this.laufzeit=laufzeit;
 		}
 	
 	
 		//Festlegung des Dezimalformats ohne Kommastellen
 		DecimalFormat dFormat = new DecimalFormat ("###,###");
 	
 		//Methoden
 		public void gibTilgungsplanAus()
 		{
 			double gesamtZinsen = 0;	//für die Berechnung der Gesamtzinsen
 			double gesamtAnnuitaet = 0;	//für die Berechnung der Gesamtannuitaet
 		
 			for (int x=0; x<=6; x++)
 			{
 				//für die Nummerierung am Anfang
				textPlan.append("  "+(x+1)+".   ");
 			
 				//restschuld
 				double restschuld=kredit-(x*(kredit/laufzeit));
 				if(restschuld<100000)
 				{
 					System.out.print(" "+dFormat.format(restschuld));
 				}
 				else
 				{
 				System.out.print(dFormat.format(restschuld));
 				}
 			
 				//zinsbetrag
 				double zinsbetrag=(kredit-(x*(kredit/laufzeit)))*zinssatz/100;
 				if(zinsbetrag<10000)
 				{
 					System.out.print("        "+dFormat.format(zinsbetrag));
 				}
 				else
 				{
 					System.out.print("       "+dFormat.format(zinsbetrag));
 				}
 			 			
 				//tilgungsrate
 				double tilgungsrate=kredit/laufzeit;
 				System.out.print("        "+dFormat.format(tilgungsrate));
 			
 				//annuitaet
 				double annuitaet=((kredit-(x*(kredit/laufzeit)))*zinssatz/100)+(kredit/laufzeit);
 				System.out.println("        "+dFormat.format(annuitaet));
 			
 				//Gesamt-Zinsen
 				gesamtZinsen = zinsbetrag + gesamtZinsen;
 			
 				//Gesamt-Annuitaet
 				gesamtAnnuitaet = annuitaet + gesamtAnnuitaet;
 			}
 			System.out.println("\nZinsen gesamt:    "+dFormat.format(gesamtZinsen));
 			System.out.println("Annuitaet gesamt: "+dFormat.format(gesamtAnnuitaet));
 		}
	}// end of class Tilgung
```


----------



## bellmann29 (11. Jan 2005)

Bekommst Du denn irgendwelche Fehlermeldungen oder kompiliert Dein Code gar nicht?

In der Klasse Tilgung, erster Konstrukter ( wo kommen den die strKreditbetrag , strZinssatz, strLaufzeit her) ?

Poste mal ein paar Fehlermeldungen.


----------



## baenker (11. Jan 2005)

Ich bekomme Fehlermeldungen. Die Fehler sind u.a. anscheinend in Zeile 266, 267, 268 (cannot resolve symbol variablestrKredit...)und 292. Bei Zeile 268 kommt weitere Fehlermeldung (possible loss of precision).

Ich habe strKreditbetrag, strZinssatz und strLaufzeit aus der Klasse MeinFenster, innere Klasse meinActionAdapter durch "get" als Strings geholt.


----------



## mic_checker (12. Jan 2005)

Zeilen 266-268:

```
kredit = Double.parseDouble(strKreditbetrag);
         zinssatz = Double.parseDouble(strZinssatz);
         laufzeit = Double.parseDouble(strLaufzeit);
```

Der Compiler sucht in deiner Klasse nach Attributen mit dem Namen strKreditbetrag,strZinssatz,strLaufzeit. Doch diese kann er nicht finden -> Cannot resolve symbol.

Es ist ja schön und gut wenn du diese Attribute in MeinFenster deklariert hast, aber von deiner Klasse aus hast du so keinen Zugriff auf diese Attribute.

Um das zu ändern gibts verschieden herangehensweisen, je nachdem wie du es wünschst...Du könntest erstmal die Deklaration aus MeinActionAdapter rausholen, an den Anfang von MeinFenster. Wenn du sie dort statisch deklarierst, kannst du per MeinFenster.name darauf zugreifen...Weiss jetzt natürlich nicht ob das zur übrigen Implementierung von dir passt - musst selber wissen.



```
laufzeit = Double.parseDouble(strLaufzeit);
```

Hier weist du nem int-Wert etwas aus double zu, der Wertebereich von double ist aber größer als der von int, deshalb warnt der compiler das möglicherweise Informationen "verloren" gehen (loss of precision)...


----------



## mic_checker (12. Jan 2005)

Also hab mir mal gerad kurz deinen Code angesehen, du kannst das Problem auch einfacher "umgehen":


```
class Tilgung
{
	double kredit;
   double zinssatz;
   double laufzeit;
   double tilgungsrate = 0;   
   
   public Tilgung()
   {
   	this(0,0,0);
   }
   
   public Tilgung(String betrag,String zinssatz,String laufzeit)
   {
		this(Double.parseDouble(betrag),Double.parseDouble(zinssatz),Double.parseDouble(laufzeit));   
	}
   
   public Tilgung(double kredit, double zinssatz, double laufzeit)
   {
   	this.kredit=kredit;
      this.zinssatz=zinssatz;
      this.laufzeit=laufzeit;
   }
...
```

Beim Aufruf vom Konstruktor musst du natürlich sicherstellen das korrekte Werte eingelesen wurden, da sonst NumberFormatException, bzw. NullPointerException ausgelöst werden könnten.

Du willst bei der Berechnung sicher ein neues Objekt vom Typ Tilgung anlegen oder?

Das könntest du dann mit deiner bisherigen Deklaration so machen:


```
class MeinActionAdapter implements ActionListener
   {
      public void actionPerformed( ActionEvent event )
      {
....
Tilgung ti = new Tilgung(strKreditbetrag,strZinssatz,strLaufzeit);
      }      
   }
```

Da du einen neuen Konstruktor zur Verfügung stellst, sollte es jetzt keine Probleme bereiten. Btw. hab laufzeit einfach mal double deklariert (oben) um loss of precision zu vermeiden.

Weiss net ob das restliche Prog funzt...konnts noch net genau testen.

hoffe konnte helfen.

greets
mic_checker


----------



## KSG9|sebastian (12. Jan 2005)

funktioniert es? 

Was anderes: Ich muss dich loben, du bist seid ner Woche glaub ich der erste, der gerne Hilfe zu ner Aufgabe hätte, und selber nen Ansatz (fast ne fertige Lösung eigentlich) mitbringt. Die anderen Themen waren eigentlich immer das gleiche..
Irgendeiner hat ne Aufgabe bekommen, die hat er hier kurz reingetippt, selber aber nichtmal verstanden, und dann wollt er ne Lösung. Drunter kam dann immernoch sowas wie

"Leider hab ich von Java keine Ahnung und hab auch die Stunden net besucht"

Echt gut , weiter so


----------



## mic_checker (12. Jan 2005)

Hi,
also ich glaub noch was anderes ist nicht ganz so wie du es ursprünglich beabsichtigt hast:


```
String strBeschriftung = new String("Jahr   Schuld     Zinsbetrag   Tilgungsrate   Annuitaet   ");
```

Diese Beschriftung hängt du an das TextFeld an, in gibTilgungsplanAus() hängst du dann die einzelnen Jahre (1....6) ebenfalls an.....Da musst wohl noch ein newline Zeichen einfügen, damit du sowas kriegst:

Jahr     Schuld    Zinsbetrag     Annuitaet
1          ......        ..........        ........
2          ......


----------



## baenker (12. Jan 2005)

Cool...jetzt funktioniert es.
Nun noch die Formatierung etwas anpassen und dann ist alles bestens.
Vielen Dank an alle Beteiligten.


----------



## Gast (6. Sep 2007)

Hi, 

ich habe eben dein Code verbessert versucht aber ich bekomme immernoch eine fehlermeldung.
Könntest du die Endversion mal reinstellen?

Danke dir.

Sindy


----------



## Murray (6. Sep 2007)

Gast hat gesagt.:
			
		

> Hi,
> 
> ich habe eben dein Code verbessert versucht aber ich bekomme immernoch eine fehlermeldung.
> Könntest du die Endversion mal reinstellen?
> ...


Laut seinem Profil war Baenker das letze Mal vor über zwei Jahren hier im Forum - die Wahrscheinlichkeit, dass er diesen Post liest, ist also nicht sehr hoch. Entweder schickst du ihm eine PN, oder du postest deinen Code zusammen mit der Fehlermeldung.


----------



## merlin2 (6. Sep 2007)

Als Gast kann man keine PNs versenden (oder irre ich mich? ???:L ).
Ansonsten schließe ich mich Murray an - poste den vollständigen Code mit Fehlermeldung.


----------

