我怎么弄乱我的Java计时器?

时间:2011-10-18 12:27:56

标签: java timer

这个Morning Class应该创建一个new Morning,并且在每只公鸡的开头会有一只公鸡。我的公鸡会啼叫一次,等待五秒钟,然后再次啼叫。然后5秒钟后它会碾压两次,之后就会不停地啼叫。我能做什么才能做到这一点?我只想要它crow every 5 seconds。如果我在ActionPerformed中放置timer.restart(),它什么都不做。有人可以指出或给我一个提示我做错了什么?任何帮助将不胜感激。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.Timer;

public class Morning extends JFrame
    implements ActionListener
{
  private EasySound rooster;
  public Timer timer;

  public Morning()
  {
    super("Morning");

    EasySound rooster = new EasySound("roost.wav");
    rooster.play();

    timer = new Timer(5000, this);
    timer.start();

    Container c = getContentPane();
    c.setBackground(Color.WHITE);
    //page 35
  }

  public void actionPerformed(ActionEvent e)
  {
    Morning morning = new Morning();
  }


  public static void main(String[] args)
  {
    Morning morning = new Morning();
    morning.setSize(300, 150);
    morning.setDefaultCloseOperation(EXIT_ON_CLOSE);
    morning.setVisible(true);
  }
}

3 个答案:

答案 0 :(得分:2)

你没有无限循环,而是无限递归(尽管速度较慢)。不要在这里递归 - 不要在你的计时器的动作中创建一个新的早晨。而只是放入方法使乌鸦听到声音。

下次,请将您的代码放在帖子中(就像我为您所做的那样)。不要让我们去其他网站,因为如果你要求免费帮助,你想让其他人尽可能地帮助你。

修改
您还要将公鸡变量视为两次声明,一次是int类,它是null,一次是在构造函数中,它不是null。不要重新声明它,以便初始化类字段而不是本地字段。

改变这个:

  public Morning()
  {
    super("Morning");

    EasySound rooster = new EasySound("roost.wav"); // this creates a *local* variable only
    rooster.play();

到此:

  public Morning()
  {
    super("Morning");

    // EasySound rooster = new EasySound("roost.wav");
    rooster = new EasySound("roost.wav");
    rooster.play();

答案 1 :(得分:1)

在我看来,你有一个无限循环。您创建一个新的早晨,启动计时器。当计时器关闭时,你创建一个新的早晨,开始时间等等等。似乎你应该只使用一个Morning对象来跟踪它拥挤的次数。

我建议设置Timer重复,在actionPerformed crow中根据它拥挤的次数适当的次数,并在你永远打鸣时停止计时器。然而,这假设你想要在乌鸦开始之间恰好5秒。如果在乌鸦末尾和下一个开始之间需要5秒钟,请不要重复,但在完成击球后重新开始。

答案 2 :(得分:0)

不是每次计时器触发时都实例化Morning类,而是将rooster.play()放到它上面(也不要忘记让公鸡成为一个类字段而不是局部变量)。在构造函数中,还要确保调用'timer.setRepeats(true)'