[英]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實例...)
我知道這個問題有點老了,但我不認為你有答案。
我認為問題是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.