2016-11-06 18 views
0

我最近學會了如何使用計時器java類,並創建了一個程序,使用計時器倒計時,並使用標籤顯示此倒計時。我的問題是,程序倒數了2而不是1.程序倒數減2,而不是1,我看不到任何邏輯錯誤

package test; 

import java.awt.*; 
import java.awt.BorderLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.Timer; 
import static javax.swing.UIManager.get; 

public class Test extends JFrame implements ActionListener{ 

    //Declare Global Variable 
    int timerValGlobal = 25; 

    //Define components to add 
    JButton startTimer = new JButton("Start Timer"); 
    JButton exitButton = new JButton("Exit"); 
    JLabel time = new JLabel(); 
    Timer timer = new Timer(1000, this); 


    //Define panels 
    JPanel pane = new JPanel(); 
    JPanel exitPane = new JPanel(); 



    public Test(){ 
     setExtendedState(JFrame.MAXIMIZED_BOTH); 
     setUndecorated(true); 
     setVisible(true); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

     //Add buttons to panels 
     pane.add(startTimer); 
     pane.add(time); 
     exitPane.add(exitButton); 

     //Add panels to form; 
     add(pane, BorderLayout.NORTH); 
     add(exitPane, BorderLayout.SOUTH); 

     //Add ActionListeners to Buttons 
     startTimer.addActionListener(this); 
     exitButton.addActionListener(this); 
     timer.addActionListener(this); 


    } 



    public static void main(String[] args) { 
     Test t = new Test(); 
    } 


    public void actionPerformed(ActionEvent evt){ 
     Object source = evt.getSource(); 
     if(source == exitButton){ 
      System.exit(0); 
     } 

     else if(source == startTimer){ 
       timer.start(); 
     } 

     else if (source == timer){ 
      time.setText(String.valueOf(timerValGlobal)); 
      timerValGlobal = timerValGlobal - 1; 

      if(timerValGlobal == 0){ 
       timer.stop(); 
       timerValGlobal = 25; 
      } 
     } 
    } 
} 

回答

0

這當然很難注意! (至少對我來說:D)

當你創建定時器,你做到了,對吧?

Timer timer = new Timer(1000, this); 

爲什麼你在這段代碼中編寫單詞this?你說this應該用作定時器的一個動作監聽器,這樣每個秒,這個類中的一個方法將被調用。對?

現在,這是它出錯的地方。在構造函數中,您將this再次設置爲動作偵聽器!

public Test(){ 
    setExtendedState(JFrame.MAXIMIZED_BOTH); 
    setUndecorated(true); 
    setVisible(true); 
    setDefaultCloseOperation(EXIT_ON_CLOSE); 

    //Add buttons to panels 
    pane.add(startTimer); 
    pane.add(time); 
    exitPane.add(exitButton); 

    //Add panels to form; 
    add(pane, BorderLayout.NORTH); 
    add(exitPane, BorderLayout.SOUTH); 

    //Add ActionListeners to Buttons 
    startTimer.addActionListener(this); 
    exitButton.addActionListener(this); 
    // LOOK! THIS LINE! 
    // VVVVVVVVVVVVVVV 
    timer.addActionListener(this); 
} 

你甚至寫了評論,說下面的代碼塊用於動作偵聽器添加到按鈕

由於兩個相同的動作偵聽器,actionPerformed方法每秒調用兩次,因此輸出!

只需刪除添加第二個動作偵聽器的行!

側面說明,你應該這樣創建的事件隊列框架:

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      new Test(); 
     } 
    }); 
} 

還是這個,在Java 8:

public static void main(String[] args) { 
    EventQueue.invokeLater(Test::new); 
} 
+0

非常感謝。我仍然在接觸語言,像這樣的小事情是我生命中的禍根。這非常有幫助,謝謝。 –

相關問題