2013-08-16 3 views
4

У меня есть изображениеIcon как Button, теперь я бы хотел оживить его при опрокидывании. Я попытался использовать анимированный gif (без цикла) на setRolloverIcon (значок). Но когда я снова наводил кнопку на кнопку, gif снова не воспроизводится. Когда я использую looped gif, он воспроизводит его из случайного кадра. Я попытался использовать paintComponent, чтобы нарисовать Shape или изображение как Button, которое отлично работает, но даже когда я использую setPreferredSize() или setSize() или setMaximumSize(), Button использует свой размер по умолчанию, как вы можете видеть на картинке (средняя кнопка). Я использую GroupLayout, может быть, это проблема?Анимированное изображениеIcon as Button

enter image description here

+0

10 анимированный gif не будет работать. Вам нужно использовать несколько изображений в качестве фрейма. – Ashwani

+0

Я думал, что это нужно, как спрайт. Ну, я попробовал это, но кнопка использует еще свой размер по умолчанию, как показано на изображении. – domizai

ответ

5

Кажется, работает очень хорошо для меня ...

enter image description hereenter image description here

Я использовал следующие значки ... (PNG и GIF) ...

enter image description hereenter image description here

import java.awt.BorderLayout; 
import java.awt.EventQueue; 
import java.awt.GridBagLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.UIManager; 
import javax.swing.UnsupportedLookAndFeelException; 

public class AnimatedButton { 

    public static void main(String[] args) { 
     new AnimatedButton(); 
    } 

    public AnimatedButton() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException ex) { 
       } catch (InstantiationException ex) { 
       } catch (IllegalAccessException ex) { 
       } catch (UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Test"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new TestPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class TestPane extends JPanel { 

     private ImageIcon animatedGif; 

     public TestPane() { 
      setLayout(new GridBagLayout()); 
      JButton btn = new JButton(new ImageIcon("WildPony.png")); 
      btn.setRolloverEnabled(true); 
      animatedGif = new ImageIcon("ajax-loader.gif"); 
      btn.setRolloverIcon(animatedGif); 
      add(btn); 

      btn.addMouseListener(new MouseAdapter() { 

       @Override 
       public void mouseEntered(MouseEvent e) { 
        animatedGif.getImage().flush(); 
       } 

      }); 
     }  
    } 
} 

Я только что понял, что вы используете не-looping gif. Это означает, что вы собираетесь играть с ней, чтобы попытаться «перезагрузить», чтобы снова начать играть.

Попробуйте использовать что-то наподобие icon.getImage().flush();, где icon является вашим ImageIcon. Вам нужно будет присоединить MouseListener к кнопке, чтобы обнаружить событие mouseEnter и сбросить ImageIcon ...

+0

, пожалуйста, вы можете проверить мой код, потому что он не работает, ваш или мой тоже – mKorbel

+0

@mKorbel Вместо использования 'button.setIcon (null)', вы можете попробовать использовать 'icon.getImage(). Flush()', что заставит JVM перезагрузить значок и снова начнет воспроизводить его ... – MadProgrammer

+0

не я попробовал flush(), попытался переопределить BasicButtonUI, поскольку MetalLaF не будет работать, что-то не хватает некоторых уведомлений – mKorbel

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