Interface ArrayList, Objekte zählen und ausgeben

John Doe

Mitglied
Hi Leute,
ich bin absoluter Neueinsteiger in der objektorientierten Programmierung. Momentan bearbeiten wir in der Schule unterschiedliche Projekte, die eine Vererbungsstruktur und min. eine ArrayList enthalten sollten. Ich habe mit da einen zweisprachigen Ticketautomat bzw. Fahrkartenautomat vorgenommen und dachte ich schreibe alles in die Superklasse Ticketautomat und erzeuge Instanzen der Subklassen Einzelticket, Gruppenticket und Wochenendticket. Diese sollten dann in eine ArrayList aufgenommen werden, sodass mir zu Wartungszwecken ausgegeben wird, wie viele Ticket einer Sorte produziert wurden.

Hier der Quellcode der Superklasse:
Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class Ticketautomat
{

protected final JFrame Ticketautomat;

protected JButton Deutsch;
protected JButton Englisch;
protected JButton Einzelticket;
protected JButton Gruppenticket;
protected JButton Wochenendticket;
protected JButton Geldeinwurf;
protected JButton TicketDrucken;
protected JButton Schließen;
protected JButton Service;

protected JLabel Einzelticket_Label;
protected JLabel Gruppenticket_Label;
protected JLabel Wochenendticket_Label;
protected JLabel Sprachauswahl;
protected JLabel Sprachauswahl_Ergebnis;
protected JLabel Ticketauswahl;
protected JLabel Ticketauswahl_Ergebnis;
protected JLabel Preis;
protected JLabel Preis_Wert;
protected JLabel bisherGezahlt;
protected JLabel bisherGezahlt_Wert;
protected JLabel Wechselgeld;
protected JLabel Wechselgeld_Wert;

protected Box BL;
protected JPanel GRID;
protected JPanel GRID1;
protected JPanel GRID2;
protected JPanel FLOW;
protected JPanel FLOW1;

protected boolean Variable_Deu;
protected boolean Variable_Eng;
protected boolean TicketGewählt;
protected String Ticket;

protected double Ticketpreis;
protected double EingeworfenesGeld;
protected double Geldausgabe;


public Ticketautomat()
{
    Variable_Deu = false;
    Variable_Eng = false;
    TicketGewählt = false;
    Ticketautomat = new JFrame();
    FrameErzeugung();
}

public void FrameErzeugung()
{
    Ticketautomat.setTitle("Ticketmaster V1.012");
    Ticketautomat.setSize(525,525);
    Ticketautomat.setVisible(true);
    Ticketautomat.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    Container contentPane = Ticketautomat.getContentPane();
    Ticketautomat.getContentPane().setLayout(new BorderLayout(0,5));
    
    Deutsch = new JButton(new ImageIcon("Wehende deutsche Flagge.gif"));
    Englisch = new JButton(new ImageIcon("Wehende amerikanische Flagge.gif"));
    Einzelticket = new JButton(new ImageIcon("Strichmännchen Einzelticket.gif"));
    Gruppenticket = new JButton(new ImageIcon("Strichmännchen Gruppenticket.gif"));
    Wochenendticket = new JButton(new ImageIcon("Wochenendticket Deutsch.gif"));
    Geldeinwurf = new JButton("Geld einwerfen");
    TicketDrucken = new JButton("Ticket drucken");
    Service = new JButton("Service");
    Schließen = new JButton("Schließen");
    
    Einzelticket_Label = new JLabel("Einzelticket");
    Gruppenticket_Label = new JLabel("Gruppenticket");
    Wochenendticket_Label = new JLabel("Wochenendticket");
    Sprachauswahl = new JLabel("Ausgewählte Sprache:");
    Sprachauswahl_Ergebnis = new JLabel();
    Ticketauswahl = new JLabel("Ausgewähltes Ticket:");
    Ticketauswahl_Ergebnis = new JLabel();
    Preis = new JLabel("Preis:");
    Preis_Wert = new JLabel();
    bisherGezahlt = new JLabel("Bisher Gezahlt:");
    bisherGezahlt_Wert = new JLabel();
    Wechselgeld = new JLabel("Wechselgeld:");
    Wechselgeld_Wert = new JLabel();
    
    BL = Box.createVerticalBox();
    BL.add(Box.createVerticalGlue());
    BL.add(Deutsch);
    BL.add(Englisch);
    
    GRID = new JPanel(new GridLayout());
    GRID.setLayout(new GridLayout(2,3));
    GRID.add(Einzelticket);
    GRID.add(Gruppenticket);
    GRID.add(Wochenendticket);
    GRID.add(Einzelticket_Label);
    Einzelticket_Label.setHorizontalAlignment(SwingConstants.CENTER);
    Einzelticket_Label.setVerticalAlignment(SwingConstants.TOP);
    GRID.add(Gruppenticket_Label);
    Gruppenticket_Label.setHorizontalAlignment(SwingConstants.CENTER);
    Gruppenticket_Label.setVerticalAlignment(SwingConstants.TOP);
    GRID.add(Wochenendticket_Label);
    Wochenendticket_Label.setHorizontalAlignment(SwingConstants.CENTER);
    Wochenendticket_Label.setVerticalAlignment(SwingConstants.TOP); 
    
    GRID1 = new JPanel(new GridLayout());
    GRID1.setLayout(new GridLayout(5,2));
    GRID1.add(Sprachauswahl);
    GRID1.add(Sprachauswahl_Ergebnis);
    GRID1.add(Ticketauswahl);
    GRID1.add(Ticketauswahl_Ergebnis);
    GRID1.add(Preis);
    GRID1.add(Preis_Wert);
    GRID1.add(bisherGezahlt);
    GRID1.add(bisherGezahlt_Wert);
    GRID1.add(Wechselgeld);
    GRID1.add(Wechselgeld_Wert);

    FLOW = new JPanel(new FlowLayout());
    FLOW.setLayout(new FlowLayout(FlowLayout.LEFT,50,15));
    FLOW.add(BL);
    FLOW.add(GRID); 
    
    GRID2 = new JPanel(new GridLayout());
    GRID2.setLayout(new GridLayout(2,1));
    GRID2.add(FLOW);
    GRID2.add(GRID1);
    
    contentPane.add(GRID2, BorderLayout.CENTER);
    
    FLOW1 = new JPanel(new FlowLayout());
    FLOW1 = new JPanel(new FlowLayout(FlowLayout.CENTER,5,15));
    FLOW1.add(Geldeinwurf);
    FLOW1.add(TicketDrucken);
    FLOW1.add(Service);
    FLOW1.add(Schließen);
    
    contentPane.add(FLOW1, BorderLayout.SOUTH);
    
    Einzelticket.setVisible(false);
    Gruppenticket.setVisible(false);
    Wochenendticket.setVisible(false);
    Einzelticket_Label.setVisible(false);
    Gruppenticket_Label.setVisible(false);
    Wochenendticket_Label.setVisible(false);
    
    Ticketautomat.pack();
    Ticketautomat.setLocationRelativeTo(null);
    
    Deutsch.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            Einzelticket_Label.setText("Einzelticket");
            Gruppenticket_Label.setText("Gruppenticket");
            Wochenendticket_Label.setText("Wochenendticket");
            Sprachauswahl.setText("Ausgewählte Sprache:");
            Ticketauswahl.setText("Ausgewähltes Ticket:");
            Preis.setText("Preis:");
            bisherGezahlt.setText("Bisher Gezahlt:");
            Wechselgeld.setText("Wechselgeld:");
            
            Geldeinwurf.setText("Geld einwerfen");
            TicketDrucken.setText("Ticket drucken");
            Service.setText("Service");
            Schließen.setText("Schließen");
            
            Sprachauswahl_Ergebnis.setText("Deutsch");
            
            Variable_Deu = true;
            Variable_Eng = false;
            
            Wochenendticket.setIcon(new ImageIcon("Wochenendticket Deutsch.gif"));
            
            Einzelticket.setVisible(true);
            Gruppenticket.setVisible(true);
            Wochenendticket.setVisible(true);
            Einzelticket_Label.setVisible(true);
            Gruppenticket_Label.setVisible(true);
            Wochenendticket_Label.setVisible(true);
            
            Deutsch.setVisible(false);
            Englisch.setVisible(false);
            
            Ticketautomat.pack();
            Ticketautomat.setLocationRelativeTo(null);
        }
    });
    
    Englisch.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            Einzelticket_Label.setText("One Person Ticket");
            Gruppenticket_Label.setText("Group Ticket");
            Wochenendticket_Label.setText("Weekend Ticket");
            Sprachauswahl.setText("Chosen Language:");
            Ticketauswahl.setText("Chosen Ticket:");
            Preis.setText("Price:");
            bisherGezahlt.setText("Already Paid:");
            Wechselgeld.setText("Change:");
            
            Geldeinwurf.setText("Insert Money");
            TicketDrucken.setText("Print Ticket");
            Service.setText("Service");
            Schließen.setText("Exit");
            
            Sprachauswahl_Ergebnis.setText("English");
            
            Variable_Eng = true;
            Variable_Deu = false;
            
            Wochenendticket.setIcon(new ImageIcon("Wochenendticket Englisch.gif"));
            
            Einzelticket.setVisible(true);
            Gruppenticket.setVisible(true);
            Wochenendticket.setVisible(true);
            Einzelticket_Label.setVisible(true);
            Gruppenticket_Label.setVisible(true);
            Wochenendticket_Label.setVisible(true);
            
            Deutsch.setVisible(false);
            Englisch.setVisible(false);
            
            Ticketautomat.pack();
            Ticketautomat.setLocationRelativeTo(null);
        }
    });
    
    Einzelticket.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            if (Variable_Deu == true && Variable_Eng == false)
            {
                Ticketauswahl_Ergebnis.setText("Einzelticket");
                Ticket = "Einzelticket";
            }
            
            if (Variable_Eng == true && Variable_Deu == false)
            {
                Ticketauswahl_Ergebnis.setText("One Person Ticket");
                Ticket = "One Person Ticket";
            }
            
            new Einzelticket();
            Ticketpreis = 5;
            TicketGewählt = true;
            Preis_Wert.setText(String.valueOf(Ticketpreis) + " €");
        }
    });
    
    Gruppenticket.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            if (Variable_Deu == true && Variable_Eng == false)
            {
                Ticketauswahl_Ergebnis.setText("Gruppenticket");
                Ticket = "Gruppenticket";
            }
            
            if (Variable_Eng == true && Variable_Deu == false)
            {
                Ticketauswahl_Ergebnis.setText("Group Ticket");
                Ticket = "Group Ticket";
            }
            
            new Gruppenticket();
            Ticketpreis = 12.5;
            TicketGewählt = true;
            Preis_Wert.setText(String.valueOf(Ticketpreis) + " €");
        }
    });
    
    Wochenendticket.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            if (Variable_Deu == true && Variable_Eng == false)
            {
                Ticketauswahl_Ergebnis.setText("Wochenendticket");
                Ticket = "Wochenendticket";
            }
            
            if (Variable_Eng == true && Variable_Deu == false)
            {
                Ticketauswahl_Ergebnis.setText("Weekend Ticket");
                Ticket = "Weekend Ticket";
            }
            
            Ticketpreis = 22.5;
            TicketGewählt = true;
            Preis_Wert.setText(String.valueOf(Ticketpreis) + " €");
            new Wochenendticket();
        }
    });
    
    Geldeinwurf.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            if (Variable_Deu == true && Variable_Eng == false)
            {
                String CHANGE = JOptionPane.showInputDialog("Zahl: ");
                EingeworfenesGeld = Double.parseDouble(CHANGE);
            
                if(EingeworfenesGeld <= Ticketpreis)
                {
                    Geldausgabe = 0;
                }
                else
                {
                    Geldausgabe = (Ticketpreis-EingeworfenesGeld)*(-1);
                }
                
                bisherGezahlt_Wert.setText(String.valueOf(EingeworfenesGeld)+ " €");
                Wechselgeld_Wert.setText(String.valueOf(Geldausgabe)+ " €"); 
            }
            
            if (Variable_Eng == true && Variable_Deu == false)
            {
                String CHANGE = JOptionPane.showInputDialog("Value: ");
                EingeworfenesGeld = Double.parseDouble(CHANGE);
            
                if(EingeworfenesGeld <= Ticketpreis)
                {
                    Geldausgabe = 0;
                }
                else
                {
                    Geldausgabe = (Ticketpreis-EingeworfenesGeld)*(-1);
                }
                
                bisherGezahlt_Wert.setText(String.valueOf(EingeworfenesGeld)+ " €");
                Wechselgeld_Wert.setText(String.valueOf(Geldausgabe)+ " €"); 
            }
        }
    });
    
    TicketDrucken.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            if (TicketGewählt == true)
            {
                if(EingeworfenesGeld >= Ticketpreis)
                {
                    JOptionPane.showMessageDialog (null,
                    "##################\n# " +Ticket+ " #\n##################\n\nChange: " +Geldausgabe+ " €");
                    bisherGezahlt_Wert.setText(String.valueOf(0)+ " €");
                    Wechselgeld_Wert.setText(String.valueOf(0)+ " €");
                    EingeworfenesGeld = 0;
                }
                else
                {
                    if(Variable_Deu == true && Variable_Eng == false)
                    {
                        JOptionPane.showMessageDialog (null,"Bitte bezahlen Sie den ganzen Preis.");
                    }
                    if(Variable_Eng == true && Variable_Deu == false)
                    {
                        JOptionPane.showMessageDialog (null,"Please pay the whole price.");
                    }
                }
            }
        }
    });
    
    Schließen.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            System.exit(0);
        }
    });
}
}

Hoffe mir kann jemand helfen, ich wäre sehr dankbar.
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
das ist zuwenig, zwar viel Code, aber kaum zum Thema, keine Ideen
-> verschoben nach Hausaufgaben-Bereich

übe Listen lieber in einem Dummy-Main-Methode-Programm statt in einem wo du von 1000 anderen Zeilen erschlagen wirst,

eine Liste kann man erstellen, Werte eintragen, mit Schleife durchlaufen usw.,
wenn schon bekannt, dann nichts neues, sonst unbedingt für sich üben

tja, in dem dicken Programm dann irgendwo die Liste ablegen, bei manchen Buttons etwas einfügen, bei anderen andere Aktionen,
was erscheint daran schwer?
was passieren soll musst du schon selber entscheiden, bei Problemen mit der Umsetzung kannst du dann im Detail fragen,
so allgemein ist aber nichts zu sagen
 

John Doe

Mitglied
Viel mehr habe ich noch nicht geschrieben. Hatte mir das so gedacht, dass wenn ich z.B. den JButton Einzelticket drücke über den ActionListener eine neue Instanz der Subklasse Einzelticket erzeuge (erzeugte Objekte werden fortlaufend gezählt) und diese dann in eine ArrayList aufnehme. Hatte schon viele verschiedene Ansätze dieses Aufgabe zu lösen, aber bis jetzt ist das der einzige, der meinem Lehrer wirklich gefällt :D Hatte auch schonmal eine ArrayList drin, die sogar funktioniert hat. Sie gab aber nur die Ticketdaten aus und zählte sie nicht. Aber mal gucken mir ist da gerade noch ne möglichkeit eingefallen ...

Trotzdem vielen Dank!!! Finds super, dass man hier sofort Anworten auf seine Fragen bekommt!!!:toll:
Gruß
 

John Doe

Mitglied
Also ich hab die andere Möglichkeit mal ausprobiert und das funktioniert nicht. Ich komm langsam aber sicher an meine Grenzen in Java und ich brauch noch en paar Ansätze für Lösungen, da ich diese Arbeit nächste Woche abgeben muss ... ;(. Wie bekomme ich es hin, wenn ich eine Instanz einer Klasse erzeuge, dass Sie direkt in eine Arraylist (sozusagen automatisch) aufgenommen wird und ich mir mit dem getSize()-Befehl die Größe der aufgenommenen Objekte als int ausgeben lasse? Syntax?
 
S

SlaterB

Gast
automatisch brauchst du nicht,
der, der erzeugt, wird ja wohl die Liste kennen und einfügen können,
poste Code oder erzähle mit Worten wer wann wo warum wie was macht,
und welche kontreten Probleme (wie 'Liste nicht vorhanden') du dort hast

getSize() gibt es bei Listen nicht, das ist nun einfach nachzuschauen,
ansonsten dieselben Fragen, warum sollte es irgendwo ein Problem sein, die Größe der Liste, also eine der wenigen Grundfunktionen, abzufragen?
es gibt gar keinen Ansatz für Hilfe ohne konkret nachvollziehbare Probleme
 

John Doe

Mitglied
Es muss automatisch funktionieren. Mein Problem ist jetzt, dass wenn ich ein z.B. Einzelticket erstelle, bezahle und ausdrucke, soll eine Instanz der Klasse Einzelticket entstehen und sofort in die Arraylsit aufgenommen werden. Die angehängte Datei zeigt die Beziehungen der Klassen zueinander. Ich habe zusätzlich einfach mal die jar dazu hochgeladen, damit du/ihr euch ein Bild machen könnt, um was es geht.

P.S.: Die jar-Datei ist nicht perfekt programmiert, war bis jetzt am testen wie ich diese Aufgabe realisieren soll.
 

Anhänge

  • 29-05-2012 12-47-03.gif
    29-05-2012 12-47-03.gif
    16,3 KB · Aufrufe: 34
  • Ticketautomat.jar
    30,6 KB · Aufrufe: 2
S

SlaterB

Gast
auch wenn es unschön klingt:
- 'Es muss automatisch funktionieren.' ohne Begründung ist für mich irrelevant

- ein Bild mit paar Linien erklärt mir nichts

- und 30kb jar entpacken und vielleicht 1000 Code-Zeilen zu durchsuchen,
wobei bei fehlenden Andeutungen zu vermuten ist, dass eine ArrayList noch nicht mal auftaucht,
das ist nicht grad mein angestrebter Zeitvertreib..

im Moment kann ich denke ich nichts neues beitragen, ob andere reinschauen?
 
F

Firephoenix

Gast
Falls das klassendiagramm noch aktuell ist:
Mach dir am besten nochmal Gedanken über Vererbung, ein Ticket ist kein Ticketautomat.
Vererbung sollte immer folgenden Kriterien genügen:
1. die subklasse steht zur superklasse in einer IS-A beziehung (PKW is a CAR)
2. die superklasse muss durch die subklasse substituiert werden können mit dem gleichen Verhalten (Liksov-Substitution-Principle, geht hier evtl etwas weit).

Ist die Aufgabe mit dem Automaten vorgegeben oder habt ihr nur als Vorraussetzung "schreibt ein Programm mit Vererbung und einer ArrayList"?

Gruß
 

John Doe

Mitglied
Das Thema habe ich mir für meine java abschlussarbeit ausgesucht. Alle anderen Mitschüler haben sich Ähnliches ausgesucht. Die einzigen Kriterien sind, dass das Projekt eine eigentständige GUI-Anwendungen sein muss und es eine Vererbungsstruktur und eine ArrayList aufweisen muss.
Die GUI muss in einem einzigen JFrame sein, und hatte ich mir das so gedacht, dass ich über einen JButton (hier "Service") die ArrayList ausgeben lasse.

Die Zeichnung ist nur bedingt richtig: die Assoziation die von der Superklasse "Ticketautomat" zur Datenbank zeigt, entstand nur durch neue Ideen und Versuche ...

Ich glaub ich setz mich nochmal hin und überdenk das ganze Projekt mal mit meinem Kollegen ... die haben teilweise auch dieselben Probleme ...

Aber wie gesagt es freut mich, dass ihr euch Zeit genommen habt mir neue Ansätze zu geben!
 
N

nillehammer

Gast
Ich glaub ich setz mich nochmal hin und überdenk das ganze Projekt mal mit meinem Kollegen ... die haben teilweise auch dieselben Probleme ...
Japp, die Generalisierungen/Vererbungen in der Zeichung machen nämlich keinen Sinn. Vererbung drückt eine "ist ein"-Beziehung aus. Dementsprechend wäre Deine Zeichnung u.a. so zu lesen: "Ein Einzelticket ist ein Ticketautomat." Macht nicht soo viel Sinn. Folgendes würde Sinn machen:
Java:
public class TicketAutomat {
  private List<Ticket> producedTickets = new ArrayList<>();

  //- Wie wär's mit einer Methode zur Ausgabe des Umsatzes?
  //   (über alle tickets iterieren und preise addieren)
}

public abstract class Ticket {
 //- alle Variablen, die alle Tickets haben können (z.B. Preis)

 //- alle Methoden, die für alle Tickets gleich sein sollen ausimplementieren

 //- alle Methoden, die zwar alle Tickets haben sollen, die aber je Subklasse unterschiedlich
 //  ausimplementiert werden sollen, abstract definieren.
}

public class EinzelTicket extends Ticket{
  // Alle Variablen, die nur ein Einzelticket hat hier hin (evtl. gibt's da garkeine)

  // Alle abstracten Methoden von Ticket ausimplementieren

  // Evtl. noch zusätzliche Methoden, die EinzelTicket-spezifisch sind.
}
 
Zuletzt bearbeitet von einem Moderator:

John Doe

Mitglied
Habe den Quellcode nochmals verbessert ... und später auch die Lösung für mein Problem gefunden. Das deklarieren mit static hat gereicht, um die ArrayList zu realisieren. Bekomme nun die Anzahl aller Tickets, die Anzahl der jeweils gewählten Tickets und zusätzlich der Gesamtbetrag, der im Automat enthalten ist, ausgegeben. Ich kommentiere den Quellcode jetzt nur noch aus und dann lade ich das erstellte jarfile mal hoch. Denke zu Lernzwecken ist es definitiv geeignet :toll:

Danke nochmal für alle Hilfestellungen!
Gruß
 

John Doe

Mitglied
Hier nun die auskommentierte Version des Programmes (ohne Bilder). Es ist natürlich nicht perfekt aber es eignet sich gut um die Grundlagen der Java-Programmierung zu erlernen und zu verstehen.

Viel Spaß damit!
Gruß :)
 

Anhänge

  • Ticketautomat GUI (jarfile).jar
    37 KB · Aufrufe: 9

Neue Themen


Oben