Fachlogik eines Promillezählers

#1

Ich habe vor einem halben Jahr einen Promillezähler geschreiben der auch perfekt funktioniert allerdings ist er in einer Wurst geschrieben.
Meine Frage: Kann mir wer helfen diese Wurst in Klassen aufzuteilen wie Benutzer,Getränke,Uhrzeit und die GUI ??
Danke im voraus

Hier der Code:

package gui;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



import javax.swing.*;


public class GUIStart extends JFrame implements ActionListener {


		
	
	private JTextArea ta= new JTextArea(30,30);
	private JTextField tfGeschlecht = new JTextField(1);
	private JTextField tfGewicht = new JTextField(3);
	private JTextField tfStunde = new JTextField(2);
	private JTextField tfMinute = new JTextField(2);
	private JTextField tfGetränk = new JTextField(5);
	private JTextField tfMenge = new JTextField(4);
	private JTextField tfBlutAlk = new JTextField(4);
	private JButton btFertig = new JButton("Übernehmen");
	
	private static final long serialVersionUID = 1L;
	
	public GUIStart()
	{
		initComponents();
		this.setVisible(true);
		this.setSize(410,500);
	}
	private void initComponents() {
		Container c= this.getContentPane();
		
		c.setLayout(new BorderLayout());

		c.add(new JScrollPane(ta), BorderLayout.CENTER);
		
		JPanel DatenPanel = new JPanel();
		DatenPanel.setLayout(new BorderLayout());
		c.add(DatenPanel, BorderLayout.NORTH);
		
		DatenPanel.add(btFertig, BorderLayout.SOUTH);
		
		JPanel erfassungspanel = new JPanel();
		erfassungspanel.setLayout(new GridLayout(1,2));
		DatenPanel.add(erfassungspanel, BorderLayout.CENTER);
		
		JPanel AllgemeinPanel = new JPanel();
		AllgemeinPanel.setLayout(new GridLayout(4,1));
		erfassungspanel.add(AllgemeinPanel);
		
		JPanel AlkoholPanel = new JPanel();
		AlkoholPanel.setLayout(new GridLayout(4,1));
		erfassungspanel.add(AlkoholPanel);
		
		AllgemeinPanel.add(new JLabel("           Allgemeine Daten"));
		
		JPanel GeschlechtPanel = new JPanel();
		GeschlechtPanel.setLayout(new FlowLayout());
		AllgemeinPanel.add(GeschlechtPanel, BorderLayout.CENTER);

		GeschlechtPanel.add(new JLabel("Geschlecht:            "));
		GeschlechtPanel.add(tfGeschlecht);
		
		JPanel GewichtPanel = new JPanel();
		GewichtPanel.setLayout(new FlowLayout());
		AllgemeinPanel.add(GewichtPanel, BorderLayout.CENTER);

		GewichtPanel.add(new JLabel("Gewicht in kg: "));
		GewichtPanel.add(tfGewicht);
		
		JPanel ZeitPanel = new JPanel();
		ZeitPanel.setLayout(new FlowLayout());
		AllgemeinPanel.add(ZeitPanel, BorderLayout.CENTER);

		ZeitPanel.add(new JLabel("Uhrzeit:   "));
		ZeitPanel.add(tfStunde);
		ZeitPanel.add(new JLabel(":"));
		ZeitPanel.add(tfMinute);
		
		AlkoholPanel.add(new JLabel(" Alkohol Daten"));
		
		JPanel GetränkPanel = new JPanel();
		GetränkPanel.setLayout(new FlowLayout());
		AlkoholPanel.add(GetränkPanel, BorderLayout.CENTER);
		

		GetränkPanel.add(new JLabel("Getränk:      "));
		GetränkPanel.add(tfGetränk);
		
		JPanel MengePanel = new JPanel();
		MengePanel.setLayout(new FlowLayout());
		AlkoholPanel.add(MengePanel, BorderLayout.CENTER);

		MengePanel.add(new JLabel("Menge in ml:                    "));
		MengePanel.add(tfMenge);
		
		JPanel BlutAlkPanel = new JPanel();
		BlutAlkPanel.setLayout(new FlowLayout());
		AlkoholPanel.add(BlutAlkPanel, BorderLayout.CENTER);

		BlutAlkPanel.add(new JLabel("Blutalkohol in Promille: "));
		BlutAlkPanel.add(tfBlutAlk);
		
		btFertig.addActionListener(this);
		
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
GUIStart gs= new GUIStart();
	}
	@Override
	public void actionPerformed(ActionEvent arg0) 
	 {
		JButton source= (JButton)arg0.getSource();
		try{ 
		if(source==btFertig) 
		
		{
			String ausgabeString = "";
			
			double verteilungsf = 0;
			double gewicht = 0;
			int stunde = 0;
			int minute = 0;
			double alkohol = 0;
			double menge = 0;
			double blutAlk= 0;
			int nuechtern = 0;
			double intus = 0;
			
			if(tfGeschlecht.getText().equals("m") || tfGeschlecht.getText().equals("M"))
			{
				verteilungsf += 0.7;
			}
			
			if(tfGeschlecht.getText().equals("w") || tfGeschlecht.getText().equals("W"))
			{
				verteilungsf += 0.6;
			}
			
			gewicht += Double.parseDouble(tfGewicht.getText());
			stunde += Integer.parseInt(tfStunde.getText());
			minute += Integer.parseInt(tfMinute.getText());
			menge += Double.parseDouble(tfMenge.getText());
			intus += Double.parseDouble(tfBlutAlk.getText());
			
			
			if(tfGetränk.getText().equals("Bier"))
			{
				alkohol += (menge*0.1)*5*0.08;
			}
			
			if(tfGetränk.getText().equals("Vodka"))
			{
				alkohol += (menge*0.1)*38*0.08;
			}
			
			if(tfGetränk.getText().equals("Wein"))
			{
				alkohol += (menge*0.1)*11*0.08;
			}
			
			if(tfGetränk.getText().equals("Likör"))
			{
				alkohol += (menge*0.1)*20*0.08;
			}
			
			if(tfGetränk.getText().equals("Wiskey"))
			{
				alkohol += (menge*0.1)*40*0.08;
			}
			
			if(tfGetränk.getText().equals("Tequila"))
			{
				alkohol += (menge*0.1)*55*0.08;
			}
			
			if(tfGetränk.getText().equals("Absinth"))
			{
				alkohol += (menge*0.1)*60*0.08;
			}
			
			
			blutAlk += alkohol/(verteilungsf*gewicht)+intus;
			
			nuechtern = (int) (blutAlk*10+stunde);
			
			if(nuechtern >= 24)
			{
				nuechtern -= 24;
				ausgabeString += "Sie haben "+blutAlk+" Promille im Blut
"+"Sie sind ungefähr um "
				+nuechtern+" Uhr "+tfMinute.getText()+" am nächsten Tag wieder nüchtern
";
				ta.append(ausgabeString);
			}
			else
			{
			ausgabeString += "Sie haben "+blutAlk+" Promille im Blut
"+"Sie sind ungefähr um "
			+nuechtern+" Uhr "+tfMinute.getText()+" wieder nüchtern
";
			ta.append(ausgabeString);
			}
			
		}
		
		} catch (Exception e) {
		    ta.setText("Alle Felder müssen ausgefüllt werden
");  
		  }	
	}
}```
#2

Was genau willst du denn für Hilfe? Soll jemand für dich den Code in einzelne Klassen aufteilen?

#3

Als allererste Maßnahme würde ich das ... extends JFrame implements ActionListener angehen: Also JFrame verwenden, nicht davon erben (Composition over Inheritance), und einzelne anonyme oder innere Klassen für ActionListener.

#4

Das if(tf.getränk.equals(…) kann man sich mit sowas ersetzen.

Die Alkoholwerte werden z.B. in einem enum festgehalten.

  BIER(5), VODKA(38),WEIN(11),LIKOER(20),WHISKEY(40),TEQUILA(55),ABSINTH(60);
	
  private int volumenProzent;
  Drink(int volumenProzent){
    this.volumenProzent = volumenProzent;
  }
	
  public double alkoholMengeBlut(double menge){
    return (menge * 0.1)*volumenProzent*0.08;
  }
}```

Anstelle des if kommt dann sowas hin.
```String getraenkEingabe = tfGetränk.getText().toUpperCase();
Drink drink = Drink.valueOf(getraenkEingabe);
alkohol += drink.alkoholMengeBlut(menge);```

Statt im Eingabefeld einen Namen ein für das Getränk eingeben zu lassen, kann man auch ein Auswahlfeld anzeigen, dass die Verfügbaren Getränke listet. Hierzu kann man dann wieder auf das Selbe enum Zurückgreifen und sich die Werte mit Drink.values() holen.
#5

Um die Ausgabe im Auswahlfeld ein bisschen aufzuhübschen, könnte man die toString Methode im Enum überschreiben:

  BIER(5, "Bier"),
  VODKA(38, "Vodka"),
  WEIN(11, "Wein"),
  LIKOER(20, "Likör"),
  WHISKEY(40, "Whiskey"),
  TEQUILA(55, "Tequila"),
  ABSINTH(60, "Absinth");
   
  private final int volumenProzent;
  private final String bezeichnung;
  Drink(int volumenProzent, String bezeichnung){
    this.volumenProzent = volumenProzent;
    this.bezeichnung = bezeichnung;
  }
   
  public double alkoholMengeBlut(double menge){
    return (menge * 0.1)*volumenProzent*0.08;
  }
  
  public String toString() {
    return bezeichnung;
  }
}```