# Auf Mausklick warten



## tom003 (26. Apr 2008)

Hallo Leute!

Ich soll für die Schule als Projekt ein "Mensch ärger dich nicht" Spiel programmieren. Und dabei kommt mir gerade ein Problem, auf welches ich einfach keine Lösung finde. Und zwar soll das Programm einfach auf einen Mausklick warten. Also die Funktion "setzenBenutzer()" soll so lange warten, bis der Spieler auf eines seiner Startfelder geklickt hat. Hab schon probiert, das ganze mit einem Thread zu realisieren und ein Thread.join() zu machen, um dann so lange zu warten, bis der Thread abgearbeitet ist, doch das funktionierte nicht so ganz wie es sollte  ???:L 
Weiß vl jemand wie ich ganz einfach auf einen Mausklick warten kann?



```
///Sucht das Startfeld, welches gedrückt wurde und gibt dieses zurück

    public Feld gedrFeldStart()
    {
        ListIterator<Feld> felder = sf.startfelder.listIterator(sf.startfelder.size());
        while (felder.hasPrevious())
        {
            feld = felder.previous();
            mx = feld.xcord + 15;
            my = feld.ycord + 15;
            dx = x - mx;
            dy = y - my;
            c = (dx * dx) + (dy * dy);
            if (c <= (15 * 15))
            {
                return feld;
            }
        }
        return null;
    }
```



Das Mouse Event

```
public void mouseClicked(MouseEvent e)
    {
        x = e.getX();
        y = e.getY();
    }
```



Hier der Thread

```
@Override
    public void run()
    {
        Feld testfeld;
        while(true)
        {
            testfeld = gedrFeldStart();
            if (testfeld != null)
            {
                if (testfeld.belegt == true)
                {
                    gedrFeld = testfeld;
                    break;
                }
            }
        }
    }
```



Und schließlich die Funktion in der das ganze stattfinden soll. (Natürlich nur mal der Ansatz)

```
public void setzenBenutzer()
    {	
        int wuerfelKI = rand.nextInt(6) + 1;
        wuerfelKI=6; //Zum Testen
        int versucheBen = 0;
        area.append("Sie haben eine " + wuerfelKI + " gewürfelt\n");

        if (sf.startfelder.get(aktspielerindex * 4).belegt == true && sf.startfelder.get(aktspielerindex * 4 + 1).belegt == true &&
                sf.startfelder.get(aktspielerindex * 4 + 2).belegt == true && sf.startfelder.get(aktspielerindex * 4 + 3).belegt == true) //Sind alle Startfelder belegt?
        {
            if (wuerfelKI == 6)
            {
                spieler.start();
                    try
                    {
                        spieler.join();
                        
                    }
                    catch (InterruptedException ex)
                    {
                        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
                    }
                versucheBen++;
                for (int i = 0; i < 4; i++)
                {
                    if ((sf.startfelder.get(aktspielerindex * 4 + i) == gedrFeld) && (sf.startfelder.get(aktspielerindex * 4 + i).belegt == true))
                    {
                        sf.startfelder.get(aktspielerindex * 4 + i).belegt = false;
                        sf.startfelder.get(aktspielerindex * 4 + i).color = Color.YELLOW;
                        if (sf.felder.get(aktspielerindex * 10).belegt == false)
                        {
                            sf.felder.get(aktspielerindex * 10).belegt = true;
                            sf.felder.get(aktspielerindex * 10).color = spielerfarben[aktspielerindex];
                            repaint();
                        }
                    }
                }
            }
        }
    }
```




Wäre nett wenn mir jemand weiterhelfen könnte
mfg Thomas


----------



## ArtjomZab (26. Apr 2008)

Bei diesem spiel gibt es 4 startfelder, wo die spieler sozusagen ihre figuren positionieren, ja.
Und du wolltest, dass der HauptThread solange blockiert, bis alle 4 spieler drin sind?

Sind die Spieler auch Threads? Wenn ja könntest du es mal mit java.uitil.LinkedBlockedQueue versuchen.
Dein problem hat ne ähnliche Architektur wie bei der serversocket methode accept() die auf eingehende clients wartet.

Machs einfach wie folgt,
du hast ein Hauptthread Spiel.Dort hast du eine Liste, wo eingehende Spieler registriert werden. Die Klasse Spiel
hat dann auch die methode erstelleSpieler(). Wichtig ist, dass bei Spiel Referenzen der Spieler liegen.

Wenn die Spieler Thread sind(währe schon realistischer oder?), dann könnte dir das Pipelinig konzept
weiterhelfen. Zwischen den threads wird dabei eine art pipe aufgebote ,über die du dann byts hin und herschieben kannst.


----------



## tom003 (27. Apr 2008)

Die Idee mit den Threads wäre wohl die eleganteste Lösung, doch das wird leider mit der Zeit etwas knapp, da es das Programm wieder etwas komplizierter macht und ich nicht mehr allzu viel Zeit habe  :? 

Ich hab mir das so vorgestellt: Ich habe einen "OK" Button. Wird der geklickt, wird die ActionPerformed() Methode aufgerufen. Diese ruft die Methode SetzeKI() auf. Hat der PC seine Figur gesetzt, wird am Ende die Methode SetzeBenutzer() bzw wieder die Methode SetzeKI() aufgerufen. Je nachdem wer als nächstes dran ist. (Die Spieler werden in einer Liste gespeichert)

Nur habe ich nun das Problem, dass ich an einer bestimmten Stelle so lange warten möchte, bis der Benutzer eine gültige Startfigur ausgewählt hat (Gültigkeit wird mit der Methode gedrFeldStart() überprüft).
Das ganze sollte möglichst einfach gehalten werden. Also auch am besten ohne Threads, da ich mit denen auch noch nicht so vertraut bin   
Gibt es vl irgend eine simple Methode, das Programm an einer bestimmten Stelle zu unterbrechen und erst dann weiter zu machen, wenn der Benutzer eine Figur ausgewählt hat?


----------



## Marco13 (28. Apr 2008)

Ganz grob: Mit wait/notify - aber ohne Threads wird man nicht auskommen - zumindest der EDT läuft ja zum Glück...

```
class Spiel
{
    boolean started = false;

    void spiel()
    { 
        synchronized(this)
        {
            while (!started)
            {
                System.out.println("Warte...");
                wait(); // (Exception abfangen...)
            }
        }
        System.out.println("Los geht's");
    }

    public void starte()
    {
        synchronized(this)
        {
             started = true;
             notifyAll();
        }
    }

}


class GUI
{
    Spiel spiel = ...;

    public void mouseClicked(MouseEvent e)
    {
        spiel.starte();
    }
}
```


----------



## tom003 (28. Apr 2008)

vielen dank, nun funktioniert es.
Nun sind bei mir also die Spieler auch Threads


----------

