2013-04-16 3 views
4

Скажем, у меня есть JFrame и JButton. Я хочу отобразить анимированное изображение (.gif), как только я нажму кнопку. В то время как другое событие (например, ActionEvent e) останавливает отображение анимации в JFrame. Какой должен быть мой подход?Изображение анимация в java swing при нажатии

+0

@EranMedan: Я думаю, что он хочет «запустить» и «остановить» анимацию, а не просто ее отобразить. –

+0

Я думаю, что я не пытаюсь просто отобразить изображение или проблему с кадрами, поэтому эти предложения не помогают. – se7en

+0

* «Я хочу отображать анимированное изображение (' .gif »), как только я нажимаю кнопку.» * GIF - это единственный формат, поддерживающий анимацию. Поэтому «предпочтительно» просто смущает людей. Я предполагаю, что важным битом является «анимация». Пожалуйста, подтвердите и отредактируйте свой вопрос, чтобы он стал более понятным. –

ответ

8

Отображение 1-го изображения (анимационная рамка) в JLabel. Когда пользователь нажимает кнопку, запустите Swing Timer, который меняет значок метки на следующий кадр (ы), зацикливая, как только он показывает все кадры. Когда пользователь снова нажмет кнопку, остановите анимацию.

import java.awt.*; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.net.URL; 
import javax.imageio.ImageIO; 
import javax.swing.*; 

class Chomper { 

    public static void main(String[] args) throws Exception { 
     final Image[] frames = { 
      ImageIO.read(new URL("http://i.stack.imgur.com/XUmOD.png")), 
      ImageIO.read(new URL("http://i.stack.imgur.com/zKyiD.png")), 
      ImageIO.read(new URL("http://i.stack.imgur.com/4maMm.png")), 
      ImageIO.read(new URL("http://i.stack.imgur.com/wn9V5.png")) 
     }; 
     Runnable r = new Runnable() { 

      @Override 
      public void run() { 
       JPanel gui = new JPanel(new BorderLayout()); 

       final JLabel animation = new JLabel(new ImageIcon(frames[0])); 
       gui.add(animation, BorderLayout.CENTER); 

       ActionListener animate = new ActionListener() { 

        private int index = 0; 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         if (index<frames.length-1) { 
          index++; 
         } else { 
          index = 0; 
         } 
         animation.setIcon(new ImageIcon(frames[index])); 
        } 
       }; 
       final Timer timer = new Timer(200,animate); 

       final JToggleButton b = new JToggleButton("Start/Stop"); 
       ActionListener startStop = new ActionListener() { 

        @Override 
        public void actionPerformed(ActionEvent e) { 
         if (b.isSelected()) { 
          timer.start(); 
         } else { 
          timer.stop(); 
         } 
        } 
       }; 
       b.addActionListener(startStop); 
       gui.add(b, BorderLayout.PAGE_END); 

       JOptionPane.showMessageDialog(null, gui); 
      } 
     }; 
     // Swing GUIs should be created and updated on the EDT 
     // http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html 
     SwingUtilities.invokeLater(r); 
    } 
} 
+0

Это означает, что остановить таймер на следующем событии? – se7en

+0

Как вы получаете доступ к отдельным кадрам/изображениям из gif? – camickr

+0

Источник изображений показан в [этом ответе] (http://stackoverflow.com/a/14437899/418556). –

3

Я не знаю, как получить кадр/изображения с GIF, но если у вас есть доступ к ним, то вы можете использовать Animated Icon класс, чтобы сделать анимацию для вас. Он использует таймер за кулисами, чтобы сделать анимацию, чтобы вы могли просто запустить/остановить/приостановить таймер по своему усмотрению.

Смежные вопросы