2014-08-31 7 views
1

У меня проблема в моей программе. Я хочу получить миллисекунду в реальном времени, равную 1000 за 1 секунду. Вот мой код: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

ответ

3
  1. Вы хотите, чтобы избавиться от этого while (true) и вместо того, чтобы использовать Свинг таймер на своем месте, так это то, что таймер для - повторно делать вызовы в GUI свинг без необходимости прибегать к нить-разрушение while (true) конструкция.
  2. Вы захотите дать вашему таймеру разумное время задержки. 0? Здравый смысл подсказывает вам не использовать это. 12, 15 - лучше.
  3. Для работы таймера Swing необходимо иметь активный поток событий Swing, и это можно получить, показывая графический интерфейс Swing, любой графический интерфейс пользователя, такой как 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. Вы увидите, что long long long integer, и поэтому вы можете думать, что он похож на int, но способен терпеть гораздо большие положительные и отрицательные значения без переполнения.

+0

спасибо ! это так полезно, я буду анализировать код позже :) –

+0

Какая польза от difftime? и я не могу понять вычисления долго. могу ли я попросить любую ссылку относительно длинного типа данных? это очень ново для меня –

+0

@AdrianManuelCleofe: см. править для ответа и содержащуюся в нем ссылку. –