Java:每X秒执行一次操作

Java:每X秒执行一次操作,java,user-interface,timer,draw,Java,User Interface,Timer,Draw,我有一个工作的Java程序,我想每X秒在显示器上画一个对象。最好的方法是什么?我曾考虑使用for循环和一些sleep语句,但我很好奇是否有更简单或更有效的方法来实现这一点 谢谢。使用Thread,这将每隔xmils在屏幕上绘制一个矩形。这将在运行5次后停止。编辑xMilSeconds表示较慢的运行,编辑j>4表示停止前的运行次数。但它确实冻结了,我无法修复 int i = 0; private long xMilSeconds = 300; private boolean paint; publ

我有一个工作的Java程序,我想每X秒在显示器上画一个对象。最好的方法是什么?我曾考虑使用
for
循环和一些
sleep
语句,但我很好奇是否有更简单或更有效的方法来实现这一点


谢谢。

使用Thread,这将每隔xmils在屏幕上绘制一个矩形。这将在运行5次后停止。编辑xMilSeconds表示较慢的运行,编辑j>4表示停止前的运行次数。但它确实冻结了,我无法修复

int i = 0;
private long xMilSeconds = 300;
private boolean paint;
public boolean running = true;

public void paint(Graphics g)
{
    super.paint(g);
    if(paint)
    {
        for(;i < i+1;)
        {
             g.drawRect(i+49,i+49,i+299,i+99);   
             g.setColor(Color.RED);  
             g.fillRect(i+49,i+49,i+299,i+99); 
        }
        paint = false;
    }
}

public void run()
{
    while(running)
    {
        try
        {
            Thread.sleep(xSeconds);
            paint = true;
            repaint();
            i++;
            j++;
            if(j > 4)
            {
                running = false;
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
}
inti=0;
专用长xMilSeconds=300;
私有布尔图;
公共布尔运行=true;
公共空间涂料(图g)
{
超级油漆(g);
如果(油漆)
{
对于(;i4)
{
运行=错误;
}
}
捕获(例外e)
{
e、 printStackTrace();
}
}
}

最简单的方法是使用

你可能还想通读一遍


因此,您可以理解为什么永远不要使用
,而(true){Thread.sleep(X)}
调用
Swing
(在EDT内部)

可能会有所帮助。Javadoc展示了示例用法。完成后,别忘了调用
shutdown
方法。

您签出了吗?使用循环和睡眠将冻结您的应用程序,因此永远不要这样做。感谢您的回复。有没有可能修改一下,比如说,5分钟后,我就停止执行这些操作了?可能的情况是,你需要抓取开始时间,并将其与当前时间进行比较,以确定你已经运行了多长时间,然后呼叫计时器。停止谢谢你的回复。这会调用Timer.stop进入
actionPerformed
的内部吗?是的,时间比较也是如此
Timer timer = new Timer(X, new ActionListener() {
    public void actionPerformed(ActionEvent evt) {
        // Update the variables you need...
        repaint();
    }
});

timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();