我想创造一个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
}
}
好了,有很多的代码中的问题,让我们走进他们每个人:
你有很多的线之间的空间,使您的代码有很多更大,更难阅读
您还没有正确地缩进你的代码(见最后}
您的代码,它是在同一水平比别人;你for
循环,等等),它使代码,所以更难阅读和理解,以及
你要创建一个JFrame
,但延长JLabel
,我不知道你为什么这样做,如果你这样做,所以你可以使用paintComponent()
方法,这是没有必要的,我的代码,你可以看到你能做到这一点W / O扩展的任何Component
如果你没有看过的摇摆Timer
的文档 ,你应该点击该链接并阅读什么ActionListener
参数一样。 在这种情况下,我们将使用这个监听器调用repaint()
方法和更新我们的currentImage
(或nextImage
在下面的代码),并相应改变图像。 你没能做到这一点。
你创造了超过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(); }
你改变了不必要的知名度paintComponent()
方法,以public
从protected
不过,我要祝贺你不使用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();
}
};
}