2015-10-07 85 views
0

在這個程序中,我們應該點擊一個表示「開始」的按鈕,然後動畫將在屏幕上開始運行。點擊「開始」後,該按鈕將變爲「暫停」按鈕,如果您點擊該按鈕,則會停止動畫,並出現「恢復」按鈕。我不知道如何將所有這三個操作都放到一個按鈕中。這裏是我到目前爲止的代碼:JButton中的多個操作

JButton button = new JButton("Start"); 
     button.addActionListener(new 
     ActionListener() 
     { 
      public void actionPerformed(ActionEvent e) 
      { 
       Timer t = new Timer(100, new 
        ActionListener() 
        { 
         public void actionPerformed(ActionEvent event) 
         { 
          shape.translate(x, y); 
          label.repaint(); 
         } 
        }); 
       t.start(); 
      } 
     }); 

我知道這是不對的。當我運行該程序時,動畫處於空閒狀態,直到我點擊「開始」,這是正確的,但每當我再次點擊該按鈕時,動畫加速就不正確。我如何着手爲按鈕添加不同的操作?

例如,在動畫運行後,我希望「暫停」按鈕在單擊時停止定時器,然後在點擊「恢復」時恢復定時器。我現在的代碼每次點擊它時都會創建一個新的Timer對象,但這似乎是我得到它的唯一方法。如果我在ActionListener之外放置任何東西,我會遇到範圍錯誤。有什麼建議麼?

回答

1

我知道這是不對的。當我運行該程序時,動畫處於空閒狀態,直到我點擊「開始」,這是正確的,但每當我再次點擊該按鈕時,動畫加速就不正確。

這是因爲您每次按下按鈕時都會創建多個新的Timer。您應該有一個單一的參考Timer並根據它的當前狀態作出決定如何處理

//... 
private Timer timer; 
//... 

JButton button = new JButton("Start"); 
button.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     if (timer == null) { 
      timer = new Timer(100, new ActionListener() { 
       public void actionPerformed(ActionEvent event) { 
        shape.translate(x, y); 
        label.repaint(); 
       } 
      }); 
      timer.start(); 
      button.setText("Pause"); 
     } else if (timer.isRunning()) { 
      timer.stop(); 
      button.setText("Resume"); 
     } else { 
      timer.start(); 
      button.setText("Pause"); 
     } 
    } 
}); 
+0

非常感謝!這固定了它。我知道我每次創建一個新的Timer都不是我想要的。我從來沒有想過把計時器放在我的私人實例變量中。 – GenericUser01

1

但隨後每當我再次點擊該按鈕時,動畫加速都不正確。

不要在ActionListener中繼續創建Timer。每次點擊按鈕,你都會啓動一個新的定時器。

請在您的類的構造函數中創建Timer。然後在ActionListener你只需start()現有的Timer

Then Pause and'Resume buttons will also just invoke the stop()and restart()`方法也存在於現有的Timer中。

+0

這是一個問題。我試過這樣做,但我得到了「不能引用在封閉範圍內定義的非局部變量」我可以得到這個工作的唯一方法是將Timer的構造函數放在'ActionListener'中。 – GenericUser01

+0

@ GenericUser01對於示例代碼來說,沒有足夠的上下文來提供完整的解決方案,除了說,嘗試使Timer類成爲類的實例字段 – MadProgrammer

+1

要做到這一點的方法是重構代碼,以便將Timer定義爲類中的實例變量。 – camickr