2011-10-18 19 views
0

Morning Class應該創建一個new Morning,並在每個公雞的開始將烏鴉。我的公雞會烏鴉一次,等待五秒鐘,再次烏鴉。然後5秒鐘後,烏鴉烏鴉兩次,然後烏鴉不停。我能做些什麼才能做到這一點?我只是想要它crow every 5 seconds。如果我將一個timer.restart()置於ActionPerformed中,它什麼也不做。有人可以指出或給我一個小費,我做錯了什麼?任何幫助將非常感激。我該如何搞定我的Java計時器?

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

回答

1

在我看來,你有一個無限循環。您創建一個新的早晨,啓動計時器。當計時器關閉時,你創建一個新的早晨,開始時間,等等,等等。似乎你應該只用一個Morning對象來記錄它已經擁有多少次。

我建議設置定時器重複,在actionPerformed烏鴉中根據它擁有的次數重複適當的次數,並在永久擁抱時停止定時器。然而,這個假設你想要在烏鴉開始之間準確的5秒鐘。如果在烏鴉結束和下一個烏鴉開始之間需要5秒鐘,請不要重複,但在完成烏鴉鳴叫後重新開始。

+0

我認爲我應該有一個無限循環,每5秒鐘創建一個新的早晨並且雞叫。我不明白的是爲什麼它會一次,一次,兩次,然後不間斷。如果我把Rooster.play放在Action Performed中,它將會出現一次,然後我在線程「AWT-EventQueue-0」中得到異常java.lang.NullPointerException at Morning.actionPerformed(Morning.java:29) – cutrightjm

+0

首先,如果你做一個無限循環,因爲你顯示你有機會得到一個內存不足的錯誤,因爲你正在創建無限數量的Mornings。在無限循環中播放聲音和創建無限數量的對象之間有所不同。 –

+1

@ekaj:你在遮蔽公雞變量。請參閱編輯我的答案。 –

2

您沒有無限循環,而是無限遞歸(雖然速度很慢)。不要在這裏遞減 - 不要在定時器的actionPerformed中創建新的Morning。相反,只需放入讓烏鴉聽到的聲音。

下一次,請將您的代碼放入您的文章中(正如我爲您所做的那樣)。不要讓我們去其他網站,因爲如果你要求免費的幫助,你想讓別人儘可能簡單地幫助你。

編輯
你也遮蔽公雞變量聲明它兩次,一次詮釋,他的類,這是空,一旦這不是空的構造函數。不要重新聲明它,所以你初始化類字段不是本地字段。

更改此:

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

而不是每次都實例化的上午班定時器觸發,把rooster.play()它(也不要忘了讓公雞一個類字段而不是局部變量)。在構造函數中,還要確保調用'timer.setRepeats(true)'