Как использовать задержку в свинг-приложении - PullRequest
2 голосов
/ 05 мая 2010

Я создаю свинг-приложение. В какой-то момент мне нужно запустить «анимацию»:

...
jpanel1.setBackground(Color.Black);

Delay(milli)   

jpanel1.setBackground(Color.White);
...

и т. Д.

Сам графический интерфейс и вся логика, лежащая в его основе, работают. Только в этот раз изменение цвета зависит от того, чего нет. Я читал, что Swing не является потокобезопасным, но все примеры, которые я нашел, показали мне, как запустить другой поток (например, в фоновом режиме), но никогда, как остановить текущий поток Swing-GUI.

Edit:

Приложение должно работать следующим образом:

  1. файлы конфигурации читаются, jframe настроен.
  2. задаются некоторые простые вопросы
  3. открывается диалог, объясняющий анимацию.
  4. после того, как пользователь нажал «ок», анимация - мигание некоторых цветов - запускается. цвет и задержка между сменой цвета зависят от конфигурации
  5. открывается другой диалог, и программа продолжается -> новая jpanel внутри jframe, кнопки и т. Д.

онлайн, которая не работает, это задержки между сменой цвета. Теперь я понимаю, почему это не работает, и я пытаюсь создать таймер, который активирует список действий, который затем меняет цвет и останавливает таймер ... просто кажется, что так много работы для простой задержки ... и у меня есть реорганизовать всю анимацию в приложении.

Ответы [ 4 ]

1 голос
/ 06 мая 2010

Взгляните на: https://timingframework.dev.java.net/

и образцы, которые входят в http://filthyrichclients.org/

Они предоставляют очень полезную информацию о том, как работает анимация и как используется механизм Timer Вы будете хорошо понимать, как это работает.

Я сделал пример анимации с Swing после прочтения:

Демо-приложение обратного отсчета http://img580.imageshack.us/img580/742/capturadepantalla201004wd.png Java-приложение со страницей blog.stackoverflow.com (нажмите на изображение, чтобы посмотреть демонстрационное видео)

Но я даже не уверен, чего ты хочешь достичь.

EDIT

Я читал о структуре синхронизации, чтобы лучше понять, о чем идет речь, но на самом деле я ее не использовал (полезно создавать анимации без линейного времени - то есть не каждую секунду, как у меня, но такие вещи, как 1, 5 , 3, 2 секунды)

Код, который я использую в приведенной выше демонстрации: точно это:

final Timer imageTimer = new Timer();
imageTimer.schedule( new TimerTask() {
    public void run() {
        changeImage();
    }
}, 0, 10000 ); //<-- every 10 seconds. 

Анимация для «переполнения стека» и обратного отсчета использует аналогичный подход.

1 голос
/ 06 мая 2010

Вы захотите использовать класс javax.swing.Timer, а не класс java.util.Timer. Последнее предпочтительнее, когда вам нужно общее время, первое предпочтительнее для обновления / изменения пользовательского интерфейса.

См. http://java.sun.com/docs/books/tutorial/uiswing/misc/timer.html

Вы также можете посмотреть на https://timingframework.dev.java.net/.

1 голос
/ 05 мая 2010

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

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

Сделайте таймер на другом потоке, и когда таймер сработает, он может отправить сообщение об обновлении для анимации, чтобы нарисовать следующий кадр.

Еще одним соображением является сама задержка. Не выбирайте фиксированный интервал задержки. Раньше старые игры делали это, и они стали неиграбельными на более быстрых компьютерах. Вместо этого новые игры используют скорость текущего процессора, чтобы выяснить, сколько событий обновления им требуется секунда во время выполнения, называют это «фактором задержки» и устанавливают при запуске программы. , Таймер использует коэффициент задержки, поэтому анимация отображается правильно даже на машинах с разной тактовой частотой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...