Java 计时器延迟太小时对象消失

Java 计时器延迟太小时对象消失,java,timer,graphics2d,Java,Timer,Graphics2d,所以当我在做一个TD小游戏的时候,我遇到了一个射弹的问题。我已经写了一个方法,它允许我从一个设定的位置向一个设定的位置发射一枚射弹。为了使投射物移动,我使用了一个延迟10毫秒的计时器。但当我执行代码时,似乎什么也没发生。然后我回顾了我的代码,发现问题显然只是一个视觉问题,因为炮弹的坐标发生了预期的变化 然后,我找到了两个“修复”问题的方法,我对此并不满意 首先,如果延迟为16毫秒或以上,则显示射弹。但是我希望炮弹在不增加移动量的情况下移动得更快,否则它们就有可能穿越敌人,而不会在命中框中出现一次

所以当我在做一个TD小游戏的时候,我遇到了一个射弹的问题。我已经写了一个方法,它允许我从一个设定的位置向一个设定的位置发射一枚射弹。为了使投射物移动,我使用了一个延迟10毫秒的计时器。但当我执行代码时,似乎什么也没发生。然后我回顾了我的代码,发现问题显然只是一个视觉问题,因为炮弹的坐标发生了预期的变化

然后,我找到了两个“修复”问题的方法,我对此并不满意

首先,如果延迟为16毫秒或以上,则显示射弹。但是我希望炮弹在不增加移动量的情况下移动得更快,否则它们就有可能穿越敌人,而不会在命中框中出现一次

第二,如果每次改变投射物的位置后,我都在JFrame上调用repaint方法,那么它也可以工作。但我听说,在循环中或快速连续调用repaint方法会对性能产生非常糟糕的影响

如果有人能找到解决这个问题的办法,那就太好了。如果我弄错了,在这个场景中使用重绘方法是可以的,那当然很好,但我也很好奇是什么原因造成的。 所以先谢谢你

package pack;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.Timer;

public class Test {

    Timer timer;
    JFrame jf;
    JLabel lbl;

    double addX = 500;
    double addY = 250;

    public Test() {

        jf = new JFrame();
        jf.setSize(1536, 864);
        jf.setVisible(true);

        lbl = new JLabel(new ImageIcon("rsc/dot.png"));
        lbl.setSize(10, 10);
        lbl.setVisible(true);

        jf.add(lbl);

        jf.repaint();

        timer = new Timer(15, new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                lbl.setLocation(lbl.getX() + 10, 432);
                
            }

        });

        timer.start();

    }

}
这个问题在某种程度上显然与对象的大小有关,因为显示了大小为20像素的对象(至少部分显示了)。同样,如果将延迟增加到16毫秒,它也会产生类似的效果。

1)无需扩展JLabel来绘制图像。您只需向标签添加和ImageIcon。2) 无需调用repaint()。当您更改Swing组件的属性时,它将重新绘制自身。setLocation(…)方法将导致组件重新绘制自身。当您在自己的自定义组件上进行自定义绘制时,只需使用repaint()方法。张贴一篇适当的文章来演示这个问题。这就是你所需要的是一个JFrame和你的投射物添加到框架中。