У меня есть изображениеIcon как Button, теперь я бы хотел оживить его при опрокидывании. Я попытался использовать анимированный gif (без цикла) на setRolloverIcon (значок). Но когда я снова наводил кнопку на кнопку, gif снова не воспроизводится. Когда я использую looped gif, он воспроизводит его из случайного кадра. Я попытался использовать paintComponent, чтобы нарисовать Shape или изображение как Button, которое отлично работает, но даже когда я использую setPreferredSize() или setSize() или setMaximumSize(), Button использует свой размер по умолчанию, как вы можете видеть на картинке (средняя кнопка). Я использую GroupLayout, может быть, это проблема?Анимированное изображениеIcon as Button
ответ
Кажется, работает очень хорошо для меня ...
Я использовал следующие значки ... (PNG и GIF) ...
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
...
, пожалуйста, вы можете проверить мой код, потому что он не работает, ваш или мой тоже – mKorbel
@mKorbel Вместо использования 'button.setIcon (null)', вы можете попробовать использовать 'icon.getImage(). Flush()', что заставит JVM перезагрузить значок и снова начнет воспроизводить его ... – MadProgrammer
не я попробовал flush(), попытался переопределить BasicButtonUI, поскольку MetalLaF не будет работать, что-то не хватает некоторых уведомлений – mKorbel
10 анимированный gif не будет работать. Вам нужно использовать несколько изображений в качестве фрейма. – Ashwani
Я думал, что это нужно, как спрайт. Ну, я попробовал это, но кнопка использует еще свой размер по умолчанию, как показано на изображении. – domizai