# Berechnungsprogramm für Gewicht / fehlerbehaftet



## baenker (18. Jan 2005)

Hallo Leute,

ich habe ein kleines Programm geschrieben, in dem der Benutzer folgende Eingaben machen soll.
- Eingabe der Größe (Textfeld)
- Eingabe des Gewichts (Textfeld)
- Eingabe des Geschlechts (Radiobuttons).

Konnte leider noch nicht compiliert werden, weil ich den String-Wert des Radiobuttons nicht übergeben bekomme. Betrifft beides die class ItemAdapter und MeinActionAdapter.

Kann mir jemand weiterhelfen?


```
import java.awt.*;  // werden für die GUI-Komponenten gebraucht
import java.awt.event.*;  // werden für die Eventbehandlung gebraucht

/**
 * Beschreibung:
 * 
 */
class Gewicht
{
	public static void main(String[] arg)
	{
		MeinFenster fenster = new MeinFenster();
		
		fenster.setVisible(true); 

	}// end of main
}// end of class Gewicht

/**
 * Beschreibung:
 * 
 *
 */

class MeinFenster extends Frame
{
	/**
	 * Instanzvariablen werden deklariert, damit die Komponenten in
	 * anderen Methoden verwendet werden können
	 */
	TextField
		tfKoerpergroesse,
		tfKoerpergewicht;
	
	CheckboxGroup 
		cbGeschlecht;
	
	Checkbox
		cbMann,
		cbFrau;
			
	Label
		lbText;
	
	Button
		butWerteAus;
		
	TextArea
		textAusgabewerte;
		

	/**
	 * Konstruktor
	 * @param tfKoerpergroesse= Eingabefeld zur Erfassung der Körpergröße
	 * @param tfKoerpergewicht= Eingabefeld zur Erfassung des Körpergewichts
	 * @param cbGeschlecht= Checkbox, zum Auswählen des jeweiligen Geschlechts
	 * @param lbText= Beschreibung der einzelnen Textfelder
	 * @param butWerteAus= Button zum Berechnen/Auswerten der eingegebenen Daten
	 * @param textAusgabewerte= ausgewertete Text, der in die Textarea geschrieben wird
	 *
	 * Beschreibung:
	 * In dieser Klasse wird mein Fenster durch Vorgaben eingestellt.
	 */
	public MeinFenster()  // Standard-Konstruktor
	{	
		// Titelleiste des Fensters ----------------------------------
		super("Gewicht-Ratgeber v1.0");
		
		// Größe des Fensters wird festgelegt ------------------------
		this.setSize(600, 500); // in Pixel Breite / Höhe
		
		// Layout wird eingestellt -----------------------------------
		GridBagLayout grid = new GridBagLayout();
		GridBagConstraints constr = new GridBagConstraints();
		this.setLayout(grid);
		
		// Hintergrund wird eingestellt bzw. festgelegt --------------
		setBackground(Color.ORANGE);
		
		/**
		 * GUI-Komponente wird jeweils konstruiert
		 * Constraints werden jeweils festgelegt
		 * Komponente wird jeweils auf das Fenster gelegt
		 *
		 * für 1.Zeile
		 */
		lbText = new Label("Der persönliche Gewicht-Ratgeber für Ihren Körper"); 
		lbText.setFont(new Font ("Helvetica", Font.BOLD,14));
		constr.anchor = GridBagConstraints.EAST;  
		constr.gridwidth = 1;
		this.add( lbText, constr);
		
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr); 
		
		/**
		 * GUI-Komponente wird jeweils konstruiert
		 * Constraints werden jeweils festgelegt
		 * Komponente wird jeweils auf das Fenster gelegt
		 *
		 * für 2.Zeile
		 */
		lbText = new Label("Körpergröße"); 
		lbText.setFont(new Font ("Helvetica", Font.BOLD,14));
		constr.anchor = GridBagConstraints.EAST;  
		constr.gridwidth = 1;
		this.add( lbText, constr); 
		 
		tfKoerpergroesse = new TextField("", 10);
		constr.anchor = GridBagConstraints.WEST; 
		constr.gridwidth = GridBagConstraints.REMAINDER; 
		this.add( tfKoerpergroesse, constr);
		
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr); 

		/**
		 * GUI-Komponente wird jeweils konstruiert
		 * Constraints werden jeweils festgelegt
		 * Komponente wird jeweils auf das Fenster gelegt
		 *
		 * für 3.Zeile
		 */
		lbText = new Label("Körpergewicht");
		lbText.setFont(new Font ("Helvetica", Font.BOLD,14));
		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = 1;
		this.add( lbText, constr);
		
		tfKoerpergewicht = new TextField("", 4);
		constr.anchor = GridBagConstraints.WEST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( tfKoerpergewicht, constr);

		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr);

		/**
		 * GUI-Komponente wird jeweils konstruiert
		 * Constraints werden jeweils festgelegt
		 * Komponente wird jeweils auf das Fenster gelegt
		 *
		 * für 4.Zeile
		 */
		cbGeschlecht = new CheckboxGroup();
		cbMann = new Checkbox ("Mann", cbGeschlecht, true);
		cbFrau = new Checkbox ("Frau", cbGeschlecht, false);
		constr.anchor = GridBagConstraints.WEST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( cbMann, constr);
		this.add( cbFrau, constr);

		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr);

		/**
		 * GUI-Komponente wird jeweils konstruiert
		 * Constraints werden jeweils festgelegt
		 * Komponente wird jeweils auf das Fenster gelegt
		 *
		 * für 5.Zeile
		 */
		butWerteAus = new Button("Werte aus");
		butWerteAus.setBackground(Color.RED);
		constr.fill = GridBagConstraints.BOTH; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( butWerteAus, constr);

		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr);

		/**
		 * GUI-Komponente wird jeweils konstruiert
		 * Constraints werden jeweils festgelegt
		 * Komponente wird jeweils auf das Fenster gelegt
		 *
		 * für 6.Zeile
		 */
		textAusgabewerte = new TextArea(12,50);  // Höhe/Breite des Textbereichs
		textAusgabewerte.setEditable(true); 
		constr.gridx = 0;
		constr.gridy = 8; 
		this.add( textAusgabewerte, constr);

		constr.anchor = GridBagConstraints.EAST; 
		constr.gridwidth = GridBagConstraints.REMAINDER;
		this.add( new Label("      "), constr);
		
		// Listener anbinden
		butWerteAus.addActionListener( new MeinActionAdapter());
		this.addWindowListener( new MeinWindowAdapter());
		
		cbMann.addItemListener (new ItemAdapter());
		cbFrau.addItemListener (new ItemAdapter());
		
	} // end of construktor
	
	// weitere Methoden ----------------------------------------------
		
	// innere Klassen ------------------------------------------------
	class ItemAdapter implements ItemListener
	{
		public void itemStateChanged(ItemEvent event)
		{
			Object source = event.getSource();
			if (source==cbMann)
			{
				cbMann.getText("Mann");
			}
			else if (source==cbFrau)
			{
				cbFrau.getText("Frau");
			}
		}
	}
		
	/**
	 * Beschreibung:
	 * Alle Methoden der Interfaceklassen müssen implementiert werden
	 * (auch wenn sie leer ist).
	 * 
	 */
	class MeinActionAdapter implements ActionListener // ActionListener ist ein Interface
	{

		public void actionPerformed(ActionEvent event)
		{
			String strKoerpergroesse = tfKoerpergroesse.getText();
			String strKoerpergewicht = tfKoerpergewicht.getText();
			String strNormalgewicht = new String("Ihr Normalgewicht muss betragen: ");
			String strIdealgewicht = new String("Ihr Idealgewicht muss betragen: ");
			String strBodyMassIndex = new String("Ihr Body Mass Index muss betragen: ");
			
			try
			{
				int groesse = Integer.parseInt(strKoerpergroesse);
 				int gewicht = Integer.parseInt(strKoerpergewicht);
 											
				Person bgewicht = new Person(groesse, gewicht, geschlecht);
				
				textAusgabewerte.append(strNormalgewicht+"\n");
				textAusgabewerte.append(bgewicht.gibNormalGewichtAus());
				
				textAusgabewerte.append(strIdealgewicht+"\n");
				textAusgabewerte.append(bgewicht.gibIdealGewichtAus());
				
				textAusgabewerte.append(strBodyMassIndex+"\n");
				textAusgabewerte.append(bgewicht.gibBMIAus());
			}
			catch (NumberFormatException nfe)
			{
				textAusgabewerte.setText("Bitte Eingabe korrigieren");
			}
			
		}// end of Methode actionPerformed
		
	}// end of inner class MeinActionAdapter
	
		
	/**
	 * Beschreibung:
	 * Alle Methoden der Interfaceklassen müssen implementiert werden
	 * (auch wenn sie leer ist).
	 * Der WindowsListener (Ereignisabhörer) wird implementiert, dadurch kann
	 * das Fenster bei Bedarf die Anklicken der Schaltfläche minimiert,
	 * vergrößert, maximiert oder geschlossen 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(); // Ressourcen werden freigegeben
			
			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
		
} 

class Person
{

		//Membervariablen
		int groesse;
		int gewicht;
		String geschlecht;
		
		//Konstruktor
		public Person (int groesse, int gewicht, String geschlecht)
		{
			this.groesse=groesse;
			this.gewicht=gewicht;
			this.geschlecht=geschlecht;
		}
		
		public int berechneNormalGewicht()
		{
			return groesse-100;
		}
		
		//Formeln
		public void gibNormalGewichtAus()
		{
			String ret = "";
			ret += berechneNormalGewicht();
		}
			
			
		public void gibIdealGewichtAus()
		{
			String ret = "";
			if (geschlecht.equals("Frau"))
				ret += berechneNormalGewicht()*0.85;
			else
				ret += berechneNormalGewicht()*0.90;
		}
		
			
		public void gibBMIAus()
		{
			String ret = "";
			ret += gewicht/(groesse/100.0)*(groesse/100.0);
		}
		
	
} //end of class Person
```


----------



## Beni (18. Jan 2005)

> Konnte leider noch nicht compiliert werden, weil ich den String-Wert des Radiobuttons nicht übergeben bekomme. Betrifft beides die class ItemAdapter und MeinActionAdapter.



Ob ein Radiobutton selektiert ist findest du über "isSelected()" raus. Ich verstehe nicht ganz für was du den String benötigst?


----------



## baenker (18. Jan 2005)

Ich brauche den String, weil ich unten in der class Person mit verschiedenen Werten für "Frau" und "Mann" arbeite.


----------



## mic_checker (18. Jan 2005)

Erstma was anderes:


```
textAusgabewerte.append(strNormalgewicht+"\n");
            textAusgabewerte.append(bgewicht.gibNormalGewichtAus());
            
            textAusgabewerte.append(strIdealgewicht+"\n");
            textAusgabewerte.append(bgewicht.gibIdealGewichtAus());
            
            textAusgabewerte.append(strBodyMassIndex+"\n");
            textAusgabewerte.append(bgewicht.gibBMIAus());
```

- gibNormalGewichtAus()
- gibIdealGewichtAus()
- gibBMIAus()

Alle drei Methoden liefern nichts zurück (void), aber du willst was anhängen. append(..) erwartet das die Anweisungen etwas zurückliefern, so dass es etwas anhängen kann.

-> 'void' type not allowed here


----------



## mic_checker (18. Jan 2005)

Ich weiss jetzt nicht genau ob es das ist was du willst, aber:


```
Checkbox ch = cbGeschlecht.getSelectedCheckbox();
         System.out.println(ch.getLabel());
```

Gibt zumindest Frau...Mann...aus.

Gibt aber best. ne elegantere Lösung.


----------



## Beni (18. Jan 2005)

baenker hat gesagt.:
			
		

> Ich brauche den String, weil ich unten in der class Person mit verschiedenen Werten für "Frau" und "Mann" arbeite.



Aber wieso nicht so?


```
if( cbMann.isSelected() ){
   // Einstellungen für Mann wählen
}
else{
   // Einstellungen für Frau wählen
}
```


----------



## baenker (18. Jan 2005)

mic_checker hat gesagt.:
			
		

> - gibNormalGewichtAus()
> - gibIdealGewichtAus()
> - gibBMIAus()
> 
> ...


Was du meinst klingt schlüssig, da ich aber wenig Erfahrung habe, weiß ich nicht, wie ichs anders machen soll.

Aber wieso nicht so?


```
if( cbMann.isSelected() ){
   // Einstellungen für Mann wählen
}
else{
   // Einstellungen für Frau wählen
}
```
[/quote]


----------



## baenker (18. Jan 2005)

```
if( cbMann.isSelected() ){
   // Einstellungen für Mann wählen
}
else{
   // Einstellungen für Frau wählen
}
```

ja, und jetzt muss ich irgendwie den String "Mann" bei Mann zur Verfügung stellen - aber genau das ist es - wie?
Bei Frau natürlich dasgleiche.


----------



## baenker (18. Jan 2005)

mic_checker
- gibNormalGewichtAus() 
- gibIdealGewichtAus() 
- gibBMIAus() 

Alle drei Methoden liefern nichts zurück (void) hat gesagt.:
			
		

> ```
> //Formeln
> public String gibNormalGewichtAus()
> {
> ...


----------



## Guest (18. Jan 2005)

baenker hat gesagt.:
			
		

> Was du meinst klingt schlüssig, da ich aber wenig Erfahrung habe, weiß ich nicht, wie ichs anders machen soll.



Du könntest z.B. String zurückgeben lassen:


```
public String gibNormalGewichtAus()
      {
         String ret = "";
         ret += berechneNormalGewicht();
         return ret;
      }
         
         
      public String gibIdealGewichtAus()
      {
         String ret = "";
         if (geschlecht.equals("Frau"))
            ret += berechneNormalGewicht()*0.85;
         else
            ret += berechneNormalGewicht()*0.90;
         
         return ret;
      }
      
         
      public String gibBMIAus()
      {
         String ret = "";
         ret += gewicht/(groesse/100.0)*(groesse/100.0);
         return ret;
      }
```

-> Dein Code nur mit String als Rückgabewert (und natürlich return am Ende).



> Aber wieso nicht so?
> 
> 
> ```
> ...



Das Ziel ist es doch das Geschlecht herauszufinden oder was?
So dass folgende Zeile funzt:


```
Person bgewicht = new Person(groesse, gewicht, geschlecht);
```

Aber dafür brauchst ja nicht mal nen ItemAdapter - du kannst ja bevor du die Instanz erzeugst mit ner if-Abfrage gucken was selektiert ist und geschlecht entsprechend setzen. Oder du schaust dir mal an ob obiges code-snippet von mir vielleicht hilft.


----------



## mic_checker (18. Jan 2005)

baenker hat gesagt.:
			
		

> ```
> //Formeln
> public String gibNormalGewichtAus()
> {
> ...


Du musst die Strings dann auch schon noch zurückgeben, wie ich eben in dem Code gezeigt hab (-> Gast).


----------



## baenker (19. Jan 2005)

Und wie kann ich es erreichen, dass bei der erneuten Eingabe anderer Daten und Berechnung, der vorherige Text aus der Textarea gelöscht wird.
Bisher wird die neue Berechnung einfach unten drunter gehangen!


----------



## mic_checker (19. Jan 2005)

vielleicht könnte folgende Methode ganz praktisch sein:



> void replaceRange(String str, int start, int end)
> Replaces text between the indicated start and end positions with the specified replacement text.



-> Aus API genommen.


----------

