Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich hab vor einen Thread zu blocken bis ein bestimmtes Ereignis eintritt. z.b. bis auf eine bestimmte Stelle in einem JFrame geklickt wurde.
Wie könnte ich sowas machen? Bzw. gibts da fertige Methode zum Blocken?
Nachtrag:
Einzige Möglichkeit die mir einfällt: EIne Schleife die solange läuft bis eine Variable umgestellt wird beim Ereignis.
Gibts da aber was professionelleres?
Es gibt Object.wait() und Object.notifyAll().
Vergiss das aber lieber und sieh Dir das Concurrency-Framework (ab Java 5) an: java.util.concurrent.*
Ein java.util.concurrent.locks.Lock könnte Dir eventuell helfen.
was ich will ist sowas, wie wenn man nen modalen Dialog aufruft. Das halt gewartet wird, bis was passiert. Beim Dialog halt bis er geschlossen ist. Bei mir hät ich gern nen Mausklick.
Du hast irgendwo einen laufenden Thread, der auf ein Ereignis aus einem nicht-modalen Dialog bzw. JFrame reagieren soll. Hab ich das so richtig verstanden?
Man könnte das z.B. so lösen:
Code:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
import javax.swing.JButton;
import javax.swing.JFrame;
public class Demo {
private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();
class Worker implements Runnable {
public void run() {
while (true) {
try {
lock.lock();
condition.await();
Demo.this.doIt();
}
catch(InterruptedException x) {
x.printStackTrace();
}
finally {
lock.unlock();
}
}
}
}
protected void doIt() {
System.out.println("Piep");
}
public void demo() {
JFrame frame = new JFrame();
JButton button = new JButton("Piep");
button.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e) {
try {
lock.lock();
condition.signal();
}
finally {
lock.unlock();
}
}});
frame.getContentPane().add(button);
frame.pack();
frame.setVisible(true);
Thread worker = new Thread(new Worker());
worker.start();
}
public static void main(String[] args) {
new Demo().demo();
}
}
Lock war nur die halbe Wahrheit. Man braucht noch eine Condition, die mit dem Lock verbunden ist. Über diese Condition können die Thread sozusagen kommunizieren: Der Arbeiter-Thread wartet (await()) solange, bis die Bedingung erfüllt ist, was im ActionListener durch signal() signalisiert wird.