Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未显示图像动画_Java_Animation_Awt_Frame_Paint - Fatal编程技术网

Java 未显示图像动画

Java 未显示图像动画,java,animation,awt,frame,paint,Java,Animation,Awt,Frame,Paint,我有以下代码。我想在一段时间延迟后在屏幕上显示我的chick数组中的图像 图像已加载。我想知道我可以在此代码中添加哪些附加代码段,以便在我的帧上使用我拥有的两个图像制作动画。以下是我的代码: 导入java.awt.Color; 导入java.awt.Dimension; 导入java.awt.Frame; 导入java.awt.Graphics; 导入java.awt.Image; 导入java.awt.Toolkit; 公共类扩展框架实现可运行{ 线程动画; 长帧延迟=3000; 图像鸡[]=

我有以下代码。我想在一段时间延迟后在屏幕上显示我的chick数组中的图像 图像已加载。我想知道我可以在此代码中添加哪些附加代码段,以便在我的帧上使用我拥有的两个图像制作动画。以下是我的代码:

导入java.awt.Color;
导入java.awt.Dimension;
导入java.awt.Frame;
导入java.awt.Graphics;
导入java.awt.Image;
导入java.awt.Toolkit;
公共类扩展框架实现可运行{
线程动画;
长帧延迟=3000;
图像鸡[]=新图像[2];
int numFrames=chick.length;
Toolkit tk=getToolkit();
公鸡()
{
设置尺寸(新尺寸(300300));
setVisible(真);
挫折背景(颜色:黑色);
动画=新线程(此);
chick[0]=tk.createImage(“stand.png”);
chick[1]=tk.createImage(“walk.png”);
animation.start();
//setVisible(假);
}
公共空间涂料(图g)
{
g、 drawImage(chick[0],100100,空);
}
@凌驾
公开募捐{
//TODO自动生成的方法存根
重新油漆();
试一试{
睡眠(帧延迟);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
公共静态void main(字符串参数[])
{
鸡肉实例=新鸡肉();
}
}

因此,您遇到的第一个问题是资源问题

存储在应用程序中的资源(通常称为嵌入式资源)不能像外部资源那样加载

chick[0] = tk.createImage("stand.png");
需要一个不存在的文件
“/stand.png”
。相反,您需要通过
类#getResource
API加载资源

chick[0] = tk.createImage(getClass().getResource("/stand.png"));
您将面临的第二个问题是覆盖顶级容器的
paint
。这真的不应该做。让我们从它不是双缓冲的事实开始,并以框架具有位于可视区域内的装饰的事实结束。这意味着装饰物将与你在表面上绘制的内容重叠…不漂亮

第三个问题是您没有告诉图像它应该移动到哪里。它是静态的

您需要某种x/y值来告诉图像应该绘制在哪里。在调用
repaint
…之前,您可以在线程中通过给定的x/y增量修改这些值

您可能遇到的第四个问题是,您正在使用AWT…这有点过时。Swing将为您解决双缓冲问题…IMHO会做出更好的选择-现在有更多关于Swing的文档和示例;)

在我步履蹒跚的时候…我个人会推荐使用
Toolkit#createImage
ImageIcon
,主要是因为它支持更多格式,但也因为它会在图像因某种原因无法读取时抛出
异常

我有一个简单的例子,如果Swing,但我不会发布它,因为我会遇到麻烦运行的主题…让我知道,如果你想看到它

使用Swing示例更新

这将使用默认包中的嵌入映像

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ChickenDance {

    public static void main(String[] args) {
        new ChickenDance();
    }

    public ChickenDance() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private BufferedImage chicken;
        private int xPos;
        private int yPos;

        private int xDelta = 4;

        public TestPane() {
            try {
                chicken = ImageIO.read(getClass().getResource("/Chicken.png"));
            } catch (IOException ex) {
                Logger.getLogger(ChickenDance.class.getName()).log(Level.SEVERE, null, ex);
            }

            Timer timer = new Timer(40, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    xPos += xDelta;
                    if (xPos + chicken.getWidth() > getWidth()) {
                        xPos = getWidth() - chicken.getWidth();
                        xDelta *= -1;
                    } else if (xPos < 0) {
                        xPos = 0;
                        xDelta *= -1;
                    }
                    yPos = (getHeight() - chicken.getHeight()) / 2;
                    repaint();
                }
            });
            if (chicken != null) {
                timer.start();
            }
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(400, 400);
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (chicken != null) {
                Graphics2D g2d = (Graphics2D) g.create();
                g2d.drawImage(chicken, xPos, yPos, this);
                g2d.dispose();
            }
        }
    }

}

导入java.awt.BorderLayout;
导入java.awt.Dimension;
导入java.awt.EventQueue;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.image.buffereImage;
导入java.io.IOException;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.imageio.imageio;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.Timer;
导入javax.swing.UIManager;
导入javax.swing.UnsupportedLookAndFeelException;
公共类奇肯登斯{
公共静态void main(字符串[]args){
新ChickenDance();
}
公共卫生{
invokeLater(新的Runnable(){
@凌驾
公开募捐{
试一试{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
}catch(ClassNotFoundException |实例化Exception | IllegalacessException |不支持ookandfeelException ex){
}
JFrame=新JFrame(“测试”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(新的BorderLayout());
frame.add(newtestpane());
frame.pack();
frame.setLocationRelativeTo(空);
frame.setVisible(true);
}
});
}
公共类TestPane扩展了JPanel{
私家鸡;
私人int XPO;
私营机构;
私有int xDelta=4;
公共测试窗格(){
试一试{
chicken=ImageIO.read(getClass().getResource(“/chicken.png”);
}捕获(IOEX异常){
Logger.getLogger(ChickenDance.class.getName()).log(Level.SEVERE,null,ex);
}
计时器计时器=新计时器(40,新ActionListener(){
@凌驾
已执行的公共无效操作(操作事件e){
xPos+=xDelta;
如果(xPos+chicken.getWidth()>getWidth()){
xPos=getWidth()-chicken.getWidth();
xDelta*=-1;
}否则如果(xPos<0){
xPos=0;
xDelta*=-1;
}