OOP Summe aus verschiedenen Instanzen einer Klasse berechnen

BombaX

Mitglied
Hey hallo liebe Java Freunde,

ich habe ein Problem.
Und zwar habe ich meine erste GUI erstellt.
Diese beinhaltet auf der linken Seite einen Zähler (Wie oft wurde Artikel gekauft).
In der Mitte jeweils ein Button um diesen zu erhöhen.
Und Rechts den Preis je Stk. (Siehe Bild)
Ganz unten will ich jetzt die gesamte Summe ausgeben lassen.
Nun zu meinen Problemen:
  1. Wie realisiere ich dass der Preis sich sofort bei einem klick aktualisiert.
  2. Wie schaffe ich es mit einer Schleife dies zu berechnen.
  3. Was haltet ihr von meinem Programmierstil? Was kann ich verbessern? (Programmiere noch nicht so lange)
Genauer:
Ich berechne in der Main ganz unten ja den gesamt Wer der Waren, allerdings wenn ich jetzt den multiplikator (Anzahl der bestimmten Ware) mit einbringe, weiß ich nicht wie ich den jeweiligen multiplikator in der Schleife (oder anders) von der Richtigen Ware auslesen lassen soll. Hoffe das war soweit verständlich. 😉

Bild GUI


Quellcode:

Main:
Java:
import java.awt.Component;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JTextArea;

public class StartUp {
    static double gesPreis = 0;
    public static int multiplikator = 0;
    static ArrayList<Double> summe = new ArrayList<Double>();
    static ArrayList<Ware> wareList = new ArrayList<Ware>();

    public static void main(String[] args) {
     

        // Erstellen des Hauptfensters
        JFrame HauptFenster = new JFrame();
        HauptFenster.setTitle("Kasse");
        HauptFenster.setBounds(100, 100, 800, 600);
        HauptFenster.setDefaultCloseOperation(3);
        HauptFenster.setResizable(false);
        HauptFenster.setLayout(null);
        HauptFenster.setVisible(true);
        HauptFenster.setAlwaysOnTop(true);

        // Milch + Textfelderstellen und dem Hauptfdenster hinzufügen
        Ware milch = new Ware(1.19, "Milch", 70, 50, 150, 50);  //Erstelle Milch
        HauptFenster.add(milch.textFeld());                      // rufe Methode textFeld() auf und setzte die Parameter
        HauptFenster.add(milch);                                //Füge Milch dem HAuptfenster hinzu
        HauptFenster.add(milch.zaehlerFeld());                    //rufe Methode zaehlerFeld() auf und setzte die Parameter
        multiplikator = milch.myL.getZaehler();                    // Multiplikator soll die Summe ges errechnen
        summe.add(milch.getPreis());                            // füge Preis ArrayList hinzu
        wareList.add(milch);
         
        // Pizza Hinzufügen // Y + 70
        Ware pizza = new Ware(3.29, "Pizza", 70, 120, 150, 50);
        HauptFenster.add(pizza.textFeld());
        HauptFenster.add(pizza);
        HauptFenster.add(pizza.zaehlerFeld());
    //    multiplikator = pizza.myL.getZaehler();
        summe.add(pizza.getPreis());
        wareList.add(pizza);

     
        // Rettich
        Ware rettich = new Ware(1.99, "Rettich", 70, 190, 150, 50);
        HauptFenster.add(rettich.textFeld());
        HauptFenster.add(rettich);
        HauptFenster.add(rettich.zaehlerFeld());
    //    multiplikator = rettich.myL.getZaehler();
        summe.add(rettich.getPreis());
        wareList.add(rettich);


        // Harter Alkohol
        Ware harterAlkohol = new Ware(19.99, "Harter Alkohol", 70, 260, 150, 50);
        HauptFenster.add(harterAlkohol.textFeld());
        HauptFenster.add(harterAlkohol);
        HauptFenster.add(harterAlkohol.zaehlerFeld());
    //    multiplikator = harterAlkohol.myL.getZaehler();
        summe.add(harterAlkohol.getPreis());
        wareList.add(harterAlkohol);


        // Ausgabe gesamt Preis
        JTextArea ta = new JTextArea();
        ta.setBounds(220, 330, 150, 50);
        ta.setText("" + berechnung(wareList.get(0)));
        ta.setLayout(null);
        HauptFenster.add(ta);

        HauptFenster.repaint();
    }

    // Schleife zum ges Summe berechnen
    static double berechnung(Ware ware) {
        for (double s : summe) {
            //gesPreis += s * s.multiplikator;
            gesPreis += s * multiplikator ;

        }
        return gesPreis;
    }
}

Ware:
Java:
import java.awt.Component;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;

class Ware extends JButton {
    private double preis;
    JButton btn;
    int x, y, width, height;
 
    MyListener myL = new MyListener();
    JTextField textZ = new JTextField();
 
    //Konstruktor
    public Ware(double preis, String name, int x, int y, int width, int height) {
 
        // Eingabe Global zuweisen
        this.x = x;
        this.y = y;
        this.height = height;
        this.width = width;
        this.preis = preis;

        // Button erzeugen
        this.btn = this;
        this.btn.setText(name);
        this.btn.setBounds(x, y, width, height);
        // Listener an button fügen
        btn.addActionListener(myL);
     
    }
    // Zähler -> Textarea ausgeben

    public JTextField zaehlerFeld() {     
        textZ.setBounds((x - 50), y, 50, height);
        System.out.println(myL.zaehler + "JTextFiel");
        textZ.setText("" + myL.zaehler);
        textZ.setVisible(true);     
        return textZ;
    }

    // Textfeld in Abhänigkeit des Buttons(Ware) erstellen gibt JTextField
    // zurück
    public JTextField textFeld() {
        JTextField text = new JTextField();
        text.setBounds((x + 150), y, width, height);
        text.setText(preis + " €");     
        return text;
    }

    // Getter & Setter

    public double getPreis() {
        return preis;
    }

    public void setPreis(double preis) {
        this.preis = preis;
    }

    // Klasse Listener BUTTON in der Ware klasse
    class MyListener implements ActionListener {
    int  zaehler = 0;

        @Override
        public void actionPerformed(ActionEvent e) {
            zaehler++;
            System.out.println(zaehler);
            textZ.setText(zaehler + "" );         
        }

        public int getZaehler() {
            return zaehler;
        }

        public void setZaehler(int zaehler) {
            this.zaehler = zaehler;
        }
    }
}

Falls ich mich zu unverständlich ausgedrückt habe, fragt einfach nach.=)
Schon mal Danke ;-)
-----------------
Ps: Ja ich habe mich 2012 schon einmal mit Java versucht, nur bin ich durch Umstände dazu gezwungen worden es bleiben zu lassen. Aus dieser Zeit stammt auch noch der Account 😉
 
Zuletzt bearbeitet von einem Moderator:
In der Methode "textFeld()" der Klasse are erzeugst du ein lokales JTextField Objekt und lieferst es zurück. Diese Methode rufst du auf, wenn du dein Textfeld zur UI hinzufügen willst.
Warum arbeitest du hier nicht ähnlich wie bei dem Zählerfeld? Das ist die gleiche Logik nur steht ein anderer Wert im Feld drinnen.


Anmerkungen zum Code: Ein Methode stellt eine Tätigkeit dar, entsprechend sollten auch die Namen gewählt werden. Sprich statt "textFeld" -> "getTextfeld", statt "berechnung" -> "berechne".
Es wäre hier nicht richtig den JButton zu erweitern da du nicht die Funktionalität des Buttons ändern willst sondern einfach das "Zusammenspiel" zwischen Button und den 2 Textfeldern erreichen willst. -> deine Lösung funktioniert grundsätzlich ist aber keine schöne Programmierung 😉
 

Neue Themen


Zurück
Oben