# Methode mit einer Arraylist



## Nesselbrand (30. Dez 2019)

```
public static void main(String[] args)
    {
        serve1c();
    }

    public static void serve1c(ArrayList<KartenDeck> Kdeck)    {
        int temp = Kdeck.size();
        int temp2 = (int)(Math.random()) * temp;
        System.out.println(Kdeck.get(temp2));
    }
```
Was muss ich in die Klammer in der serve1c() Methode schreiben damit ich diese ausgeführt werden kann?
Schonmal Danke im Vorraus


----------



## mihe7 (30. Dez 2019)

Ein Objekt vom Typ ArrayList<KartenDeck>


----------



## Nesselbrand (30. Dez 2019)

mihe7 hat gesagt.:


> Ein Objekt vom Typ ArrayList<KartenDeck>


Wie würde das aussehen ?
also als code


----------



## mihe7 (30. Dez 2019)

Naja, z. B.

```
ArrayList<KartenDeck> list = new ArrayList<>();
// dann kann man Objekte vom Typ KartenDeck hinzufügen:
list.add(new KartenDeck(...)); // dabei ... durch Parameter des betreffenden Konstruktors ersetzen

serve1c(list);
```


----------



## Nesselbrand (30. Dez 2019)

ich habe vergessen zu sagen, dass die Arraylist aus der Klasse KartenDeck kommt.


----------



## Nesselbrand (30. Dez 2019)

Wenn ich das so mache wird mir "com.company.KartenDeck@e65a89" auf der Konsole ausgegeben, anstatt eines Wertes aus der Arraylist Kdeck. Kann das daran liegen, dass ich die Arraylist in der Klasse KartenDeck in der Main() Methode geschrieben habe?


----------



## Javinner (30. Dez 2019)

Nesselbrand hat gesagt.:


> serve1c();


serve1c(); <- die Liste gehört als Parameter an die Methode übergeben
serve1c(Parameter p)


----------



## Nesselbrand (30. Dez 2019)

Also soll ich dann schreiben:

```
serve1c(ArrayList Kdeck);
```
Dann kommt aber die Fehlermeldung: "Cannot resolve symbol Kdeck"


----------



## Javinner (30. Dez 2019)

Fehlermeldung: Cannot resolve symbol

Ein Beispiel: 

```
public class GiveMeTheBiggestBananaDemo
{

    public static void main(String[] args)
    {
        List<Banana> bananaList = new ArrayList<>();
        Random random = new Random();
        for (int i = 0; i < 100; i++)
        {
            int x = random.nextInt(1000);
            bananaList.add(new Banana(x));
        }

        Banana biggestOnList = getTheBiggestBanana(bananaList);
        System.out.println(biggestOnList.getSize());
    }

    public static Banana getTheBiggestBanana(List<Banana> bananaListToCheck)
    {
        int x = Integer.MIN_VALUE;
        int placeOnList = 0;
        for(int i = 0; i < bananaListToCheck.size(); i++)
        {
            if(bananaListToCheck.get(i).getSize()> x)
            {
                x = bananaListToCheck.get(i).getSize();
                placeOnList = i;
            }
        }
        return bananaListToCheck.get(placeOnList);
    }

}

public class Banana
{
    private final int size;

    public Banana(int size)
    {
        this.size = size;
    }

    public int getSize()
    {
        return size;
    }

}
```

Lerne bitte die Grundlagen, damit wir beide in näheren Zukunft darüber lachen können


----------



## Nesselbrand (30. Dez 2019)

ich probiere mir java selbst beizubringen, da es mir in der Schule zu langsam geht und zu sowas habe ich einfach kein tutorial gefungen? (Trauriges Smiley)


----------



## Javinner (30. Dez 2019)

@Nesselbrand  Die gute Nachricht, du bist hier angemeldet und dir stehen alle Wege offen. Bei uns sagt man, helfe dir, dann hilft dir der Gott, drum spare die Zeit an traurigen Geschichten und lese lieber ein gescheites Buch zum Thema, dann bist du mir gleich viel sympathischer


----------



## Nesselbrand (30. Dez 2019)

ok danke für die hilfe. Auf dass ich schnell besser werde.


----------



## Nesselbrand (30. Dez 2019)

Javinner hat gesagt.:


> Fehlermeldung: Cannot resolve symbol
> 
> Ein Beispiel:
> 
> ...


Hast du einen Tipp für mich, wo ich das am besten machen kann


----------



## Javinner (30. Dez 2019)

Nesselbrand hat gesagt.:


> Hast du einen Tipp für mich, wo ich das am besten machen kann


Also ich bin eine Leseratte, bei mir geht es nur über Bücher in Begleitung von paar Videos oder Online-Tutorials.
Was ich dir als Anfänger empfehlen kann, ist das Buch Grundkurs Programmieren in Java Dazu begleitend paar Tutorials auf
https://www.w3schools.com/java/default.asp , https://www.tutorialspoint.com/java/index.htm aber natürlich auch hier, die Admins/Besitzer vertreiben da ihr eigenes Lehrstoff, melde dich einfach bei @Flown , @mrBrown,  @Matze da wird dir geholfen. Gleich zu Beginn, die meisten YouTube-Videos sind einfach nur schlecht, da gibt es kaum Brauchbares Material.
Lesen, Nachmachen, hier Fragen stellen, noch mal Lesen. Viel Erfolg!

edit: mein Liebling habe ich beinahe vergessen !!! Java-Hamster !!! Wenn du dicke Haut hast, ist es was richtig feines 
https://www.java-forum.org/thema/java-hamster-mein-resume.178707/


----------



## Nesselbrand (30. Dez 2019)

Danke


----------



## Nesselbrand (30. Dez 2019)

Wie muss ich das Schreiben wenn ich die Methode getthebiggestbanana aus eine anderen klasse aufrufen möchte?


----------



## Javinner (30. Dez 2019)

Nesselbrand hat gesagt.:


> Wie muss ich das Schreiben wenn ich die Methode getthebiggestbanana aus eine anderen klasse aufrufen möchte?


Die Methode `getTheBiggestBanana(List<Banana> list)` liefert im Grunde eine Banana, also muss die Methode, die es aufruft, eine Banana empfangen können. Ich verstehe nicht ganz, was du willst..


----------



## Nesselbrand (30. Dez 2019)

```
neuesSpielbutton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Spielzüge.serve1c();
            }
        });
```
Dies ist eine andere Klasse. Ich bekomme allerdings eine Fehlermeldung, da ich in die Klamer hinter .serve1c nichts reingeschrieben habe. Was da stehen soll, ist meine Frage.


----------



## Javinner (30. Dez 2019)

Nesselbrand hat gesagt.:


> Was da stehen soll, ist meine Frage




```
public static void serve1c(ArrayList<KartenDeck> Kdeck) /** <<<- das Kartendeck */
{
        //dein Code
}
```


----------



## Nesselbrand (30. Dez 2019)

```
neuesSpielbutton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Spielzüge.serve1c(Arraylist<KartenDeck> Kdeck); // Das Funktioniert nicht
            }
        });
```

Da steht dann als Fehlermeldung :
-Cannot resolve symbol Arraylist
-Bei KartenDeck steht "Exression expected"
-bei Kdeck wieder Canot resolve symbol Kdeck


----------



## Javinner (30. Dez 2019)

Wir stochern gerade in Code-Schnipsel rum und ich habe eine leise Vorahnung, dass dies kaum Besserung bringt. 
Was halltest du davon, dein ganzen Code zu veröffentlichen, bitte in Code-Tags, damit man mehr Überblick über das Problem bekommt und du am Ende schneller ans Ziel kommst? Und nein, ich will nicht an dein Code ran, aber meine Zeit richtig einteilen.


----------



## Nesselbrand (30. Dez 2019)

```
package com.company;

import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class MainGui
{
    private JPanel panel1;
    private JLabel balance;
    private JButton geldEinzahlenButton;
    private JTextField geldEinzahlenfield;
    private JButton geldWettenButton;
    private JTextField geldWettenEinzahlenfield;
    private JLabel wettgeld;
    private JLabel kCroupier;
    private JButton hitButton;
    private JButton standButton;
    private JButton neuesSpielbutton;
    private JButton doublebutton;
    private JButton splitButton;

    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Black Jack");
        frame.setContentPane(new MainGui().panel1);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public MainGui()
    {
        geldEinzahlenButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Main.balance = Main.balance + Integer.parseInt(geldEinzahlenfield.getText());
                balance.setText("" + Main.balance);
                geldEinzahlenfield.setText("0");
            }
        });

        geldWettenButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                int temp = Integer.parseInt(geldWettenEinzahlenfield.getText());
                if (Main.balance < temp)
                {
                    JOptionPane.showMessageDialog(null,"Sie müssen zuerst Geld einzahlen");
                }
                else
                {
                    Main.wbalance = Main.wbalance + Integer.parseInt(geldWettenEinzahlenfield.getText());
                    Main.balance = Main.balance - Integer.parseInt(geldWettenEinzahlenfield.getText());
                    wettgeld.setText("" + Main.wbalance);
                    balance.setText("" + Main.balance);
                    geldWettenEinzahlenfield.setText("0");
                }

            }
        });

        neuesSpielbutton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                neuesSpielbutton.setVisible(false);
                Spielzüge.serve1c();
            }
        });
    }
}
```


----------



## Nesselbrand (30. Dez 2019)

```
package com.company;

public class Main
{
    public static int balance;
    public static int wbalance;

    public Main()
    {
        balance = 0;
        wbalance = 0;
    }

    public static void main(String[] args)
    {
        MainGui.main(args);
        KartenDeck.main(args);
        Spielzüge.main(args);
    }
}
```


----------



## Nesselbrand (30. Dez 2019)

```
package com.company;

import java.util.ArrayList;

public class Spielzüge
{

    public Spielzüge()
    {
    }

    public static void main(String[] args)
    {

    }

    public static void serve1c(ArrayList<KartenDeck> Kdeck) // Erster Spielzug; Serve für den Croupier
    {
        int temp = Kdeck.size();
        int temp2 = (int)(Math.random()) * temp;
        System.out.println(Kdeck.get(temp2));
    }
}
```


----------



## Nesselbrand (30. Dez 2019)

```
package com.company;

import sun.security.krb5.KdcComm;

import javax.swing.*;
import java.util.ArrayList;
import java.util.List;

public class KartenDeck
{
    public KartenDeck()
    {
    }



    public static void main(String[] args)
    {
        List<String> KdeckB = new ArrayList<>();


        KdeckB.add("ka2");
        KdeckB.add("ka3");
        KdeckB.add("ka4");
        KdeckB.add("ka5");
        KdeckB.add("ka6");
        KdeckB.add("ka7");
        KdeckB.add("ka8");
        KdeckB.add("ka9");
        KdeckB.add("ka10");
        KdeckB.add("kaB");
        KdeckB.add("kaD");
        KdeckB.add("kaK");
        KdeckB.add("kaA");

        KdeckB.add("he2");
        KdeckB.add("he3");
        KdeckB.add("he4");
        KdeckB.add("he5");
        KdeckB.add("he6");
        KdeckB.add("he7");
        KdeckB.add("he8");
        KdeckB.add("he9");
        KdeckB.add("he10");
        KdeckB.add("heB");
        KdeckB.add("heD");
        KdeckB.add("heK");
        KdeckB.add("heA");

        KdeckB.add("pi2");
        KdeckB.add("pi3");
        KdeckB.add("pi4");
        KdeckB.add("pi5");
        KdeckB.add("pi6");
        KdeckB.add("pi7");
        KdeckB.add("pi8");
        KdeckB.add("pi9");
        KdeckB.add("pi10");

        KdeckB.add("piB");
        KdeckB.add("piD");
        KdeckB.add("piK");
        KdeckB.add("piA");

        KdeckB.add("kr2");
        KdeckB.add("kr3");
        KdeckB.add("kr4");
        KdeckB.add("kr5");
        KdeckB.add("kr6");
        KdeckB.add("kr7");
        KdeckB.add("kr8");
        KdeckB.add("kr9");
        KdeckB.add("kr10");
        KdeckB.add("krB");
        KdeckB.add("krD");
        KdeckB.add("krK");
        KdeckB.add("krA");

        List Kdeck = new ArrayList<>();
        Kdeck.add(KdeckB);


    }
}
```


----------



## Nesselbrand (30. Dez 2019)

Das ist alles


----------



## Nesselbrand (30. Dez 2019)

und ich möchte die methode
serve1c(ArrayList<KartenDeck> Kdeck)
in der Klasse MainGui ausführen, nachdem der neuesSpielbutton gedrückt wurde


----------



## Javinner (30. Dez 2019)

Nesselbrand hat gesagt.:


> Das ist alles


Du nichts für Ungut, schaue ich mir Morgen an, muss jetzt weg.


----------



## Nesselbrand (30. Dez 2019)

Klar kein Problem


----------



## Javinner (30. Dez 2019)

1.0 Bitte schreib mir die Idee hinter deinem Code auf, was programmieren wir?
Dein ganzer Code ist, ja, für den Arsch..


----------



## Nesselbrand (30. Dez 2019)

Ein Blackjack spiel.
In der Klasse kartendeck sind die karten aufgelistet. Diese sollen dann per Zufall ausgewählt werden und and den croupier und den spieler ausgeteilt werden. Danach sollen die karten aus der Liste gelöscht werden. Das ganze kann man resetten, da ich eine zweite liste, die Kdeck habe, in die nicht eingegriffen wird. Ich war dabei, dass ich ein element aus der liste entfernen kann, was nich tfunktioniert hat.


----------



## Javinner (30. Dez 2019)

Nesselbrand hat gesagt.:


> Ein Blackjack spiel


Ich lese mich ein, melde mich sicher nicht Morgen, @silvesterUndSonScheiß , coole Sache ich bin dabei, frohes Neues!


----------



## Nesselbrand (30. Dez 2019)

Dir auch!


----------



## Nesselbrand (30. Dez 2019)

Bis zum nächsten Jahrzent!


----------



## Javinner (30. Dez 2019)

Nesselbrand hat gesagt.:


> Bis zum nächsten Jahrzent


Mir zu lang, ich melde mich am 01.01.20


----------



## Xyz1 (30. Dez 2019)

Javinner hat gesagt.:


> Mir zu lang, ich melde mich am 01.01.20


 Erst kürzlich noch gesehen und Zack, sind 10 Jahre um.


----------



## Javinner (30. Dez 2019)

@CheckParameterDerZeitMaschine


----------



## Nesselbrand (30. Dez 2019)




----------



## kneitzel (31. Dez 2019)

Also deine Klasse Kartendeck macht eigentlich nichts. Wenn Du es als Programm aufrufst, dann wird eine Liste erstellt und gefüllt, dann noch eine zweite Liste mit den Elementen der ersten Liste und dann war es das sofort, denn die Listen sind nur in lokalen Variablen und damit ein Fall für den Garbage Collector. So macht der Code also absolut keinen Sinn!

Dann macht ein ArrayList<KartenDeck> keinen Sinn, denn KartenDeck hat ja keinen Inhalt, so dass Instanzen nicht haben, was nicht Object auch hätte...

`(int)(Math.random()) * temp;` macht keinen Sinn - da kannst Du gleich 0 hin schreiben, denn Math.random() liefert eine Zahl zwischen 0 und 0.9999999.... Daraus ein int ist also immer 0. Und das mal temp bleibt 0. Evtl. willst Du ja die Klammer anders setzen:
`(int)(Math.random() * temp);`

Du solltest Dich aus meiner Sicht mit Objektorientierter Entwicklung beschäftigen. Und am Anfang kannst Du davon ausgehen: Es gibt nur ein statisches Element und das ist genau EINE main Methode als Einstiegspunkt. Am Anfang mehr static zu machen ist in der Regel ein Fehler.

Also was Du machen musst, ist dir ein ordentliches Objektmodell überlegen.

Du hast ein Kartendeck? Was ist denn ein Kartendeck? Eine Sammlung von Karten? Also muss es da sowas geben wie:

```
public class CardDeck {
    private List<Card> cards;
    
    public CardDeck() {
        cards = new ArrayList<Card>();
        // Fill cards if you want to ...
    }
}
```
Da hat das Kartendeck noch keine Funktionalität, aber dazu kommen wir später. Was ist denn eine Karte? Was zeichnet eine Karte aus? Eine Karte hat eine Farbe und einen Wert oder wie man das immer bezeichnen will. Also man hat dann sowas in der Art:

```
public class Card {
  private CardColor color;
  private CardValue value;
 
  public Card(CardColor color, CardValue value) { ... }
}

public enum CardColor { KREUZ, PIEK, HERZ, KARO }
public enum CardValue { ZWEI, DREI, VIER, .... }
```

Natürlich kommt jede Klasse / Enum seine eigene Datei! Und ich habe vieles weggelassen (getter/setter (so notwendig und nur wenn notwendig. Getter bei Card würde ich sehen, aber keine Setter) / inhalt Konstruktor) ....

Dann kannst Du ein Verhalten definieren.

Du willst CardDeck evtl. so haben, dass Du neue Karten hinzufügen kannst, also z.B. eine add Methode.
Du willst eine zufällige Karte entnehmen? Oder Du willst mischen und dann eine Karte am Anfang ziehen/entfernen?
Das kommt dann als Methoden in die entsprechenden Klassen und damit kommt dann das Verhalten...

Das einfach einmal auf die Schnelle von meiner Seite ...


----------



## Nesselbrand (31. Dez 2019)

Dan muss ich nur noch alle Karten als Objekte von Card einfügen und diese in die List einfügen oder?


----------



## kneitzel (31. Dez 2019)

Bei dem Ansatz wäre das eine Möglichkeit. Evtl. will man bei allen Begriffe noch auf die englische Version wechseln ... Da ist mir noch etwas MischMasch rein geraten beim tippen hier im Forum Editor


----------



## Xyz1 (31. Dez 2019)

Nesselbrand hat gesagt.:


> Dan muss ich nur noch alle Karten als Objekte von Card einfügen und diese in die List einfügen oder?


Ja, lass den Kokolores einfach weg...


----------



## Nesselbrand (31. Dez 2019)

Kokolores?


----------



## Nesselbrand (31. Dez 2019)

Die Karten muss ich dann im knstruktor von der Klasse card initiieren oder?


----------



## Nesselbrand (31. Dez 2019)

```
public class Card
{
    private CardColor color;
    private CardValue value;

    public Card(CardColor color, CardValue value)
    {
        Card Pik2 = new Card(CardColor.Pik, CardValue.ZWEI);
    }
}
```
So dann ?


----------



## kneitzel (31. Dez 2019)

Noch als kleiner Hinweis:

Wenn Du es auch mit den beiden Enumerations machen solltest, dann kannst Du die entsprechenden Karten relativ einfach generieren, indem du 2 Schleifen verschachtelst, in denen Du jeweils über alle Werte einer Enumeration gehst. Das könnte dann im Konstruktor z.B. so aussehen:

```
for (CardColor color: CardColor.values()) {
            for (CardValue value: CardValue.values()) {
                cards.add(new Card(color, value));
            }
        }
```


----------



## kneitzel (31. Dez 2019)

Nesselbrand hat gesagt.:


> Die Karten muss ich dann im knstruktor von der Klasse card initiieren oder?


Nein, eine Karte kennt nur sich selbst. Du hast ja ein Kartendeck mit allen Karten. Das Kartendeck muss alle Karten des Decks kennen. Daher war da eine List<Card> als Instanzvariable enthalten.

Die Schleifen wären also Bestandteil des Konstruktors von Deinem Kartendeck.


----------



## Nesselbrand (31. Dez 2019)

ok Danke


----------



## Nesselbrand (31. Dez 2019)

```
import java.util.ArrayList;
import java.util.List;

public class CardDeck
{
    public List<Card> cards;

    public CardDeck()
    {
        cards = new ArrayList<>();
        for (CardColor color: CardColor.values()) {
            for (CardValue value: CardValue.values()) {
                cards.add(new Card(color, value));
            }
        }
    }
    public List<Card> getCards()
    {
        return cards;
    }
}
```
Ich habe jetzt eine get Methode für cards eingeführt. Diese möchte ich jetzt per Knopfdruck ausführen (nur zum Test).



```
neuesSpielbutton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                neuesSpielbutton.setVisible(false);
                System.out.println(CardDeck.getCards());
            }
        });
```

Bei mir wird dann eine Fehlermeldung bei CarDeck.getCards() ausgegeben. (Non static .. cannot be reverenced from a static context)
Wie kann ich das beheben?


----------



## kneitzel (31. Dez 2019)

CardDeck ist erst einmal nur ein Bauplan. Von diesem Bauplan kannst du mehrere Instanzen erzeugen, aber natürlich kannst Du damit selbst so noch nichts anfangen. Also wie bei einem Haus: Wenn Du erst einen Bauplan hast, dann kannst Du Dich noch nicht im Wohnzimmer an den Tisch setzen!

Also musst Du Dir überlegen, wo und wie Du nun reelle Kartendecks haben möchtest. Wie bei einem Haus brauchst du da sowas wie ein Bauplatz. Also könntest Du z.B. in einer anderen Klasse eine Instanzvariable einbauen und so. Und dann hätte diese Instanz eine Instanz von Kartendeck, auf der dann so Methoden aufgerufen werden können.

Was du aber auch bedenken solltest: Wenn Du Auto fährst, dann sagst Du auch nicht getMotor() um dann da direkt am Motor etwas einzustellen. Statt dessen nutzt Du Elemente, die das Auto speziell für Dich zur Verfügung stellt. So sollte es auch hier sein. Das Du da eine List<Card> hast, geht niemanden etwas an. Statt dessen bietest Du nur an, was benötigt wird, also z.B. Karte ziehen oder so.


----------



## Nesselbrand (31. Dez 2019)

Wie würde das mit der Instanzvariable dann aussehen?


----------



## Nesselbrand (31. Dez 2019)

Das mit der Kartenmethode wollte ich nur ausprobieren. Am Ende gibt es dan nur Methoden für das Kartenziehen ... .


----------



## kneitzel (31. Dez 2019)

In der Klasse MainGui könntest Du eine Instanz von CardDeck haben, also sowas wie
private CardDeck cards = new CardDeck();

Damit hättest Du in Deiner Ui eine Instanz davon und kannst da dann drauf zugreifen.

Ob das Sinn macht oder ob es besser wäre, da alles noch weiter aufzubauen, musst Du wissen. Ich selbst hätte ohne Oberfläche erst weiter die Spiellogik aufgebaut. Was gehört alles zu einem Spiel? Ein KartenDeck, Spieler, u.s.w.

Die Oberfläche würde ich erst sehr spät aufbauen...


----------



## Nesselbrand (31. Dez 2019)

habe es jetzt so gemacht:
	
	
	
	





```
CardDeck deck1 = new CardDeck();
```
Danach dann den restlichen code von oben nur halt mit deck1.get..


----------



## Nesselbrand (31. Dez 2019)

Mit der Mehtode wurde mir dann aber sowas ausgegeben:
com.company.Card@918639 usw.


----------



## Nesselbrand (31. Dez 2019)

und nicht dass Herz DREI oder so.
Woran liegt dass dann?


----------



## lennero (31. Dez 2019)

Nesselbrand hat gesagt.:


> und nicht dass Herz DREI oder so



System.out.println(object) ruft die toString() Methode vom Objekt auf. Diese hast du aber in Card nicht überschrieben. Also wird toString der Superklasse aufgerufen. In dem Fall der Klasse Object.


----------



## Nesselbrand (31. Dez 2019)

Wie kann ich die toString() Methode in Card überschreiben?


----------



## kneitzel (31. Dez 2019)

In dem Du eine Methode wie folgt schreibst:

```
@Override
public String toString() {
  return "CardDeck";
}
```

Aber den String machst Du idealerweise dynamisch, also z.B. kannst Du einen String bauen, der etwas ausgibt wie: (CardDesk: card1, card2, ....)


----------



## Nesselbrand (31. Dez 2019)

```
@Override
    public String toString()
    {
        return "CardDeck{" +
                "cards=" + cards +
                '}';
    }
```

Dann wird mir das ausgespuckt :
CardDeck{cards=[com.company.Card@399392, com.company.Card@41bf74, com.company.Card@17a80ca, ...usw
und immer noch nicht Herz DREI.


----------



## mihe7 (31. Dez 2019)

Nesselbrand hat gesagt.:


> und immer noch nicht Herz DREI.


Du musst schon selbst dafür sorgen, dass das ausgegeben wird, was Du willst.


----------



## Xyz1 (31. Dez 2019)

Nesselbrand hat gesagt.:


> Kokolores?


Ehrlich, man nimmt einfach Strings dafür und keine Objekte - das meinte ich damit sich nicht jeden Kokolores andrehen zu lassen - und nebenbei sei angemerkt ist das auch effizienter. => Weniger Overhead und weniger Boilerplate, schneller zu schreiben, besser zu lesen.


----------



## Xyz1 (31. Dez 2019)

mihe7 hat gesagt.:


> Du musst schon selbst dafür sorgen, dass das ausgegeben wird, was Du willst.


Mit Strings wäre das allerdings kein nennenswertes Problem.


----------



## Nesselbrand (31. Dez 2019)

ok ich probiers mal aus


----------



## Nesselbrand (31. Dez 2019)

Brauche ich die Klasse Card und die enums dann überhaupt noch?


----------



## kneitzel (31. Dez 2019)

Also ich frage mich manchmal wirklich, was hier abgeht....

Also für Tobias ist das einfache Überschreiben der toString Methode ein "nennenswertes Problem". Aber nach der letzten Auseinandersetzung wundert mich das nicht mehr...

@Nesselbrand: Einfache kurze Frage von meiner Seite: Ist dies eine kleine Aufgabenstellung, an Hand derer du objektorientierte Entwicklung lernen willst? Dann führe ich Dich gerne weiter. Die Problematik bei Card ist ansonsten 1:1 die von CardDeck: toString() überschreiben und schon hast Du auch für Card eine vernünftige Ausgabe.
So Du nur irgendwas zusammen frickeln willst, dann ja: Dann brauchst Du das alles nicht mehr. Dann kann Dir unserer Chef-Frickler hier bestimmt weiter helfen und ich kann mir die weiteren Erläuterungen sparen.

Also einfache Entscheidung: Rumfrickeln? Oder an diesem Beispiel Objektorientiert Entwickeln lernen? Deine Entscheidung.


----------



## Nesselbrand (31. Dez 2019)

Ich wollte dieses Projekt machen und dabei was lernen. so "learning by doing " mäßig.


----------



## Nesselbrand (31. Dez 2019)

ich habe die tostring methode jetzt auch in card überschrieben.
jetzt steht nachdem ich system.out.println ausgeführt habe nur Da:
CardDeck{cards=[Card{color=null, value=null} usw...
Aber die Karten sollten ja alle unterschiedliche Werte(Herz, Pik ... oder ZWEI, DREI ...) haben und nicht null sein


----------



## kneitzel (31. Dez 2019)

Dann zeig bitte einmal deinen aktuellen Code.


----------



## Nesselbrand (31. Dez 2019)

```
public enum CardColor
{
    Karo, Herz, Pik, Kreuz
}

public enum CardValue
{
    ZWEI, DREI, VIER, FUENF, SECHS, SIEBEN, ACHT, NEUN, ZEHN, BUBE, DAME, KOENIG, Ass
}
```


----------



## Nesselbrand (31. Dez 2019)

```
public class Card
{
    private CardColor color;
    private CardValue value;

    public Card(CardColor color, CardValue value)
    {
    }

    @Override
    public String toString()
    {
        return "Card{" +
                "color=" + color +
                ", value=" + value +
                '}';
    }
}
```


----------



## Nesselbrand (31. Dez 2019)

```
import java.util.ArrayList;
import java.util.List;

public class CardDeck
{
    public ArrayList<Card> cards;

    public CardDeck()
    {
        cards = new ArrayList<>();
        for (CardColor color: CardColor.values()) {
            for (CardValue value: CardValue.values()) {
                cards.add(new Card(color, value));
            }
        }
        cards.add(new Card(CardColor.Kreuz, CardValue.ZWEI));
    }

    @Override
    public String toString()
    {
        return "CardDeck{" +
                "cards=" + cards +
                '}';
    }
}
```


----------



## Nesselbrand (31. Dez 2019)

```
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

public class MainGui
{
    private JPanel panel1;
    private JLabel balance;
    private JButton geldEinzahlenButton;
    private JTextField geldEinzahlenfield;
    private JButton geldWettenButton;
    private JTextField geldWettenEinzahlenfield;
    private JLabel wettgeld;
    private JLabel kCroupier;
    private JButton hitButton;
    private JButton standButton;
    private JButton neuesSpielbutton;
    private JButton doublebutton;
    private JButton splitButton;

    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Black Jack");
        frame.setContentPane(new MainGui().panel1);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public MainGui()
    {
        geldEinzahlenButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Main.balance = Main.balance + Integer.parseInt(geldEinzahlenfield.getText());
                balance.setText("" + Main.balance);
                geldEinzahlenfield.setText("0");
            }
        });

        geldWettenButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                int temp = Integer.parseInt(geldWettenEinzahlenfield.getText());
                if (Main.balance < temp)
                {
                    JOptionPane.showMessageDialog(null,"Sie müssen zuerst Geld einzahlen");
                }
                else
                {
                    Main.wbalance = Main.wbalance + Integer.parseInt(geldWettenEinzahlenfield.getText());
                    Main.balance = Main.balance - Integer.parseInt(geldWettenEinzahlenfield.getText());
                    wettgeld.setText("" + Main.wbalance);
                    balance.setText("" + Main.balance);
                    geldWettenEinzahlenfield.setText("0");
                }

            }
        });

        CardDeck deck1 = new CardDeck();

        neuesSpielbutton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                neuesSpielbutton.setVisible(false);
                System.out.println(deck1.toString());
            }
        });
    }
}
```


----------



## Nesselbrand (31. Dez 2019)

```
public class Main
{
    public static int balance;
    public static int wbalance;

    public Main()
    {
        balance = 0;
        wbalance = 0;
    }

    public static void main(String[] args)
    {
        MainGui.main(args);
    }
}
```


----------



## Nesselbrand (31. Dez 2019)

Dass ist alles


----------



## kneitzel (31. Dez 2019)

Nesselbrand hat gesagt.:


> ```
> public class Card
> {
> private CardColor color;
> ...


Beim Konstruktor hatte ich doch den Inhalt weggelassen um es kurz zu halten. Wie muss denn den Konstruktor aussehen, damit die Parameter in den Instanzvariablen gespeichert werden?


----------



## Nesselbrand (31. Dez 2019)

{
this.color = color;
this.value = value;
}
?


----------



## Nesselbrand (31. Dez 2019)

hat geklappt!!


----------



## Nesselbrand (31. Dez 2019)

Danke für deine Hilfe


----------



## Nesselbrand (31. Dez 2019)

Wie kann ich jetzt aus einem zufällig ausgewähltem Objekt color / value auslesen?

```
public void RandomCard()
    {
        int temp =(int) (Math.random() * cards.size() - 1);
        System.out.println(cards.get(temp));

        cards.remove(temp); // Karte soll pro spiel nur einmal vorkommen
    }
```


----------



## Nesselbrand (31. Dez 2019)

Das kann man über einen getter aus der Klasse card machen oder ?


----------



## kneitzel (31. Dez 2019)

Nesselbrand hat gesagt.:


> Das kann man über einen getter aus der Klasse card machen oder ?



Ja, das ist richtig: dazu solltest Du Getter in Card implementieren.

Und ehe Du remove aufrufst solltest Du Dir die Karte erst mit get holen.


----------



## Nesselbrand (31. Dez 2019)

Die Karte habe ich in einem string zwischengespeichert ehe sie auf den Bildschirm ausgegeben wird.


----------



## kneitzel (31. Dez 2019)

Nunja, da sind wir beim Thema String. Zur Ausgabe macht es ja Sinn, aber erst zur Ausgabe. Bis dahin hast Du ja eine Card Instanz und die solltest Du erst einmal beibehalten. Wenn Du eine Karte ziehst, dann weißt Du ja noch nicht, was damit geschehen soll

Daher wäre es doch durchaus sinnvoll, dass CardDeck eine Methode zum Ziehen einer Karte bekommt, die eine Karte aus dem Stapel entfernt und dann zurück gibt. Methoden sollten ansonsten auch mit einem kleinen Buchstaben beginnen.

Und als Name macht es dann Sinn, etwas zu wählen, das verständlich ist, wie z.B. removeRandomCard. Rückgabe wäre dann Card. Ggf. Noch einbauen, dass es kein Problem gibt, wenn der Kartenstapel leer ist - das Verhalten kann man sich überlegen. Man könnte dann statt einer Karte null zurück geben. Man könnte aber auch eine Exception werfen.


----------



## Nesselbrand (31. Dez 2019)

Ich habe das so gemacht dass ich ein gui gemacht habe und dann bin ich gerade dabei dessen Funktionen zu programmieren.
Da braucht man eine Ausgabe.


----------



## kneitzel (31. Dez 2019)

Die Idee ist doch, dass man eine saubere Objektstruktur bekommt. 

Und bei dem Spiel soll es doch auch nicht nur darum gehen, dass die Karte ausgegeben wird, oder? Also kommt da noch mehr Code ins Spiel.

Und vielleicht hast Du ja auch schon einmal gelesen, dass man ‚Business Logik‘ und ‚UI‘ getrennt halten soll?

Daher wäre es aus meiner Sicht unklug, da jetzt (ohne für mich erkennbaren Grund) die Methoden jetzt einzuschränken.


----------



## Nesselbrand (31. Dez 2019)

Habs doch nochmal anders gemacht, so wie dus gessagt hast. Ist schlauer.
Danke für den Tipp.


----------



## Javinner (1. Jan 2020)

JustNobody hat gesagt.:


> Die Idee ist doch, dass man eine saubere Objektstruktur bekommt


Genau hier sollte man beginnen: ein Plan. Um das Vorhaben übersichtlicher zu machen würde ich fürs Erste auf GUI verzichten.
Lasse es einfach in der Konsole ablaufen, GUI ist später leicht hinzugefügt.

Die Klasse CardDeck würde ich umschreiben, in dem ich den Vorgang in eine Methode auslagere, denn wenn dein Deck, welcher aus 6x52 besteht, leer ist, soll ein neues geladen werden.

```
public CardDeck()
{
     cards = new ArrayList<>();
     for (CardColor color: CardColor.values()) {
          for (CardValue value: CardValue.values()) {
              cards.add(new Card(color, value));
          }
      }
}
```


```
public CardDeck()
{
     createCardDeck();
}

private void createCardDeck()
{
    //Dein Code
}

public Card getNextCard()
{
       if(cards.isEmpty())
       {
               createCardDeck();
        }
       Card card ...
}
```
Zudem erkenne ich den Sinn der derzeitigen toString()-Methode nicht, wozu?

Dann Spielerfrage: soll es Mitspieler geben? Ich hätte mich ganz klar dagegen entschieden, weil es die Sache unnötig kompliziert macht. Viel mehr würde ich mir die Struktur überlegen, wie ich ein ComputerPlayer von einem HumanPlayer trenne. Als Extra kannst du dir überlegen, wie du das Geschlecht implementierst.
Als Beispiel:

```
public String createName(boolean gender)
{
     if(gender)
     {
          //Men
      } else
      {
           //Women
       }
}

String name = NameCreator.createName(false);
Player p = new ComputerPlayer(name);

public class ComputerPlayer
{
     public ComputerPlayer(String name)
     {
          super(name);
      }
}
```
Der Unterschied von beiden kann in der Prozedur des Kartengebens liegen. Während du für dich entscheidest und es mehrere Menschen geben kann, wird der Prozess für ein ComputerPlayer automatisiert durchgeführt.


----------



## Nesselbrand (2. Jan 2020)

Ich kann jetzt BlackJack gegen den Compute spielen . Hat alles geklappt. Danke für die viele Hilfe


----------



## Nesselbrand (2. Jan 2020)

Ich habe aber leider schon das nächste Problem.
Ich habe einen Automaten programmiert, wo wenn man 4 einser zieht, dass man dann Geld gewinnt. Ich wollte nun einen Automatikmodus einbauen, der jede sekunde nochmal Spielt und testet ob man gewinnt. Dass habe ich mit der Klasse One_Sec_CLock gemacht. Aber das Gui wird nicht geupdatet. Der Rest, also das man Geld gewinnt etc funktioniert. Ich habe dass mit System.out.println()  (Steht auch im Code drinnen) geprüft. Kann mir jamand sagen wie ich das mit dem Gui fixen kann?
Das Gui:

```
autoButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                One_Sec_Clock.ThreadStarten();
            }
        });
    }
    public void Auto ()
    {
        System.out.println("a");
        if (Main.balance == 0)
        {
            JOptionPane.showMessageDialog(null,"Sie haben nicht genügend Geld");
            One_Sec_Clock.ThreadStoppen();
            return;
        }
        Main.balance = Main.balance - 1;
        balance.setText("" + Main.balance);
        Automat automat1 = new Automat();
        automat1.getRandomNr();
        w1.setText("" + Automat.w1);
        w2.setText("" + Automat.w2);
        w3.setText("" + Automat.w3);
        w4.setText("" + Automat.w4);
        if (Automat.w1 == Automat.w2 && Automat.w2 == Automat.w3 && Automat.w3 == Automat.w4 && Automat.w4 == 1)
        {
            Main.balance = Main.balance + 100;
            balance.setText("" + Main.balance);
        }
        System.out.println("b");
```

Automat ist eine Klasse in der die Methode ist die die Zahlen zufällig auswählt usw.
w1 etz sind Variablen für die einzelnen "Walzen" also die Zahlen die zufällig ausgewählt werden.

Klasse mit dem Thread:

```
public class One_Sec_Clock
{
    public static class Thread1 extends Thread
    {
        public void run()
        {
            MainGui o = new MainGui();
            while(true)
            {
                System.out.println("test1");
                try {Thread.sleep(1000); }
                catch (Exception e1) {
                    System.out.println("return");
                    return;
                }
                System.out.println("test2");
                o.Auto();
                System.out.println("test3");
            }
        }
    }

    public static void ThreadStarten()
    {
        Thread thread = new Thread1();
        thread.start();
    }

    public static void ThreadStoppen()
    {
        Thread.currentThread().stop();
    }
}
```


----------



## kneitzel (2. Jan 2020)

Du erzeugst eine neue GUI in dem Thread und die aktualisierst du. Du musst dem Thread natürlich eine Referenz auf deine UI geben.

Und du nutzt noch einiges an static Variablen scheint mir. Das solltest Du nicht so machen... statt dessen halt das arbeiten mit Referenzen...

Das Thread.currentThread ist auch so eine Sache, die ich nicht nutzen würde....


----------



## kneitzel (2. Jan 2020)

Also meine ganz eindringliche Bitte ist wirklich: Nutze überhaupt kein static  - außer eben bei der main Methode.

Das mit dem Thread könnte man so bauen:

```
public class OneSecClock implements Runnable // Statt von Thread ableiten einfach Runnable implementieren.
{
  private Thread thread = null;  // Wir speichern den erzeugten Thread für später.
  private MainGui mainGui;  // Wir speichern die MainGui - gefällt mir vom Design noch nicht, aber erst mal egal!
 
  public OneSecClock(final MainGui mainGui) {  // Konstruktor setzt die MainGui!
    this.mainGui = mainGui;
  }
 
  // Run Methode von Runnable.
  public void run()
  {
    MainGui o = new MainGui();
    while(true) {
      System.out.println("test1");
      try {Thread.sleep(1000); }
      catch (Exception e1) {
        System.out.println("return");
        return;
      }
      System.out.println("test2");
      mainGui.Auto();  // Auto ist eine Methode und muss klein geschrieben werden!
      System.out.println("test3");
    }
  }

  public void start() {
    // Check if thread already exists.
    if (thread != null && thread.isAlive()) return;
    
    Thread thread = new Thread(this);
    thread.start();
  }

  public void stop() {
    if (thread == null || !thread.isAlive()) return;
    
    thread.stop();
  }
}
```

Da sind jetzt viele Dinge rein gekommen:
- Schreibweise - Methoden werden klein geschrieben, Klassen groß. Dann gibt es keine _ in den Namen.
- static wurde komplett heraus genommen. Jetzt ist da eine Klasse, von der Du eine Instanz erzeugen musst um dann die Instanz zu nutzen.
- Stoppen stoppt nicht einfach den aktuellen Thread - denn das muss ja nicht zwangsläufig der eigene Thread sein!
- Der Status vom thread wird abgefragt. Wenn ein Thread schon läuft, dann wird kein anderer mehr gestartet.

Das Design ist aber immer noch nicht gut. Eine Klasse, die nur jede Sekunde etwas machen soll, muss doch nichts über eine MainGui wissen. Das kann man also gut entkoppeln.
Man könnte also z.B. eine Instanzvariable vom Typ Consumer<OneSecClock> haben, die man setzen kann. Dann würde diese Klasse die MainGui nicht kennen. Und jede Sekunde würde dann einfach geprüft, ob diese Variable nicht null ist um dann accept(this) darauf aufzurufen.
MainGui würde dann eine Instanz erzeugen und dann einen Consumer bereit stellen (Das ginge über Lambda Ausdrücke ganz einfach mit  e->Auto() oder falls man Auto noch ein OneSecClock Parameter gibt, dann ist this::Auto als Parameter möglich.
Der Konstruktor nimmt evtl. noch das gewünschte Intervall, so dass dann ein universeller Timer entsteht.

==> Man kann hier aber natürlich auch einen beliebigen vorhandenen Timer nutzen statt einen eigenen zu bauen...


----------



## Nesselbrand (2. Jan 2020)

Welche vorhandene Timer gibt es denn?
Als ich im Internet gesucht habe habe ich nur diese Mehtode gefunden.


----------



## mihe7 (2. Jan 2020)

Nesselbrand hat gesagt.:


> Welche vorhandene Timer gibt es denn?


Zum Beispiel: 
java.util.Timer
java.util.concurrent.ScheduledExecutorService
javax.swing.Timer


----------



## kneitzel (2. Jan 2020)

java.util.Timer
javax.swing.Timer

Um die zwei Timer Klassen zu nennen, die für Dich in Frage kommen. Der Swing Timer hat soweit ich weiss den Vorteil, dass da der UI Thread genutzt wird (so man dies braucht).


----------



## Nesselbrand (2. Jan 2020)

ok Danke


----------



## Nesselbrand (2. Jan 2020)

wie kann ich die methode dann in meinem actionlistener aufrufen?
da wenn ich ein neues objekt der Klasse onesectimer erstelle gibt es mir den Fehler aus dass "() cannot be applied to (MainGui)"
bei One_Sec_Clock o = new One_Sec_Clock();


----------



## kneitzel (2. Jan 2020)

Kannst Du da mal den ganzen Code zeigen?


----------



## Nesselbrand (2. Jan 2020)

```
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MainGui
{
    private JPanel Jpanel;
    private JLabel w1;
    private JLabel w2;
    private JLabel w3;
    private JButton PlayButton;
    private JLabel balance;
    private JButton InsertMoneyButton;
    private JTextField InsertMoneyValue;
    private JButton autoButton;
    private JLabel w4;

    public static void main(String[] args)
    {
        JFrame frame = new JFrame("Einarmiger Bandit");
        frame.setContentPane(new MainGui().Jpanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    public MainGui()
    {
        InsertMoneyButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                Main.balance = Main.balance + Integer.parseInt(InsertMoneyValue.getText());
                balance.setText("" + Main.balance);
                InsertMoneyValue.setText("0");
            }
        });
        PlayButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {
                if (Main.balance == 0)
                {
                    JOptionPane.showMessageDialog(null,"Sie haben nicht genügend Geld");
                    return;
                }
                Main.balance = Main.balance - 1;
                balance.setText("" + Main.balance);
                Automat automat1 = new Automat();
                automat1.getRandomNr();
                w1.setText("" + Automat.w1);
                w2.setText("" + Automat.w2);
                w3.setText("" + Automat.w3);
                w4.setText("" + Automat.w4);
                if (Automat.w1 == Automat.w2 && Automat.w2 == Automat.w3 && Automat.w3 == Automat.w4 && Automat.w4 == 1)
                {
                    JOptionPane.showMessageDialog(null,"Sie haben Gewonnen!");
                    Main.balance = Main.balance + 100;
                    balance.setText("" + Main.balance);
                }
            }
        });
        autoButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent e)
            {

            }
        });
    }
    public void auto ()
    {
        System.out.println("a");
        if (Main.balance == 0)
        {
            JOptionPane.showMessageDialog(null,"Sie haben nicht genügend Geld");
            //TODO Thread stoppen muss geschrieben und hier implementiert werden
            return;
        }
        Main.balance = Main.balance - 1;
        balance.setText("" + Main.balance);
        Automat automat1 = new Automat();
        automat1.getRandomNr();
        w1.setText("" + Automat.w1);
        w2.setText("" + Automat.w2);
        w3.setText("" + Automat.w3);
        w4.setText("" + Automat.w4);
        if (Automat.w1 == Automat.w2 && Automat.w2 == Automat.w3 && Automat.w3 == Automat.w4 && Automat.w4 == 1)
        {
            Main.balance = Main.balance + 100;
            balance.setText("" + Main.balance);
        }
        System.out.println("b");
    }
}
```


```
public class One_Sec_Clock implements Runnable
{
    private Thread thread = null;
    private MainGui mainGui;

    public One_Sec_Clock(MainGui mainGui)
    {
        this.mainGui = mainGui;
    }

    public void run()
    {
        while(true)
        {
            System.out.println("test1");
            try {Thread.sleep(1000); }
            catch (Exception e1) {
                System.out.println("return");
                return;
            }
            System.out.println("test2");
            mainGui.auto();
            System.out.println("test3");
        }
    }
    public void threadstarten()
    {
        thread.start();
    }
    public void threadstoppen()
    {

    }

}
```


```
public class Walze
{
    /*Eine Walze hat 9 Möglichkeiten zu stehen von 1 bis 9*/

    public static int number;

    public int RandomNumber()
    {
        int temp = (int) (Math.random() * 9 + 1);
        return temp;
    }
}




public class Automat
{
    public static int w1;
    public static int w2;
    public static int w3;
    public static int w4;

    public void getRandomNr()
    {
        Walze w = new Walze();
        w1 = w.RandomNumber();
        w2 = w.RandomNumber();
        w3 = w.RandomNumber();
        w4 = w.RandomNumber();
    }
}
```


----------



## kneitzel (2. Jan 2020)

Also in dem Code sehe ich jetzt keine Stelle mit `One_Sec_Clock o = new One_Sec_Clock();`.

Aber der Konstruktor von One_Sec_Clock will ja ein MainGui als Parameter. Also innerhalb von MainGui wäre das dann z.B.:
`One_Sec_Clock o = new One_Sec_Clock(this);`


----------



## Nesselbrand (2. Jan 2020)

ich habe das jetzt so gemacht. wenn ich aber dann den Knopf drücke wird mir in der Konsole eine Fehlermeldung ausgegeben:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.company.One_Sec_Clock.threadstarten(One_Sec_Clock.java:30)
    at com.company.MainGui$3.actionPerformed(MainGui.java:75)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6539)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6304)
    at java.awt.Container.processEvent(Container.java:2239)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2297)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
    at java.awt.Container.dispatchEventImpl(Container.java:2283)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
    at java.awt.EventQueue$4.run(EventQueue.java:733)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)


----------



## kneitzel (2. Jan 2020)

Ja, dann schau einfach einmal One_Sec_Clock.java:30 (Also Zeile 30 in One_Sec_Clock.java) an. Wo könnte da etwas null sein?

Du könntest natürlich auch generell Deine Methode threadstarten mit meiner start Methode vergleichen....
Irgendwie habe ich da deutlich mehr als eine Zeile gehabt


----------



## Nesselbrand (2. Jan 2020)

Tschuldigung haeb ich übersehen


----------



## Nesselbrand (2. Jan 2020)

FUnktioniert jetzt


----------



## Nesselbrand (2. Jan 2020)

Wenn ich den thread aber stoppen will bekomme ich die Fehlermeldung:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at com.company.One_Sec_Clock.threadstoppen(One_Sec_Clock.java:34)
    at com.company.MainGui$4.actionPerformed(MainGui.java:86)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
    at java.awt.Component.processMouseEvent(Component.java:6539)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
    at java.awt.Component.processEvent(Component.java:6304)
    at java.awt.Container.processEvent(Container.java:2239)
    at java.awt.Component.dispatchEventImpl(Component.java:4889)
    at java.awt.Container.dispatchEventImpl(Container.java:2297)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476)
    at java.awt.Container.dispatchEventImpl(Container.java:2283)
    at java.awt.Window.dispatchEventImpl(Window.java:2746)
    at java.awt.Component.dispatchEvent(Component.java:4711)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84)
    at java.awt.EventQueue$4.run(EventQueue.java:733)
    at java.awt.EventQueue$4.run(EventQueue.java:731)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:730)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)


----------



## kneitzel (2. Jan 2020)

Ok, bei mir hat sich ein Fehler eingeschlichen. Es darf natürlich keine lokale Variable erstellt werden:
Also statt
`Thread thread = new Thread(this);`
muss es
`thread = new Thread(this);`
sein.


----------



## Nesselbrand (2. Jan 2020)

ok


----------

