У меня есть изображение в формате GIF, отображаемое на панели JPanel в бесконечном цикле. Теперь мне нужно остановить анимацию после случайного количества кадров. Фактически, я генерирую случайное число, которое может быть 0 или 1. Скажем, гифка состоит из 6 кадров. Если число равно 0, я хочу остановиться на 3-м кадре, если оно равно 1, анимация должна остановиться на 6-м кадре.
Чтобы понять это, я попытался использовать таймер Swing Timer, который запускает события именно тогда, когда приходит следующий кадр. Поэтому, если кадры имеют задержку 50 мс, я создаю таймер как
new Timer(50, this);
К сожалению, похоже, что это не работает, на самом деле анимация кажется медленнее, чем таймер. (Я предполагаю, что это как-то связано с временем загрузки.) В любом случае, я добавил код, иллюстрирующий подход к проблеме и (еже) решению.
import java.awt.event.*;
import javax.swing.*;
public class GifTest extends JPanel implements ActionListener{
ImageIcon gif = new ImageIcon(GifTest.class.getResource("testgif.gif"));
JLabel label = new JLabel(gif);
Timer timer = new Timer(50, this);
int ctr;
public GifTest() {
add(label);
timer.setInitialDelay(0);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
ctr++;
if (ctr == 13){
timer.stop();
try {
Thread.sleep(1000);
} catch (InterruptedException i) {
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Gif Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new GifTest());
frame.setSize(150,150);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Для giftest.gif это простые 6 слоев с номерами от 1 до 6, сохраненные с задержкой 50 мс.
Буду благодарен за любую помощь.
Ps: Если окажется, что нет элегантного способа сделать это, также будет достаточно получить отображаемый в данный момент фрейм. Таким образом, я мог бы попросить об этом и остановиться, когда наступит 3-й (соответственно 6-й) фрейм. Однако из-за контекста задачи я бы предпочел модифицированную версию своего решения.
Timer
только гарантирует, что он будет вызван по крайней мере по истечении указанного времени - person MadProgrammer   schedule 07.12.2015Timer
, таким образом у вас есть абсолютный контроль - person MadProgrammer   schedule 08.12.2015