2014-08-31 83 views
1

我在我的程序中遇到問題。我想在1秒內得到一個等於1000的實時毫秒。這是我的代碼:Java Swing.Timer獲得實時毫秒

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

import javax.swing.Timer; 

class lsen implements ActionListener{ 
    int ms = 0; 
    int s = 0; 
    int m = 0; 

    public void actionPerformed(ActionEvent e){ 
     this.ms++; 

     if(this.ms == 500){ 
      this.s++; 
      this.ms = 0; 
     } 
     if(this.s == 60){ 
      this.m++; 
      this.s = 0; 
     } 
    } 

    public int getMS(){ 
     return this.ms; 
    } 
    public int getSS(){ 
     return this.s; 
    } 
    public int getMM(){ 
     return this.m; 
    } 
} 

public class stopwatch_main{ 
    public static void main(String[] args) { 
     lsen l = new lsen(); 
     Timer t = new Timer(0,l); 
     t. start(); 
     while(true){ 
      System.out.println(l.getMM()+":"+l.getSS()+":"+l.getMS()); 
     } 
    } 
} 

是否有任何其他方式獲得毫秒而不是聲明一個整數並遞增?

+2

如果我正確理解了你,你的意圖是讓'actionPerformed'方法每秒被調用1000次,也就是每毫秒。這幾乎是不可能的。你可能會用自己的線程來接近它,並忙於等待*,但即使這樣也很難。 (這裏的「忙碌的等待」確實指的是一個無限制的while(true)循環 - 這與Java中最接近的「實時」相關,但你幾乎不必這樣做......) – Marco13 2014-08-31 14:27:06

回答

3
  1. 你會想擺脫while (true)的,而是使用Swing定時器在它的地方,因爲這是該定時器是什麼 - 反覆做一個Swing GUI的調用,而不必求助於線程破解while (true)構造。
  2. 你會想給你的計時器一個合理的延遲時間。 0?常識告訴你不要使用這個。 12,15 - 更好。
  3. 要使Swing Timer正常工作,您需要有一個活動的Swing事件線程,並且可以通過顯示Swing GUI以及任何GUI(如JOptionPane)來獲取此線程。

例如:

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

import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 
import javax.swing.Timer; 

class Lsen implements ActionListener { 
    public static final int MSECS_PER_SEC = 1000; 
    public static final int SECS_PER_MIN = 60; 
    public static final int MIN_PER_HR = 60; 
    private static final String TIME_FORMAT = "%02d:%02d:%02d:%03d"; 

    private long startTime; 
    private JTextField timeField; 

    public Lsen(JTextField timeField) { 
     this.timeField = timeField; 
    } 

    public void actionPerformed(ActionEvent e) { 
     if (startTime == 0L) { 
     startTime = System.currentTimeMillis(); 
     } else { 
     long currentTime = System.currentTimeMillis(); 
     int diffTime = (int) (currentTime - startTime); 

     int mSecs = diffTime % MSECS_PER_SEC; 
     diffTime /= MSECS_PER_SEC; 

     int sec = diffTime % SECS_PER_MIN; 
     diffTime /= SECS_PER_MIN; 

     int min = diffTime % MIN_PER_HR; 
     diffTime /= MIN_PER_HR; 

     int hours = diffTime; 

     String time = String.format(TIME_FORMAT, hours, min, sec, mSecs); 
     // System.out.println("Time: " + time); 
     timeField.setText(time); 
     } 
    } 
} 

public class StopWatchMain { 
    private static final int TIMER_DELAY = 15; 

    public static void main(String[] args) { 
     final JTextField timeField = new JTextField(10); 
     timeField.setEditable(false); 
     timeField.setFocusable(false); 
     JPanel panel = new JPanel(); 
     panel.add(new JLabel("Elapsed Time:")); 
     panel.add(timeField); 

     Lsen l = new Lsen(timeField); 
     Timer t = new Timer(TIMER_DELAY, l); 
     t.start(); 
     JOptionPane.showMessageDialog(null, panel); 
     t.stop(); 
    } 
} 

編輯
你問長數據類型的含義。請看看這裏:Primitive Data Types。你會看到長整型意味着長整型,所以你可以認爲它和int類似,但是能夠容忍更大的正值和負值而不會溢出。

+0

謝謝!這是非常有用的,我會稍後分析代碼:) – 2014-08-31 15:17:43

+0

difftime的用法是什麼?我無法理解長期的計算。我可以要求提供有關長數據類型的任何參考嗎?它對我來說非常新穎 – 2014-08-31 15:26:40

+0

@AdrianManuelCleofe:請參閱編輯以回答問題以及它包含的鏈接。 – 2014-08-31 15:29:47