簡體   English   中英

Javax Swing Timer幫助

[英]Javax Swing Timer Help

我在點擊鼠標后啟動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();
  }
 }
}

我想啟動計時器來開始動畫,但它無法正常工作。

需要幫助如何在按鈕點擊后啟動計時器。

謝謝。

您必須調用計時器的 start()方法才能啟動它。

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

編輯
我還沒有看到在Test類中調用start() ...
下一步是向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
    }
  }

如果它正在運行(我找不到任何原因,為什么不在發布的代碼中),問題就像Ash上面寫的:你創建了一個分配給vis的新實例並啟動了它的Timer,但是你還沒有將該實例添加到任何可見的容器。
(也許您之前在代碼中添加了另一個ShowMe實例...)

有些事要嘗試:

  1. 檢查面板是否可見,例如使背景顏色變為紅色。

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

使用搖擺計時器可以讓你入門,但它確實是裸露的基礎。 還有一些庫avaialbe可以讓您更省力:

  1. 動畫過渡
  2. 三叉戟動畫庫

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

我認為問題是ShowMe類及其Timer正在被垃圾收集,因此無法按照您的想法進行操作。

您正在創建一個新的本地ShowMe變量,該變量在actionPerformed方法完成后立即超出范圍。 Timer及其ActionListener是ShowMe類實例的本地,因此當actionPerformed方法完成時,它們也可用於GC。

我不確定ShowMe課程在做什么。 它似乎是一個JPanel,所以我認為它是你想要顯示的東西。 這聽起來像在你的Test類(或真正的類)中,擁有一個ShowMe數據成員可能會更好,你可以在單擊按鈕時調用start成員,而不是每次都創建一個新成員。

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

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

如果你只使用repaint()你將看不到平滑的動畫,因為重復調用repaint()會減少為一次調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM