这个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);
}
}
答案 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)'