Ожидание вызова invokeLater () - PullRequest
1 голос
/ 10 мая 2010

Есть ли более элегантный способ сделать то, что я делаю ниже? То есть есть ли более элегантный способ, чем опрос и сон, опрос и сон и т. Д., Чтобы узнать, когда метод 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 ]

5 голосов
/ 10 мая 2010

Лучшим способом было бы использовать FutureTask (который реализует Runnable и Future) и переопределить его событие done (), чтобы сделать что-то после завершения.

Кроме того, запустите его как отдельный поток (или используйте Executor), если он не выполняет манипуляции с графическим интерфейсом, а не использует AWT EventQueue.

3 голосов
/ 10 мая 2010

Если вы хотите подождать, почему бы не позвонить invokeAndWait , а не реализовать это самостоятельно?

0 голосов
/ 10 мая 2010

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

...