2010-04-12 70 views
3

我在點擊鼠標後啓動javax.swing.Timer時遇到了一些問題。我想在用戶點擊按鈕後啓動計時器來執行一些動畫,但它不起作用。Javax Swing Timer幫助

以下是代碼片段:

public class ShowMe extends JPanel{ 
    private javax.swing.Timer timer; 

    public ShowMe(){ 
    timer = new javax.swing.Timer(20, new MoveListener()); 
    }  

    // getters and setters here 

    private class MoveListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
    // some code here to perform the animation 
    } 
    } 
} 

這是一個包含一個按鈕,這樣,當用戶點擊該按鈕計時器開始開始動畫

public class Test{ 

// button declarations go here and registering listeners also here 

public void actionPerformed(ActionEvent e) { 
    if(e.getSource() == this.btnConnect){ 
     ShowMe vis = new ShowMe(); 
     vis.getTimer().start(); 
    } 
} 
} 

我希望類啓動計時器開始動畫,但它不起作用。

需要幫助如何使按鈕單擊後啓動計時器。

謝謝。

+1

這是不是工作意味着什麼。發生了什麼,你有什麼錯誤? – 2010-04-12 12:45:41

+0

感謝格式! – 2010-04-12 12:52:36

+2

你在哪裏添加ShowMe面板到你的GUI?在您的示例代碼中,您只需創建實例並啓動計時器。或者排除的「動畫」代碼添加/檢索需要顯示的內容? – Ash 2010-04-12 13:06:48

回答

1

您必須調用定時器的 start()方法來啓動它。

public ShowMe(){ 
    timer = new javax.swing.Timer(20, new MoveListener()); 
    timer.start(); 
    } 

編輯
我還沒有看到start()被稱爲在Test類...
下一步將一些記錄/打印添加到MouseListener的類來檢查它是否被調用或不

private class MoveListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
     System.out.println("MouseListener activated"); // TODO delete this line 
    // some code here to perform the animation 
    } 
    } 

如果它的運行(我找不到爲什麼不能在發佈代碼的任何原因),問題是水曲柳上面寫道: 您創建了一個分配給vis的新實例並啓動了它的Timer,但您尚未將該實例添加到任何可見容器中。
(也許你加入SHOWME的另一個實例在前面的代碼...)

+0

根據示例代碼,'start()'在創建ShowMe面板的動作偵聽器中被調用。 – Ash 2010-04-12 13:31:41

+0

@Ash - 謝謝,還沒有看到它...我認爲它不應該在那裏......但改變了我的答案。 – 2010-04-12 14:57:17

1

有些事情嘗試:

  1. 檢查您的面板是可見的,例如使背景顏色爲紅色。

  2. 檢查動畫是否正在更新。例如,如果您通過在paint()方法中繪製不同的幀來動畫,則需要在更新控制動畫的變量後調用您的定時器中的repaint()。或者,如果通過更改佈局屬性完成動畫(例如,移動組件),則需要調用validate()。

使用擺動計時器可以讓你開始,但它確實是裸露的基礎。還有一些庫avaialbe,這將讓你事半功倍走得更遠:

  1. animated transitions
  2. Trident animation library
1

我知道這個問題是有點老了,但我不認爲你有一個答案。

我相信問題是ShowMe類和它的Timer正在垃圾回收,因此不能做你認爲應該做的事。

一旦actionPerformed方法完成,您正在創建一個新的本地ShowMe變量,該變量超出了範圍。 Timer和它的ActionListener對於ShowMe類實例是本地的,所以當actionPerformed方法完成時,它們也可用於GC。

我不確定ShowMe類正在做什麼。它似乎是一個JPanel,所以我認爲它是你想要顯示的東西。聽起來像在你的Test類(或者真實的類)中,最好有一個ShowMe數據成員,你可以在點擊按鈕時調用start,而不是每次創建一個新成員。

1

您對Timer類的使用似乎是正確的。也許問題在於MoveListener。

您是否記得使用paintImmediately()方法重新繪製動畫?

如果您僅使用repaint(),您將看不到平滑的動畫,因爲重複調用repaint()會減少爲一個呼叫。