Frage zu Threads ( notify() wait() )

Q-Dog

Mitglied
Hallo,

ich habe folgendes Problem: ich habe zwei Klassen A und B. In der Klasse A wird ein Objekt von B erzeugt. Die Klasse B erbt vom JFrame.
Ich möchte nun, dass in Klasse A solange gewartet wird, bis auf dem Frame ein Button angeklickt wird, und dann ausgehend von diesem Event (Buttonclick) sich etwas in Klasse A etwas ändern.

Zur Verdeutlichung:

Java:
public class A {

  public static void main(String[] args) {
    B b = new B();

    // warte so lange, bis der Button gedrückt wurde
    // wenn der Button gedrückt wurde
    System.out.println("button gedrückt");
  }


}

Java:
public class B extends JFrame implements ActionListener {

  JButton button = new JButton("klick");

  public B {
    button.addActionListener(this);
    button.setActionCommand("klick");
    this.add(button);
  }

  public void actionPerformed(ActionEvent e) {
    if (e.getActionCommand().equals("klick")) {
      // mache irgendwas, damit Klasse A weiß, dass der Button gedrückt wurde
    }
  }

}

Mein Problem ist nun, wie ich die Kommentare mit Java-Code ersetzen muss, so dass dies klappt. Ich habe im Vorfeld schon ein wenig gegoogelt und herausgefunden, dass dies wunderbar mit Threads und wait() / notify() gehen soll.
Jedoch weiß ich nciht, wie ich das implementieren soll.


Liebe Grüße,
Q-Dog
 
Java:
public class Test {
    public static void main(String[] args)   throws Exception
    {
        B b = new B();
        synchronized (b)  {
            b.wait();
        }
        System.out.println("button gedrückt");
    }
}
class B   extends JFrame  implements ActionListener {
    JButton button = new JButton("klick");

    public B()  {
        button.addActionListener(this);
        button.setActionCommand("klick");
        this.add(button);
        setSize(100, 100);
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e)  {
        if (e.getActionCommand().equals("klick"))  {
            synchronized (this)    {
                this.notify();
            }
        }
    }
}
 
boah super, vielen Dank für die schnelle Antwort 🙂

Ich werds gleich mal ausprobieren und dann versuchen nachzuvollziehen. Melde mich dann nochmal


/Edit
Funktioniert einwandfrei, und 100% das was ich gesucht habe.
Ich bedanke mich nochmals für die schnelle und super kompetente Hilfe.
 
Zuletzt bearbeitet:
Hallo,

ich bins doch noch mal und zwar habe ich basierend auf der obigen Frage ein neues Problem und zwar, wenn ich in der main-methode ein Objekt der GUI erzeuge und dann guiObjekt.wait() aufrufe, werden die GUI-Komponenten nicht angezeigt, sondern nur der Fensterrahmen, da gewartet wird.

Dies ist in dem obigen, einfachen Beispiel zwar nicht der Fall, passiert aber, wenn die ganze Sache etwas komplexer wird.

Auch hier habe ich etwas gegoogelt und herausgefunden, dass ich die GUI wohl in einem eigenen Thread erstellen muss, was bisher allerdings noch nicht so ganz geklappt hat
 
Java:
final JFrame f = ..;

SwingUtilities.invokeLater(new Runnable() {
public void run() {

evtl. f weiter initialisieren();
f.setVisible(true);


}
});


irgendwas mit f machen
 
erneut, vielen Dank, werd gleich mal ausprobieren und melde mich dann nochmal 🙂

//Edit
Und erneut klappt dies ausgezeichnet, echt mal ein Kompliment an das Forum und insbesondere SlaterB :toll:
 
Zuletzt bearbeitet:

Zurück
Oben