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

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);
  }
}

最佳答案

您没有无限循环,而是无限递归(尽管速度较慢)。不要在这里递归-不要在Timer的actionPerformed中创建新的Morning。而是只需输入使乌鸦声音听到的方法即可。

下次,请把您的代码放在帖子本身中(就像我为您所做的那样)。不要让我们去其他站点,因为如果您需要免费帮助,则想让其他人尽可能轻松地为您提供帮助。

编辑
您还会遮蔽rooster变量,将其声明两次,一次将其声明为null,一次在构造函数中将其声明为非null。不要重新声明它,这样您就可以初始化class字段而不是本地字段。

更改此:

  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();

10-06 15:56