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()
方法,这是不必要的,在我的代码中,你可以看到如何在不扩展任何组件的情况下完成它
计时器
,则应单击该链接并阅读ActionListener
参数的功能。在本例中,我们将使用此侦听器调用repaint()
方法并更新我们的currentImage
(或下面代码中的nextImage
)并相应地更改图像。你没有做到这一点计时器
,您在这里创建了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();
}
};
}