Java Swing: поток для отправки событий против секундомера - PullRequest
1 голос
/ 19 марта 2011

У меня есть Java-программа с графическим интерфейсом на основе Swing.В основном классе есть несколько вычислений, которые сгруппированы в отдельный поток.Моя проблема: мне нужно запустить секундомер, когда эти вычисления начнутся, показать таймер, пока они продолжат работу, остановиться, когда они закончат.Если бы мне нужно было только подсчитать оставшееся время, я бы запустил секундомер в отдельном потоке, сделал все вычисления в главном потоке, а когда они закончили, остановил поток секундомера и отобразил таймер.Как я знаю, Java-свинг однопоточный.Так что я могу перекрасить цифры секундомера в основной качели

Ответы [ 4 ]

3 голосов
/ 19 марта 2011

Самое простое, что можно сделать, это использовать javax.swing.Timer.Таймер легко отправляет события периодического обновления для обновления графического интерфейса, а также легко останавливать или сбрасывать таймер по мере необходимости.

1 голос
/ 22 марта 2011

Прежде всего, я хочу сказать спасибо всем.

Проблема была решена нами в SwingWorker таким образом: главное окно Swing, которое я разработал, будучи ребенком SwingWorker .Все вычисления были в методе doInBackground .В то время как они продолжали, таймер (который находится в отдельном потоке) был вызван в SwingUtilities.invokeLater.В методе done , когда все вычисления завершены, таймер останавливается.

1 голос
/ 20 марта 2011

Я читал, что SwingWorker, кажется, то, что мне нужно.

Я поддержу предложение javax.swing.Timer @Ernest Friedman-Hill, но это SwingWorker пример заслуживает изучения.Это может помочь вам использовать существующий код потока.

0 голосов
/ 20 марта 2011

Таймер Swing более или менее выполнит свою работу, но он может быть несколько неточным. На самом деле, неточность может быть заметна. Например, если вы сделаете свой таймер с помощью Swing Timer, а затем будете наблюдать за числами, которые они показывают, вы можете заметить, что это не всегда точно секунда между тиками. Другими словами, разрешение таймера не так уж велико.

Альтернативой таймеру качания является System.nanoTime(). Я всегда использую это. У него гораздо лучшее разрешение. Возвращает текущее системное время в нано секундах как длинное.

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

long previousTime = 0L;
int seconds = 0;
while(true)
{
    long currTime = System.nanoTime();

    if((currTime - previousTime) / 1000000000L >= 1L)
    {
        previousTime = currTime;
        seconds++;
        System.out.println("Seconds: " seconds)
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...