gpt4 book ai didi

java - JFrame 中的动画序列

转载 作者:行者123 更新时间:2023-11-30 02:50:08 25 4
gpt4 key购买 nike

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

}




}

最佳答案

好吧,您的代码中有很多问题,让我们逐一讨论:

  1. 行与行之间有很多空格,这会使代码变得更大且更难以阅读

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

  3. 您正在创建一个 JFrame 但扩展 JLabel,我不确定您为什么要这样做,如果您这样做的话可以使用 paintComponent() 方法,这不是必需的,在我的代码中,您可以看到如何在不扩展任何 Component

    的情况下做到这一点
  4. 如果您还没有阅读过 Swing Timer docs您应该单击该链接并阅读 ActionListener 参数的作用。在本例中,我们将使用此监听器来调用 repaint() 方法并更新代码中的 currentImage (或 nextImage)如下)并相应地更改图像。你没有做到这一点。

  5. 您也创建了超过 1 个 Timer,您在这里创建了 6 个!他们都是新人,但时间结束时他们没有任何行动可做<​​/p>

    for (int i=0; i < nekopics.length; i++) {
    timer = new Timer(1000, this);
    timer.setInitialDelay(0);
    timer.start();
    currentimg = nekopics[i];
    repaint();
    }
  6. 您不必要地将 paintComponent() 方法的可见性从 protected 更改为 public

    <
<小时/>

不过,我要祝贺您没有使用 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();
}
};
}

关于java - JFrame 中的动画序列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38966000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com