Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/371.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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
在javaapplet中连续绘制图像_Java_Animation_Applet_Awt_Event Dispatch Thread - Fatal编程技术网

在javaapplet中连续绘制图像

在javaapplet中连续绘制图像,java,animation,applet,awt,event-dispatch-thread,Java,Animation,Applet,Awt,Event Dispatch Thread,我正在尝试在小程序上绘制大约100幅图像。当我这样做的时候,我无法看到图像,因为过程太快了。所以我添加了睡眠功能,这样我就可以在从一个图像过渡到另一个图像之间暂停。但这不正常。我看不到任何图片,我想睡眠被一次又一次地召唤。请帮忙 这是我的代码: public class Test extends Applet { public void init() { setSize(1000,1000); } public void make(Graphics g,int i) { }

我正在尝试在小程序上绘制大约100幅图像。当我这样做的时候,我无法看到图像,因为过程太快了。所以我添加了睡眠功能,这样我就可以在从一个图像过渡到另一个图像之间暂停。但这不正常。我看不到任何图片,我想睡眠被一次又一次地召唤。请帮忙
这是我的代码:

public class Test extends Applet
{
public void init()
{

    setSize(1000,1000);


}

public void make(Graphics g,int i)
{


}
public void paint(Graphics g)
{
    int i=0;
    for(i=0;i<100;i++)
    {
        if(i!=65)
        {
            Image img = getImage(getDocumentBase(), "abc"+i+".png");
            g.drawImage(img, 0, 0, this);
            try
            {
                Thread.sleep(1000);
            }
            catch(Exception exception)
            {

            }
        }
    }

}

}
公共类测试扩展小程序
{
公共void init()
{
设置大小(10001000);
}
公共无效标识(图形g、int i)
{
}
公共空间涂料(图g)
{
int i=0;

for(i=0;i
sleep
将冻结EDT(事件调度线程)。由于Swing是单线程框架,任何阻塞(如sleep)的内容都会阻止EDT运行,因为
paint
是从EDT的上下文调用的。不要使用sleep,而是使用


另一个注意事项是,捕获异常而不处理它是一种不好的做法。这将隐藏代码中可能发生的严重意外情况,至少打印错误消息。

不要使用
Thread.sleep()
,因为它将冻结Swing应用程序

相反,您应该使用
javax.swing.Timer

有关更多信息和示例,请参阅Java教程和。

您应该做什么

  • 不要直接在小程序上绘图。在像JPanel这样的单独面板上绘图,并将其添加到小程序中
  • 不要调用sleep(),因为它会阻止EDT。所有Swing组件都绘制在EDT上,因此如果它被阻止,将导致问题
  • 也有人尝试使用单独的线程,但这不是一个好的选择,因为线程会休眠一段时间,然后错误地调用repaint()。最好使用javax.swing.Timer,它会在一段时间后触发事件
  • 试试这个代码

    public class Test extends JApplet {
    
        int imgNo = 0;
        BufferedImage bi;
    
        JPanel p = new JPanel(){
            @Override
            public void paintComponent(Graphics g){
                super.paintComponent(g);
    
                g.setColor(Color.white);
                g.fillRect(0, 0, getWidth(), getHeight());
                if(bi != null)
                   g.drawImage(bi, 0, 0, null);
            }
        };
        Timer t;
    
        @Override
        public void init() {
            super.init();
            setSize(400,400);
            t = new Timer(1000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    try{
                       if(imgNo != 65)
                         bi = ImageIO.read(new File("abc"+i+".png"));
                    }catch(Exception e){
                       e.printStackTrace();
                    }
                    imgNo++;
                    p.repaint();
                }
            });
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    p.setOpaque(true);
                    p.setBackground(Color.white);
                    setContentPane(p);
                }
            });
        }
    
        @Override
        public void start() {
            super.start();
            t.start();
        }
    
        @Override
        public void stop() {
            super.stop();
            t.stop();
        }
    }
    

    当我在计时器的ActionListener中读取文件中的图像时,我的代码中仍然存在一个缺点。对于初学者来说,现在还可以,但我建议您使用SwingWorker,它将在启动小程序之前加载图像。我稍后将提供此升级

    为什么您捕获异常而不打印/ha处理它?这将隐藏异常,您将不知道是否发生意外。尝试避免这种情况,这是一种不好的做法。对此表示抱歉。我实际上是一名初学者。以后会小心处理..我问的问题上有什么帮助吗?1)为什么要编写小程序?如果这是由于您的导师的规范,请参考。2)为什么要使用AWT组件而不是Swing?请参阅许多放弃AWT的好理由。您可以提供易于理解的任何链接!!在我的回答中提供谢谢在Maroun的建议后我做了同样的事情…!!谢谢帮助!