And*_*son 9 java swing background image animated-gif
动画(循环)GIF可以用JLabelHTML格式显示(在格式化的文本组件中JEditorPane),并且可以循环显示.
但是要加载图像作为容器的背景,我通常会使用ImageIO.read()或者Toolkit.getImage()(后者在我感觉上一个千年怀旧时).加载图像的方法都不会导致循环图像,它通常只是第一帧.
如何为背景加载动画图像?
And*_*son 15
要获得自定义绘画的循环(动画)GIF,一个技巧是使用一个加载它ImageIcon.虽然从问题中列出的两种方法中的任何一种返回的图像是静态的,但是从a获得的图像ImageIcon是动画的.
下面的代码将添加50个按钮,然后在"缩放星星"的帧之后很快将GIF 1动画为BG.在ImagePanel将图像回复到面板的尺寸.

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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
ksc*_*eid 12
使用ImageIcon可能是最直接的事情.要记住以下几点:
ImageIcon(URL)本身利用Toolkit.getImage(URL).您可能更喜欢使用Toolkit.createImage(URL)- getImage()可能使用缓存或共享的图像数据.
ImageIcon利用a MediaTracker来有效地等待图像完全加载.
所以,你的问题可能不是Toolkit(ImageIO是一个不同的野兽)的使用,而是你没有渲染满载图像的事实.一个有趣的尝试是:
Image image = f.getToolkit().createImage(url);
//...
ImagePanel imagePanel = new ImagePanel(image);
imagePanel.prepareImage(image, imagePanel);
//...
Run Code Online (Sandbox Code Playgroud)
我的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);
}
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13743 次 |
| 最近记录: |