定时器延迟问题Java

时间:2015-03-10 16:22:50

标签: java swing timer timertask

我正在尝试制作一款蛇型游戏而且我在制作"颗粒时遇到了麻烦。以固定的间隔出现在随机的地方(我想让它达到10秒)。当我在短暂的延迟后运行程序时(1000毫秒),颗粒开始出现在不同位置的屏幕上极快地闪烁。我想要做的是让颗粒每10秒钟在一个随机位置出现一个,而不是快速闪烁。任何帮助将不胜感激。

P.S。我之前从未做过这样的事情,如果代码看起来有点粗糙,我会道歉。一般编码的任何建议也非常感谢。

编辑:我知道这仍然是错误的,但我只是想知道我到目前为止是否至少在正确的轨道上。现在" pellet"只是坐在框架的右上角。我的计时器或列表现在是否存在问题,或者只是一般的问题。顺便说一句,如果更新我的代码只是为了显示新问题,请不要在本网站上告诉我,我只是在评论部分寻求帮助,然后停止编辑。

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();
    }


}

1 个答案:

答案 0 :(得分:5)

您的代码尝试存在很多问题,所以让我们尝试一下。

  • 首先这是一个Swing程序,所以你必须注意不要踩踏Swing事件线程,这是java.util.Timer会做的事情。
  • 你还要在paint方法中创建你的java.util.Timer,这是永远不应该做的事情,因为这个方法只用于绘画和绘画,不应该减速或涉及非绘画代码。
  • 您的paint方法不是Swing组件的真正绘制方法覆盖,因为它具有错误的签名(它使用Graphics2D参数而不是预期的Graphics参数)并且您的类没有扩展Swing组件,所以此方法将执行没什么用的。

建议:

  • 在扩展JPanel的类中绘制paintComponent方法覆盖。
  • 首先调用super.paintComponent方法。
  • 使用javax.swing.Timer"Swing" Timer来推动您的动画。
  • 在你的Timer中创建一个新的pellet,将它添加到pellet的ArrayList中,并调用repaint(),它将告诉JVM重新绘制你的GUI,因此它将自动为你调用paintComponent方法。
  • 在你的paintComponent方法中,在调用super方法之后,迭代通过pellet ArrayList绘制每个单独的pellet。
  • 查看Swing教程,尤其是图形部分。您可以在此处找到指向他们的链接:swing info
  • 并查看此网站上的Swing动画示例,很多是我写的。您可以使用this search找到一些结果。