Java 在JLabel上的gif和png之间切换

Java 在JLabel上的gif和png之间切换,java,swing,jlabel,animated-gif,imageicon,Java,Swing,Jlabel,Animated Gif,Imageicon,我正在尝试制作一个俄罗斯轮盘赌游戏,我正在尝试将JLabel更改为左轮手枪旋转的gif。但是,我可以将其从gif更改为左轮手枪的图片,但不能将其更改回左轮手枪的图片。或者有没有办法只播放一次gif,让它停止播放,然后换成另一个gif import java.awt.Image; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax

我正在尝试制作一个俄罗斯轮盘赌游戏,我正在尝试将
JLabel
更改为左轮手枪旋转的gif。但是,我可以将其从gif更改为左轮手枪的图片,但不能将其更改回左轮手枪的图片。或者有没有办法只播放一次gif,让它停止播放,然后换成另一个gif

import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class RussianRoulette extends JFrame {

    private int Chamber;
    private int BulletPos;
    private boolean ButtonToggle;
    JButton Fire = new JButton("Fire");
    JButton Spin = new JButton("Spin");
    JLabel Gun = new JLabel();
    public RussianRoulette() {
    ButtonToggle = true;
    Chamber = (int) (Math.random() * 6 + 1);
    BulletPos = 0;
    JFrame frame = new JFrame();
    frame.getContentPane().setLayout(null);
    Gun.setBounds(0, 0, 500, 375);
    Fire.setBounds(25, 375, 100, 100);
    Spin.setBounds(350, 375, 100, 100);
    ImageIcon imgThisImg = new ImageIcon("Revolver2.png");
    Gun.setIcon(imgThisImg);                
    Spin.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae) {
                spinGun();
                sleep(600);

            }
        });

        Fire.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent ae) {
                fireGun();
            }
        });
        frame.setDefaultCloseOperation(frame.EXIT_ON_CLOSE);
        frame.add(Gun);
        frame.add(Fire);
        frame.add(Spin);
        frame.setResizable(true);
        frame.setSize(500, 500);
        Image im = Toolkit.getDefaultToolkit().getImage("icon.png");
        frame.setIconImage(im);
        frame.setVisible(true);
        frame.setResizable(false);
        frame.setTitle("Russian Roulette");

    }

    public void spinGun() {
         ImageIcon imgThisImg = new ImageIcon("SpinRevolver.gif");
         Gun.setIcon(imgThisImg);
         sleep(600);
        AudioPlayer player3 = new AudioPlayer("Spin.wav");
        player3.play();
        BulletPos = (int) (Math.random() * 6 + 1);
    }

    public void fireGun() {

        if (ButtonToggle == false) {
            AudioPlayer player5 = new AudioPlayer("Click.wav");
            player5.play();
        }

        if (Chamber == BulletPos && ButtonToggle == true) {
            AudioPlayer player2 = new AudioPlayer("Shot.wav");
            player2.play();
            ButtonToggle = false;
        } else {
            Chamber++;
            CheckNum();
            AudioPlayer player = new AudioPlayer("Click.wav");
            player.play();
        }
    }

    public void CheckNum() {
        if (Chamber > 6) {
            Chamber = 1;
        }
    }

    public void reload()
    {
        //play reload animation
        ButtonToggle = true;
    }

        public void sleep(int ammount)
        {
            try {
                Thread.sleep(ammount);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

}

因此,根据反馈,您希望动画通过单击按钮开始运行,并在给定时间段后自动停止

可能最简单的解决方案是使用
javax.swing.Timer
,否则您需要将自己设置为某种
ImageObserver
,并中断来自图像的各种事件…就像我说的,更简单

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class SpiningLabel {

    public static void main(String[] args) {
        new SpiningLabel();
    }

    public SpiningLabel() {
        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 ImageIcon spin;
        private ImageIcon still;

        private JLabel label;
        private Timer timer;
        private JButton button;

        public TestPane() {
            spin = new ImageIcon("spin.gif");
            still = new ImageIcon("still.png");

            label = new JLabel(still);
            button = new JButton("Allons-y!");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    label.setIcon(spin);
                    button.setEnabled(false);
                    timer.restart();
                }
            });
            timer = new Timer(2000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    label.setIcon(still);
                    button.setEnabled(true);
                }
            });
            timer.setRepeats(false);

            setLayout(new BorderLayout());
            add(label);
            add(button, BorderLayout.SOUTH);
        }
    }

}


因此,根据反馈,您希望动画通过单击按钮开始运行,并在给定时间段后自动停止

可能最简单的解决方案是使用
javax.swing.Timer
,否则您需要将自己设置为某种
ImageObserver
,并中断来自图像的各种事件…就像我说的,更简单

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class SpiningLabel {

    public static void main(String[] args) {
        new SpiningLabel();
    }

    public SpiningLabel() {
        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 ImageIcon spin;
        private ImageIcon still;

        private JLabel label;
        private Timer timer;
        private JButton button;

        public TestPane() {
            spin = new ImageIcon("spin.gif");
            still = new ImageIcon("still.png");

            label = new JLabel(still);
            button = new JButton("Allons-y!");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    label.setIcon(spin);
                    button.setEnabled(false);
                    timer.restart();
                }
            });
            timer = new Timer(2000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    label.setIcon(still);
                    button.setEnabled(true);
                }
            });
            timer.setRepeats(false);

            setLayout(new BorderLayout());
            add(label);
            add(button, BorderLayout.SOUTH);
        }
    }

}


一个实战需要更少的猜测工作和更好的游戏回应选择。一个实战需要更少的猜测工作和更好的游戏回应选择。我已经更新了我的代码以包括我的整个班级,但让我重新表述一下我自己。因此,当我按下旋转按钮时,我的Jlabel将被左轮手枪旋转的gif替换,然后变回静止图片,但只需单击按钮即可。/)@user3307676那么,您想要某种定时事件吗?谢谢您的帮助!/)Geronimo!我已经更新了我的代码,以包括我的整个类,但让我重新措辞我自己。因此,当我按下旋转按钮时,我的Jlabel将被左轮手枪旋转的gif替换,然后变回静止图片,但只需单击按钮即可。/)@user3307676那么,您想要某种定时事件吗?谢谢您的帮助!/)Geronimo!