Показать анимированный BG в Swing

Анимированный (циклический) GIF может отображаться в JLabel или в HTML (в форматированных текстовых компонентах, таких как JEditorPane ), и их можно увидеть в цикле.

Но для загрузки изображения для рисования в качестве фона контейнера я обычно использовал либо ImageIO.read() либо Toolkit.getImage() (последний, когда я чувствую ностальгию в течение последнего тысячелетия). Ни один из способов загрузки изображения не приводит к циклическому изображению, он обычно является только первым кадром.

Как загрузить анимированное изображение для фона?

Использование ImageIcon – это, наверное, самая простая вещь. Несколько вещей, о которых нужно помнить:

  • ImageIcon(URL) использует Toolkit.getImage(URL) . Вместо этого вы можете использовать Toolkit.createImage(URL)getImage() может использовать данные кэшированного или общего изображения.

  • ImageIcon использует MediaTracker для эффективного ожидания до полного загрузки изображения.

Таким образом, ваша проблема может быть не в использовании Toolkit ( ImageIO – другой зверь), а скорее в том, что вы не показываете полностью загруженное изображение. Один интересный вопрос:

 Image image = f.getToolkit().createImage(url); //... ImagePanel imagePanel = new ImagePanel(image); imagePanel.prepareImage(image, imagePanel); //... 

Мой Swing / AWT / J2D может быть немного нечетким, но идея в том, что, поскольку ваш ImagePanel является ImageObserver , он может быть уведомлен асинхронно об информации об изображении. Метод Component.imageUpdate() должен ссылаться на repaint мере необходимости.

Редактировать:

Как отмечается в комментариях, призыв prepareImage не требуется – рабочий пример приведен ниже. Ключ заключается в том, что переопределенный метод paintComponent вызывает Graphics.drawImage , который обеспечивает ImageObserver . Метод imageUpdate (реализованный в java.awt.Component ) будет постоянно вызываться с установленным ImageObserver.FRAMEBITS .

 import java.awt.EventQueue; import java.awt.Graphics; import java.awt.GridLayout; import java.awt.Image; import java.awt.image.ImageObserver; import java.net.MalformedURLException; import java.net.URL; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class ImagePanel extends JPanel { private final Image image; public ImagePanel(Image image) { super(); this.image = image; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(this.image, 0, 0, getWidth(), getHeight(), this); } public static void main(String[] args) throws MalformedURLException { final URL url = new URL("http://pscode.org/media/starzoom-thumb.gif"); EventQueue.invokeLater(new Runnable() { @Override public void run() { JFrame f = new JFrame("Image"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLocationByPlatform(true); Image image = f.getToolkit().createImage(url); ImagePanel imagePanel = new ImagePanel(image); imagePanel.setLayout(new GridLayout(5, 10, 10, 10)); imagePanel.setBorder(new EmptyBorder(20, 20, 20, 20)); for (int ii = 1; ii < 51; ii++) { imagePanel.add(new JButton("" + ii)); } f.setContentPane(imagePanel); f.pack(); f.setVisible(true); } }); } } 

Чтобы получить циклический (анимированный) GIF для пользовательской росписи, один трюк – загрузить его с помощью ImageIcon . Хотя изображение, возвращенное из одного из двух методов, перечисленных в вопросе, является статичным, одно из изображений, ImageIcon получается из ImageIcon , анимируется.

В приведенном ниже коде будет добавлено 50 кнопок, затем вскоре после того, как кадры «масштабирования звезд» ожидают GIF 1 как BG для них. ImagePanel растянет изображение до размера панели.

  1. Он основан на этом изображении.

Масштабирование звезд GIF

 import java.awt.*; import javax.swing.*; import javax.swing.border.EmptyBorder; import java.net.URL; class ImagePanel extends JPanel { private Image image; ImagePanel(Image image) { this.image = image; } @Override public void paintComponent(Graphics g) { super.paintComponent(g); g.drawImage(image,0,0,getWidth(),getHeight(),this); } public static void main(String[] args) throws Exception { URL url = new URL("http://i.stack.imgur.com/iQFxo.gif"); final Image image = new ImageIcon(url).getImage(); SwingUtilities.invokeLater(new Runnable() { public void run() { JFrame f = new JFrame("Image"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLocationByPlatform(true); ImagePanel imagePanel = new ImagePanel(image); imagePanel.setLayout(new GridLayout(5,10,10,10)); imagePanel.setBorder(new EmptyBorder(20,20,20,20)); for (int ii=1; ii<51; ii++) { imagePanel.add(new JButton("" + ii)); } f.setContentPane(imagePanel); f.pack(); f.setVisible(true); } }); } } 

Мне удалось получить анимированный gif внутри моего JPanel таким образом:

 private JPanel loadingPanel() { JPanel panel = new JPanel(); BoxLayout layoutMgr = new BoxLayout(panel, BoxLayout.PAGE_AXIS); panel.setLayout(layoutMgr); ClassLoader cldr = this.getClass().getClassLoader(); java.net.URL imageURL = cldr.getResource("img/spinner.gif"); ImageIcon imageIcon = new ImageIcon(imageURL); JLabel iconLabel = new JLabel(); iconLabel.setIcon(imageIcon); imageIcon.setImageObserver(iconLabel); JLabel label = new JLabel("Loading..."); panel.add(iconLabel); panel.add(label); return panel; } 

Некоторые моменты такого подхода:
1. Файл изображения находится в банке;
2. ImageIO.read () возвращает BufferedImage, который не обновляет ImageObserver;
3. Еще одна альтернатива для поиска изображений, входящих в файл jar, – попросить загрузчика classа Java, код, загружающий вашу программу, для получения файлов. Он знает, где вещи.

Таким образом, сделав это, я смог получить мой анимированный gif внутри моей JPanel, и это сработало как шарм.

  • java.awt.EventQueue.invokeLater объяснен
  • Как работает paintComponent?
  • Как «Открыть» и «Сохранить» с помощью java
  • Изменение значков узла JTree в соответствии с уровнем глубины
  • Java JTextField с подсказкой ввода
  • Java: mouseDragged и перемещение в графическом интерфейсе
  • Как изменить цвет JButton на нажатой мыши?
  • Как установить цвет для определенной строки, если определенные условия выполняются с помощью java?
  • Java swing GUI зависает
  • Список свойств интерфейса Java Swing?
  • Обновление JLabel каждые X секунд из ArrayList - Java
  • Interesting Posts

    Как предотвратить использование автозапуска с помощью Git?

    Entity Framework – создание classов

    Как избавиться от сообщения «Обновления доступны» в Windows 10?

    Как написать тесты junit для интерфейсов?

    Что такое Big-O вложенного цикла, где число итераций во внутреннем цикле определяется текущей итерацией внешнего цикла?

    Построение трехмерного участка поверхности с наложением карты контура, используя R

    Безстоящие и Stateful Enterprise Java Beans

    Сообщите Thunderbird об усечении или обертке строк при отправке электронной почты.

    Как развернуть Java-апплет для современных браузеров (апплет, встраивание, объект)?

    64-разрядная Dell застряла на экране входа / заставки

    Android: подсказка Spinner

    Заявление о выпуске Fallout … можно ли это разрешить?

    Статический общий class как словарь

    Лучший способ включить Volley (или другую библиотеку) в проект Android Studio

    Просмотр Android-видео в полноэкранном режиме

    Давайте будем гением компьютера.