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

标签 java image swing paintcomponent animated-gif

我有一个 JFrame。因为我有两个容器,即两个 JPanel。一个 Panel 包含图像。另一个持有一个 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

}



 }

最佳答案

让我演示一下你正在挖的坑

你可以做...

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 ...

关于java - .gif 图像在将其添加到 JTabbedpane 时不会移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22188940/

相关文章:

java - 在 Cygwin 上运行 Java 程序 - 找不到类路径

java - 包 com.mathworks.toolbox.javabuilder 不存在

c# - 图像边距行为

java - 如何根据选择的按钮从类中调用方法?

java - 我如何使用 Java Swing 创建这个特殊的菜单栏?

java - Spring Boot 在哪里存储其默认日志记录设置

java - 当我只想要 Java 中大于 5 的值时,如何返回一个数组

javascript - 如何在javascript中动态更改的元素中触发事件

c# - 使用 .NET/WPF 预加载图像资源

java - 使 JTextPane 背景透明