计时器延迟问题 Java

Timer Delay Problems Java

我正在尝试制作蛇类游戏,但我无法让 "pellets" 以固定的时间间隔随机出现(我想让它出现 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();
    }


}

您的代码尝试存在很多问题,所以让我们尝试解决这些问题。

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

建议:

  • 在扩展 JPanel 的 class 中重写 paintComponent 方法。
  • 先调用super.paintComponent方法。
  • 使用 javax.swing.Timer"Swing" Timer 来驱动您的动画。
  • 在您的 Timer 中创建一个新的 pellet,将其添加到 pellets 的 ArrayList,然后调用 repaint() 这将告诉 JVM 重新绘制您的 GUI,因此它会自动为您调用您的 paintComponent 方法。
  • 在您的 paintComponent 方法中,调用 super 的方法后,遍历 pellet ArrayList 并像您一样绘制每个单独的 pellet。
  • 查看 Swing 教程,尤其是图形部分。你可以在这里找到他们的link:swing info.
  • 并查看此站点以获取 Swing 动画示例,其中许多是我编写的。您可以使用 this search.
  • 找到一些结果