Ожидание вызова invokeLater()
Есть ли более элегантный способ сделать то, что я делаю ниже? То есть есть ли более элегантный способ, чем опрос и сон, опрос и сон и т. Д., Чтобы узнать, когда Runnable.run()
метод был вызван через invokeLater()
?
private int myMethod() {
final WaitForEventQueue waitForQueue = new WaitForEventQueue();
EventQueue.invokeLater(waitForQueue);
while (!waitForQueue.done) {
try {
Thread.sleep(10);
} catch (InterruptedException ignore) {
}
}
return 0;
}
private class WaitForEventQueue implements Runnable {
private boolean done;
public void run() {
// Let all Swing text stuff finish.
done = true;
}
}
3 ответа
Если вы хотите подождать, почему бы не вызвать invokeAndWait, а не реализовать это самостоятельно?
Лучшим способом было бы использовать FutureTask
(который реализует Runnable и Future) и переопределяет событие done(), чтобы сделать что-то, когда закончите.
Кроме того, начните это как отдельный поток (или используйте Executor
) если он не выполняет манипуляции с графическим интерфейсом, а не использует AWT EventQueue.
Вместо того, чтобы ждать завершения потока, почему бы просто не отобразить спиннер или что-то еще в пользовательском интерфейсе, а поток вызвать событие, когда это будет сделано.