Berechnungsprogramm für Gewicht / fehlerbehaftet

Status
Nicht offen für weitere Antworten.

baenker

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

Code:
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
 
B

Beni

Gast
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

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

mic_checker

Top Contributor
Erstma was anderes:

Code:
            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

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

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

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

Gibt aber best. ne elegantere Lösung.
 
B

Beni

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

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

baenker

Mitglied
mic_checker hat gesagt.:
- 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
Was du meinst klingt schlüssig, da ich aber wenig Erfahrung habe, weiß ich nicht, wie ichs anders machen soll.

Aber wieso nicht so?

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

baenker

Mitglied
Code:
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

Mitglied
mic_checker - gibNormalGewichtAus() - gibIdealGewichtAus() - gibBMIAus() Alle drei Methoden liefern nichts zurück (void) hat gesagt.:
Code:
 		//Formeln
		public String gibNormalGewichtAus()
		{
			String ret = "";
			ret += berechneNormalGewicht();
		}
			
			
		public String gibIdealGewichtAus()
		{
			String ret = "";
			if (geschlecht.equals("Frau"))
				ret += berechneNormalGewicht()*0.85;
			else
				ret += berechneNormalGewicht()*0.90;
		}
		
			
		public String gibBMIAus()
		{
			String ret = "";
			ret += gewicht/(groesse/100.0)*(groesse/100.0);
		}
 
G

Guest

Gast
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:

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

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

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

Code:
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

Top Contributor
baenker hat gesagt.:
Code:
 		//Formeln
		public String gibNormalGewichtAus()
		{
			String ret = "";
			ret += berechneNormalGewicht();
		}
			
			
		public String gibIdealGewichtAus()
		{
			String ret = "";
			if (geschlecht.equals("Frau"))
				ret += berechneNormalGewicht()*0.85;
			else
				ret += berechneNormalGewicht()*0.90;
		}
		
			
		public String gibBMIAus()
		{
			String ret = "";
			ret += gewicht/(groesse/100.0)*(groesse/100.0);
		}
Du musst die Strings dann auch schon noch zurückgeben, wie ich eben in dem Code gezeigt hab (-> Gast).
 

baenker

Mitglied
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!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben