Java - Как я могу приостановить код, не останавливая анимацию GIF в моем графическом интерфейсе? - PullRequest
3 голосов
/ 29 марта 2019

В настоящее время у меня есть стартовое меню для игры с кнопкой, которая после нажатия кнопки преобразует фоновое изображение моего меню из PNG в GIF.Теперь я хочу, чтобы мой код ожидал окончания анимации GIF.После этого он должен продолжаться в обычном режиме (открывая новый JFrame с реальной игрой).

Я прочитал кое-что о таймере свинга, хотя я не уверен, как это реализовать, поскольку яJava начинающий.

private ImageIcon a = new ImageIcon("a.png");
private ImageIcon b = new ImageIcon("b.gif");

class AddInterestListener implements ActionListener {
    public void actionPerformed(ActionEvent event) {
        bgLabel.setIcon(b); //replace PNG with GIF

        //This here is where I want my delay to happen without freezing the GUI 

        JFrame game = new JFrame(); //Actual game frame starting etc.
    }
}

Есть предложения?

Ответы [ 2 ]

1 голос
/ 29 марта 2019

Вы не можете использовать методы блокировки, такие как Thread.sleep() или Thread.join() в Swing EDT .Это замораживает пользовательский интерфейс, поскольку Swing EDT обрабатывает все события обновления пользовательского интерфейса.

Вы должны реализовать это с событиями, первое событие блокирует пользовательский интерфейс, второе разблокирует его.Если вы знаете длину анимации GIF, вы можете использовать SwingUtils.invokeLater() для запуска асинхронного потока, который запустит событие после фиксированной задержки.

0 голосов
/ 29 марта 2019

[Изменить] Очевидно, что уже был ответ, и я не знаю, подходит ли этот ответ, или мой ответ по этому вопросу, в вашем программном обеспечении.Одно могу сказать точно, что мой метод позволяет вам использовать собственные алгоритмы масштабирования и т. Д. Вместо встроенных (но вам, вероятно, это тоже не нужно).


Afaik это такневозможно отслеживать прогресс GIF, отображаемого с помощью SWING.Вам придется создать свой собственный GIF-декодер / аниматор, чтобы вы могли «определить», когда GIF собирается зацикливаться или заканчиваться (да, анимированные GIF-файлы могут заканчиваться).

Для этого я использовал стороннюю программузагрузчик от https://github.com/DhyanB/Open-Imaging для получения отдельных кадров и информации о времени.Нет никаких гарантий, что это лучшая библиотека, как я обнаружил чуть более года назад.

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

...