.gif图像在将其添加到JTabbedpane时不会移动

时间:2014-03-05 04:58:24

标签: java image swing paintcomponent animated-gif

我有一个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

}



 }

1 个答案:

答案 0 :(得分:10)

让我展示你正在挖掘自己的洞

你可以......

BufferedImage img = ImageIO.read(this.getClass().getResource("anigif.gif"));
ImageIcon icon = new ImageIcon(img);
JLabel label = new JLabel(icon);
add(label);

或者你可以......

AnimatedGif

现在,这非常不合适,仅用于示例目的。它不支持处理方法或优化的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 ...