Ожидание вызова 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.

Вместо того, чтобы ждать завершения потока, почему бы просто не отобразить спиннер или что-то еще в пользовательском интерфейсе, а поток вызвать событие, когда это будет сделано.

Другие вопросы по тегам