坚持使用 Java Swing Timer

Posted

技术标签:

【中文标题】坚持使用 Java Swing Timer【英文标题】:Stuck on using Java Swing Timer 【发布时间】:2020-04-08 23:43:59 【问题描述】:

我在 JFrame 上的画布中创建了一个小矩形。我已经把这门课变成了单身(我知道你们中的一些人会说这是不好的做法,但我很好)。我目前只是在按下箭头键时使用 repaint() 方法。但是,我现在正在考虑使用摇摆计时器制作游戏循环。

我创建了一个名为“GameLoop.java”的类并添加了以下代码。

public class GameLoop implements ActionListener 


    Timer timer = new Timer(10, this);

    public void actionPerformed(ActionEvent e) 

        timer.start();
        GameCanvas.getInstance().repaint();

    

但是,当按下箭头时,这对屏幕没有任何影响。我有什么遗漏/做错了吗?

【问题讨论】:

我们需要查看实际更新的内容以告诉您想要的是错误的。 GameCanvas 如何改变正在绘制的内容? Swing 也不是游戏类型编程的好选择,但如果你做额外的工作,它似乎是可能的。这是血腥的细节:pavelfatin.com/low-latency-painting-in-awt-and-swing 你也可以用其他词搜索“java swing pipeline”得到好的信息:docs.oracle.com/javase/10/troubleshoot/… 基本上,你的问题是,Timer 不会自动启动......而且你不应该在actionPerformed 方法中调用start。相反,调用start 作为一些初始化/设置阶段的一部分。 “游戏循环”还应该接受任何输入状态并在绘制之前修改游戏状态 【参考方案1】:

actionPerformed(ActionEvent e) 仅在定时器启动后被调用,因此不能用于启动定时器。 您需要在其他地方启动它。例如:

public class GameLoop implements ActionListener 

    GameLoop() 
        Timer timer = new Timer(10, this);
        timer.start();
    

    public void actionPerformed(ActionEvent e) 
        GameCanvas.getInstance().repaint();
    

【讨论】:

以上是关于坚持使用 Java Swing Timer的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Java 中有两个 Timer 类(一个在 javax.swing 下,一个在 java.util 下)?

java swing中Timer类的学习

Java Swing的计时器组件Timer

我应该采用 Java 12 还是坚持使用 Java 11?

现在该用 Java12,还是坚持使用老版本?

我该用 Java 12 还是坚持 Java 11?