Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.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_Swing_Timer_Timertask - Fatal编程技术网

Java中的定时器延迟问题

Java中的定时器延迟问题,java,swing,timer,timertask,Java,Swing,Timer,Timertask,我正在尝试制作一款蛇型游戏,但我很难让“小球”以固定的间隔出现在随机的地方(我想让它出现10秒)。当我在我给出的短暂延迟(1000毫秒)后运行程序时,小球开始在屏幕上的不同位置快速闪烁。我想做的是让小球在随机位置每10秒出现一个,而不是快速闪烁。任何帮助都将不胜感激 另外,我以前从未做过类似的事情,所以,如果代码看起来有点粗糙,我道歉。任何关于编码的建议也非常感谢 编辑:我知道这仍然是不正确的,但我只是想知道我是否至少在正确的轨道上。现在“小球”就在画面的右上角。现在我的计时器、列表或所有东西都

我正在尝试制作一款蛇型游戏,但我很难让“小球”以固定的间隔出现在随机的地方(我想让它出现10秒)。当我在我给出的短暂延迟(1000毫秒)后运行程序时,小球开始在屏幕上的不同位置快速闪烁。我想做的是让小球在随机位置每10秒出现一个,而不是快速闪烁。任何帮助都将不胜感激

另外,我以前从未做过类似的事情,所以,如果代码看起来有点粗糙,我道歉。任何关于编码的建议也非常感谢

编辑:我知道这仍然是不正确的,但我只是想知道我是否至少在正确的轨道上。现在“小球”就在画面的右上角。现在我的计时器、列表或所有东西都有问题吗。顺便说一句,如果更新我的代码只是为了显示新的问题是不赞成在这个网站让我知道,我只会要求帮助在评论部分和停止编辑

package snake;

import java.awt.* ;
import java.awt.event.*;
import java.util.* ;
import javax.swing.*;
import javax.swing.Timer;
/**
 *
 * @author Carlos
 */
public class Pellet extends JPanel
{
    Random randomNumber = new Random() ; 
    int x = 0 ;
    int y = 0 ;
    private Game game ;
    private Timer timer ;
    private final int DELAY = 100 ;
    private ArrayList<Pellet> al = new ArrayList<>() ;

    public Pellet(Game game)
    {        
        this.game = game ;        
    }

    @Override
    public void paint(Graphics g)
    {  
       super.paintComponent(g);
       g.fillOval(x, y, 10, 10);

       for(int i = 0 ; i < al.size() ; i++)
       {
           Pellet p = al.get(i) ;
           p.paintComponent(g);
       }

    }

    public void pelletTimer()
    {
        timer = new Timer(DELAY, new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                x = randomNumber.nextInt(game.getWidth()) ;
                y = randomNumber.nextInt(game.getHeight()) ;
                Pellet p = new Pellet(game) ;
                al.add(p) ;
                repaint() ;
            }
        }) ;    
        timer.start();
    }


}
包装蛇;
导入java.awt.*;
导入java.awt.event.*;
导入java.util.*;
导入javax.swing.*;
导入javax.swing.Timer;
/**
*
*@作者卡洛斯
*/
公共类JPanel
{
随机数=新随机数();
int x=0;
int y=0;
私人游戏;
私人定时器;
专用最终整数延迟=100;
private ArrayList al=new ArrayList();
公众小球(游戏)
{        
这个游戏=游戏;
}
@凌驾
公共空间涂料(图g)
{  
超级组件(g);
g、 椭圆形(x,y,10,10);
对于(int i=0;i
您在编写代码时遇到了很多问题,所以让我们来看看这些问题

  • 首先,这是一个Swing程序,因此您必须注意不要踩踏Swing事件线程,
    java.util.Timer
    将完成这项工作
  • 您还在一个绘制方法中创建
    java.util.Timer
    ,这是绝对不应该做的事情,因为这个方法只用于绘制和绘制,不应该减慢速度或涉及非绘制代码
  • 您的paint方法不是Swing组件的true paint方法重写,因为它具有错误的签名(它使用的是Graphics2D参数而不是预期的图形参数),并且您的类没有扩展Swing组件,因此此方法对您没有任何用处
建议:

  • 在扩展JPanel的类中绘制paintComponent方法重写
  • 首先调用super.paintComponent方法
  • 使用
    javax.swing.Timer
    或驱动动画
  • 在计时器中,创建一个新的小球,将其添加到小球的数组列表中,并调用
    repaint()
    ,这将告诉JVM重新绘制GUI,因此它将自动为您调用paintComponent方法
  • 在paintComponent方法中,在调用super的方法后,按您所做的方式遍历pellet ArrayList绘制每个单独的小球
  • 查看Swing教程,特别是图形部分。您可以在此处找到指向它们的链接:
  • 看看这个网站上的Swing动画例子,很多都是我写的。您可以在中找到一些结果

我修好了!它现在可以正常工作了,我要感谢你,因为它是一艘装满鳗鱼的气垫船,谢谢你的帮助!