我有一个JFrame。因为我有两个容器,即两个JPanel。一个小组持有一张图片。另一个持有JButton。然后将这两个添加到JTabbedPane。
我的问题是使用.gif图像,图像变得像任何其他正常的.jpg图像一样静止。任何人都可以帮助我一些更多的想法吗?
这是我的代码:
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.GridBagLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.URL;
import java.net.UnknownHostException;
import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDesktopPane;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTabbedPane;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.UIManager.LookAndFeelInfo;
public class ICLOUD implements ActionListener {
private BufferedImage bg;
JButton b1;
private Object frame1;
JFrame frame2 = new JFrame();
JDesktopPane desktop = new JDesktopPane();
public ICLOUD() {
try {
URL url = this.getClass().getResource("anigif.gif");
bg = ImageIO.read(url);
} catch (IOException ex) {
}
JPanel tabPanel = new JPanel(new GridBagLayout()) {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(bg, 0, 0, getWidth(), getHeight(), this);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(400, 300);
}
};
JPanel buttons = new JPanel(new GridLayout(4, 1, 15, 15));
buttons.setOpaque(false);
ImageIcon icon5 = new ImageIcon(ICLOUD.class.getResource("hi.jpg"));
b1=new JButton("Hello");
buttons.add(b1);
tabPanel.add(buttons);
JTabbedPane tabPane = new JTabbedPane();
tabPane.addTab(null,icon5, tabPanel);
JFrame frame = new JFrame("I-CLOUD");
b1.setVisible(true);
frame.setContentPane(tabPane);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
try {
for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
if ("Nimbus".equals(info.getName())) {
UIManager.setLookAndFeel(info.getClassName());
break;
}
}
} catch (Exception e) {
}
ICLOUD r=new ICLOUD();
}
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
}
}
答案 0 :(得分:10)
让我展示你正在挖掘自己的洞
你可以......
BufferedImage img = ImageIO.read(this.getClass().getResource("anigif.gif"));
ImageIcon icon = new ImageIcon(img);
JLabel label = new JLabel(icon);
add(label);
或者你可以......
现在,这非常不合适,仅用于示例目的。它不支持处理方法或优化的Gif ...所以你可以开始想象使这项工作所需的额外工作量......很多......
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.metadata.IIOMetadata;
import javax.imageio.stream.ImageInputStream;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class PlayAnimatedGif {
public static void main(String[] args) {
new PlayAnimatedGif();
}
public PlayAnimatedGif() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
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 AnimatedGif ag;
public TestPane() {
URL url = getClass().getResource("/playanimatedgif/ajax-loader.gif");
try {
ag = new AnimatedGif(this, url);
} catch (IOException ex) {
ex.printStackTrace();
}
ag.play();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
BufferedImage currentFrame = ag.getCurrentFrame();
if (currentFrame != null) {
int x = (getWidth() - currentFrame.getWidth()) / 2;
int y = (getHeight() - currentFrame.getHeight()) / 2;
g2d.drawImage(currentFrame, x, y, this);
}
g2d.dispose();
}
}
public static class AnimatedGif {
public enum DisposalMethod {
RESTORE_TO_BACKGROUND,
RESTORE_TO_PREVIOUS,
DO_NOT_DISPOSE,
UNSPECIFIED;
public static DisposalMethod find(String text) {
DisposalMethod dm = UNSPECIFIED;
switch (text) {
case "restoreToBackgroundColor":
dm = RESTORE_TO_BACKGROUND;
break;
}
return dm;
}
}
private List<ImageFrame> frames;
private int frame;
private Timer playTimer;
private JComponent player;
protected AnimatedGif(JComponent value) {
this.player = value;
frames = new ArrayList<>(25);
playTimer = new Timer(0, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
frame++;
if (frame >= frames.size()) {
frame = 0;
}
player.repaint();
playTimer.setDelay(frames.get(0).getGraphicControlExtension().getDelayTime());
}
});
}
public AnimatedGif(JComponent player, URL url) throws IOException {
this(player);
try (InputStream is = url.openStream(); ImageInputStream stream = ImageIO.createImageInputStream(is)) {
Iterator readers = ImageIO.getImageReaders(stream);
if (!readers.hasNext()) {
throw new RuntimeException("no image reader found");
}
ImageReader reader = (ImageReader) readers.next();
reader.setInput(stream); // don't omit this line!
int n = reader.getNumImages(true); // don't use false!
System.out.println("numImages = " + n);
for (int i = 0; i < n; i++) {
BufferedImage image = reader.read(i);
ImageFrame imageFrame = new ImageFrame(image);
IIOMetadata imd = reader.getImageMetadata(i);
Node tree = imd.getAsTree("javax_imageio_gif_image_1.0");
NodeList children = tree.getChildNodes();
for (int j = 0; j < children.getLength(); j++) {
Node nodeItem = children.item(j);
NamedNodeMap attr = nodeItem.getAttributes();
switch (nodeItem.getNodeName()) {
case "ImageDescriptor":
ImageDescriptor id = new ImageDescriptor(
getIntValue(attr.getNamedItem("imageLeftPosition")),
getIntValue(attr.getNamedItem("imageTopPosition")),
getIntValue(attr.getNamedItem("imageWidth")),
getIntValue(attr.getNamedItem("imageHeight")),
getBooleanValue(attr.getNamedItem("interlaceFlag")));
imageFrame.setImageDescriptor(id);
break;
case "GraphicControlExtension":
GraphicControlExtension gc = new GraphicControlExtension(
DisposalMethod.find(getNodeValue(attr.getNamedItem("disposalMethod"))),
getBooleanValue(attr.getNamedItem("userInputFlag")),
getBooleanValue(attr.getNamedItem("transparentColorFlag")),
getIntValue(attr.getNamedItem("delayTime")) * 10,
getIntValue(attr.getNamedItem("transparentColorIndex")));
imageFrame.setGraphicControlExtension(gc);
break;
}
}
frames.add(imageFrame);
}
} finally {
}
}
public BufferedImage getCurrentFrame() {
// If this was a optimised GIF, we would need to be
// merging frames together to produce the current frame
// This would then need to be reset each time we cycle...
return frames.isEmpty() ? null : frames.get(frame).getImage();
}
public void play() {
if (!frames.isEmpty()) {
frame = 0;
playTimer.setDelay(frames.get(0).getGraphicControlExtension().getDelayTime());
playTimer.start();
player.repaint();
}
}
public void stop() {
playTimer.stop();
}
protected String getNodeValue(Node node) {
return node == null ? null : node.getNodeValue();
}
protected int getIntValue(Node node) {
return node == null ? 0 : getIntValue(node.getNodeValue());
}
protected boolean getBooleanValue(Node node) {
return node == null ? false : getBooleanValue(node.getNodeValue());
}
protected int getIntValue(String value) {
return value == null ? 0 : Integer.parseInt(value);
}
protected boolean getBooleanValue(String value) {
return value == null ? false : Boolean.parseBoolean(value);
}
public class ImageFrame {
private BufferedImage image;
private ImageDescriptor imageDescriptor;
private GraphicControlExtension graphicControlExtension;
public ImageFrame(BufferedImage image) {
this.image = image;
}
protected void setImageDescriptor(ImageDescriptor imageDescriptor) {
this.imageDescriptor = imageDescriptor;
}
protected void setGraphicControlExtension(GraphicControlExtension graphicControlExtension) {
this.graphicControlExtension = graphicControlExtension;
}
public GraphicControlExtension getGraphicControlExtension() {
return graphicControlExtension;
}
public BufferedImage getImage() {
return image;
}
public ImageDescriptor getImageDescriptor() {
return imageDescriptor;
}
}
public class GraphicControlExtension {
private DisposalMethod disposalMethod;
private boolean userInputFlag;
private boolean transparentColorFlag;
private int delayTime;
private int transparentColorIndex;
public GraphicControlExtension(DisposalMethod disposalMethod, boolean userInputFlag, boolean transparentColorFlag, int delayTime, int transparentColorIndex) {
this.disposalMethod = disposalMethod;
this.userInputFlag = userInputFlag;
this.transparentColorFlag = transparentColorFlag;
this.delayTime = delayTime;
this.transparentColorIndex = transparentColorIndex;
}
public int getDelayTime() {
return delayTime;
}
public DisposalMethod getDisposalMethod() {
return disposalMethod;
}
public int getTransparentColorIndex() {
return transparentColorIndex;
}
public boolean isTransparentColorFlag() {
return transparentColorFlag;
}
public boolean isUserInputFlag() {
return userInputFlag;
}
}
public class ImageDescriptor {
private int imageLeftPosition;
private int imageTopPosition;
private int imageHeight;
private int imageWeight;
private boolean interlaced;
public ImageDescriptor(int imageLeftPosition, int imageTopPosition, int imageHeight, int imageWeight, boolean interlaced) {
this.imageLeftPosition = imageLeftPosition;
this.imageTopPosition = imageTopPosition;
this.imageHeight = imageHeight;
this.imageWeight = imageWeight;
this.interlaced = interlaced;
}
public int getImageHeight() {
return imageHeight;
}
public int getImageLeftPosition() {
return imageLeftPosition;
}
public int getImageTopPosition() {
return imageTopPosition;
}
public int getImageWeight() {
return imageWeight;
}
public boolean isInterlaced() {
return interlaced;
}
}
}
}
如果您想填写,请查看GIF Specifications ...