在JFrame的动画序列(Animation sequence in JFrame)

2019-09-27 02:53发布

我想创造一个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

}




}

Answer 1:

好了,有很多的代码中的问题,让我们走进他们每个人:

  1. 你有很多的线之间的空间,使您的代码有很多更大,更难阅读

  2. 您还没有正确地缩进你的代码(见最后}您的代码,它是在同一水平比别人;你for循环,等等),它使代码,所以更难阅读和理解,以及

  3. 你要创建一个JFrame ,但延长JLabel ,我不知道你为什么这样做,如果你这样做,所以你可以使用paintComponent()方法,这是没有必要的,我的代码,你可以看到你能做到这一点W / O扩展的任何Component

  4. 如果你没有看过的摇摆Timer 的文档 ,你应该点击该链接并阅读什么ActionListener参数一样。 在这种情况下,我们将使用这个监听器调用repaint()方法和更新我们的currentImage (或nextImage在下面的代码),并相应改变图像。 你没能做到这一点。

  5. 你创造了超过1个Timer太,创建6在这里! 所有这些新的,但他们没有行动的期限内完成办

     for (int i=0; i < nekopics.length; i++) { timer = new Timer(1000, this); timer.setInitialDelay(0); timer.start(); currentimg = nekopics[i]; repaint(); } 
  6. 你改变了不必要的知名度paintComponent()方法,以publicprotected


不过,我要祝贺你不使用null布局并按照我上面的意见中提出的建议。


最后,改变一个内一个又一个图像的代码Timer是以下几点,就可以复制,粘贴,改变形象的名字,所以你可以看到它是如何工作的。

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();
        }
    };
}


文章来源: Animation sequence in JFrame