Java JFrame中的动画序列

Java JFrame中的动画序列,java,swing,animation,timer,jframe,Java,Swing,Animation,Timer,Jframe,我想创建一个JFrame,并在其中放置一系列动画图像。但是图像不会显示在帧窗口中。我只想要基本的故障排除提示,使它出现在窗口中。如果可以,只需编辑答案代码即可 我的问题: 为什么窗口没有显示任何图片?它显示了一个背景颜色为蓝色的窗口,但仅此而已。请告诉我一种有效的方法,将图像存储在变量中并在循环中显示 import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import

我想创建一个
JFrame
,并在其中放置一系列动画图像。但是图像不会显示在帧窗口中。我只想要基本的故障排除提示,使它出现在窗口中。如果可以,只需编辑答案代码即可

我的问题: 为什么窗口没有显示任何图片?它显示了一个背景颜色为蓝色的窗口,但仅此而已。请告诉我一种有效的方法,将图像存储在变量中并在循环中显示

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;

import javax.imageio.ImageIO;
import javax.swing.*;

import java.io.*;



public class Game extends JLabel implements ActionListener{


 /**
  * 
  */
 private static final long serialVersionUID = 1L;
 public static Game blah;
  BufferedImage nekopics[] = new BufferedImage[7];

 BufferedImage currentimg;
 public String nekosrcs[];
 int xpos;

 Timer timer;

 public Game() throws IOException
 {
      JFrame jframe = new JFrame();




      nekosrcs = new String[] { "walk1.png", "walk2.png",

              "walk3.png", "walk4.png", "walk5.png",

              "walk6.png"};

    jframe.setTitle("Game");
    jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    jframe.setLayout(new FlowLayout());

    jframe.setSize(400, 400);
    jframe.setResizable(false);
    jframe.setVisible(true);

    jframe.getContentPane().setBackground(Color.BLUE);




     for (int i=0; i < nekopics.length; i++) {

 nekopics[i] = ImageIO.read(new FileInputStream("D:/Programs 
                                              /pics"+nekosrcs[i]));

     }

     for (int i=0; i < nekopics.length; i++) {
         timer = new Timer(1000, this);
            timer.setInitialDelay(0);
            timer.start();
         currentimg = nekopics[i];

         repaint();


     }



 }

public void paintComponent(Graphics g)
{
    super.paint(g);

    g.drawImage(currentimg,100,100,this);
}



 public static void main(String[] args) throws IOException {

blah = new Game();



}

public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub

}




}
import java.awt.*;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入javax.imageio.imageio;
导入javax.swing.*;
导入java.io.*;
公共类游戏扩展JLabel实现ActionListener{
/**
* 
*/
私有静态最终长serialVersionUID=1L;
公共静态游戏;
BuffereImage nekopics[]=新的BuffereImage[7];
缓冲图像电流img;
公共字符串nekosrcs[];
int XPO;
定时器;
公共游戏()抛出异常
{
JFrame JFrame=新JFrame();
nekosrcs=新字符串[]{“walk1.png”、“walk2.png”,
“walk3.png”、“walk4.png”、“walk5.png”,
“walk6.png”};
jframe.setTitle(“游戏”);
jframe.setDefaultCloseOperation(jframe.EXIT_ON_CLOSE);
setLayout(新的FlowLayout());
jframe.setSize(400400);
jframe.setresizeable(false);
jframe.setVisible(true);
jframe.getContentPane().setBackground(颜色为.BLUE);
对于(int i=0;i
好的,您的代码中有很多问题,让我们逐一探讨:

  • 行与行之间有很多空格,这使得代码更大,更难阅读

  • 您没有正确缩进代码(请参阅代码上的最后一个
    }
    ,它与其他代码处于同一级别;您的
    用于
    循环等),这也使代码更难阅读和理解

  • 你正在创建一个
    JFrame
    但是扩展
    JLabel
    ,我不知道你为什么要这样做,如果你这样做的话,你可以使用
    paintComponent()
    方法,这是不必要的,在我的代码中,你可以看到如何在不扩展任何
    组件的情况下完成它

  • 如果尚未阅读Swing
    计时器
    ,则应单击该链接并阅读
    ActionListener
    参数的功能。在本例中,我们将使用此侦听器调用
    repaint()
    方法并更新我们的
    currentImage
    (或下面代码中的
    nextImage
    )并相应地更改图像。你没有做到这一点

  • 您也创建了1个以上的
    计时器
    ,您在这里创建了6个!所有这些都是新的,但时间一到,他们就没有什么行动要做了

    for (int i=0; i < nekopics.length; i++) {
        timer = new Timer(1000, this);
        timer.setInitialDelay(0);
        timer.start();
        currentimg = nekopics[i];
        repaint();
    }
    

    您可以看到Swing类My questions的一个运行示例:请在每篇文章中提出一个问题,正如您所说,您是新来的,因此请仔细阅读,了解如何制作a以及如何正确缩进代码。请注意,我已经缩进了,但我应该这样做,下次在发布之前正确地做,另外,请按照“变量名称应以小写开头”的说明进行操作。为什么要扩展
    JFrame
    并创建
    JFrame
    对象?做一个或另一个,我推荐后者,因为如果你扩展一个
    JFrame
    你是说你的类实际上是一个
    JFrame
    ,相反,如果你需要扩展一些东西,扩展
    JPanel
    ,这样你以后就可以将这些面板添加到另一个
    JFrame
    ,谢谢你的反馈,但是这些图像仍然没有显示在窗口中。我已经执行了您建议的编辑。如果你能检查一下我在这个新代码中是否正确使用了计时器,我会很高兴的。谢谢,它工作起来很有魅力!虽然现在有很多新的方法,我还是要去寻找。天啊,我真是个业余爱好者!我会根据你的建议采取行动,下次我在这里发帖时,会使我的代码更加清晰易读。谢谢你的帮助@noobprogrammer没问题,试着使用IDE他们会给你推荐你想要的方法,我不是最好的,但我已经学习swing四年了(阅读SO Q&A的所有内容),与其他一些用户相比,我实际上也是一个初学者,我很高兴你也想提高你的帖子和编程技能,所以,祝你好运,编程愉快:)
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.io.FileInputStream;
    import java.io.IOException;
    
    import javax.imageio.ImageIO;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    import javax.swing.Timer;
    
    public class ImageSequence {
        private JFrame frame;
        private JPanel pane;
        private Timer timer;
        private int nextImage = 0;
        private String[] images = {"tokyo", "tokyo2", "starwars"};
        private Image img = null;
        public static void main (String args[]) {
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new ImageSequence().createAndShowGui();
                }
            });
        }
    
        public void createAndShowGui() {
            frame = new JFrame("Image Sequence");
            timer = new Timer(1000, listener);
            pane = new JPanel() {
                @Override
                protected void paintComponent(Graphics g) {
                    super.paintComponent(g);
                    try {
                        img = ImageIO.read(new FileInputStream("/home/jesus/Pictures/" + images[nextImage] + ".jpg"));
                    } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                    g.drawImage(img , 0, 0, 200, 200, this);
                }
    
                @Override
                public Dimension getPreferredSize() {
                    return new Dimension(200, 200);
                }
            };
    
            timer.start();
    
            frame.getContentPane().add(pane);
            frame.pack();
            frame.setVisible(true);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    
        ActionListener listener = new ActionListener() {   
            @Override
            public void actionPerformed(ActionEvent event) {
                System.out.println(nextImage);
                nextImage = nextImage < images.length - 1 ? nextImage + 1 : 0;
                System.out.println(nextImage);
                pane.repaint();
            }
        };
    }