2015-05-26 4 views
0

Я хочу создать секундомер, который начинается через 5 секунд. Без таймера он работает отлично, но когда я помещаю метод startStopwatch() в класс Task, который отвечает за выполнение задач по прошествии времени, я получаю сообщение об ошибке. Я был бы рад за любое объяснение того, что я делаю неправильно, или если есть лучший способ сделать это. Вот мой код.секундомер Java с таймером

import java.lang.reflect.InvocationTargetException; 
import java.util.Timer; 
import java.util.TimerTask; 
import javax.swing.SwingUtilities; 


public class Stopwatch extends javax.swing.JFrame implements Runnable{ 

private javax.swing.JLabel Display; 
private javax.swing.JButton StartButton; 
private javax.swing.JButton StopButton; 

private final static java.text.SimpleDateFormat timerFormat = new java.text.SimpleDateFormat("mm : ss.SSS"); 
private long elapsed; 
private long startTime; 
private Thread updater; 
private boolean isRunning= false; 
private Timer timer; 

public Stopwatch() { 
    initComponents(); 
} 

private void initComponents() { 

    Display = new javax.swing.JLabel(); 
    StartButton = new javax.swing.JButton(); 
    StopButton = new javax.swing.JButton(); 

    setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

    Display.setText("00 : 00.000"); 

    StartButton.setText("Start"); 
    StartButton.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      StartButtonActionPerformed(evt); 
     } 
    }); 

    StopButton.setText("Stop"); 
    StopButton.addActionListener(new java.awt.event.ActionListener() { 
     public void actionPerformed(java.awt.event.ActionEvent evt) { 
      StopButtonActionPerformed(evt); 
     } 
    }); 

    javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
    getContentPane().setLayout(layout); 
    layout.setHorizontalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(131, 131, 131) 
        .addComponent(StartButton) 
        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
        .addComponent(StopButton)) 
       .addGroup(layout.createSequentialGroup() 
        .addGap(165, 165, 165) 
        .addComponent(Display))) 
      .addContainerGap(147, Short.MAX_VALUE)) 
    ); 
    layout.setVerticalGroup(
     layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
     .addGroup(layout.createSequentialGroup() 
      .addGap(124, 124, 124) 
      .addComponent(Display) 
      .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
      .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
       .addComponent(StartButton) 
       .addComponent(StopButton)) 
      .addContainerGap(133, Short.MAX_VALUE)) 
    ); 

    pack(); 
    setLocationRelativeTo(null); 
}      

private void StopButtonActionPerformed(java.awt.event.ActionEvent evt) {           
    stopStopwatch(); 
}           

private void StartButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    //startStopwatch(); 
    new Stopwatch(5); 
}           

public static void main(String args[]) { 

    java.awt.EventQueue.invokeLater(new Runnable() { 
     public void run() { 
      new Stopwatch().setVisible(true); 
     } 
    }); 
} 

//STOPWATCH 
@Override 
public void run() { 
    try{ 
     while(isRunning){ 
      SwingUtilities.invokeAndWait(displayUpdater); 
      Thread.sleep(10); 
     } 
    }catch(InterruptedException e){ 
     e.printStackTrace(); 
    } catch (InvocationTargetException ex) { 
     ex.printStackTrace(); 
    } 
} 

private final Runnable displayUpdater= new Runnable() { 
    public void run(){ 
     displayElapsedTime(System.currentTimeMillis() - Stopwatch.this.startTime); 
    } 
}; 

private void displayElapsedTime (long elapsedTime1){ 
    Display.setText(timerFormat.format(new java.util.Date(elapsedTime1))); 
} 
public void startStopwatch(){ 
    System.out.println("2:Start stopwatch."); 
    startTime= System.currentTimeMillis(); 
    isRunning = true; 
    updater = new Thread(this); 
    updater.start(); 
} 
private void stopStopwatch(){ 
    System.out.println("3:Stop stopwatch."); 
    elapsed = System.currentTimeMillis() - startTime; 
    isRunning= false; 
    try{ 
     updater.join(); 
    }catch(InterruptedException ie){ 
     ie.printStackTrace(); 
    } 
    displayElapsedTime(elapsed); 
} 

//TIMER 
public Stopwatch(int seconds){ 
    timer = new Timer(); 
    timer.schedule(new Task(), seconds * 1000); 
} 

class Task extends TimerTask{ 
    @Override 
    public void run() { 
     System.out.println("1:Timer has finished."); 
     timer.cancel(); 
     startStopwatch(); 
    } 
} 

}

Вот ошибка

java.lang.reflect.InvocationTargetException 
at java.awt.EventQueue.invokeAndWait(Unknown Source) 
at java.awt.EventQueue.invokeAndWait(Unknown Source) 
at javax.swing.SwingUtilities.invokeAndWait(Unknown Source) 
at test.Stopwatch.run(Stopwatch.java:105) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.NullPointerException 
at test.Stopwatch.displayElapsedTime(Stopwatch.java:122) 
at test.Stopwatch.access$1(Stopwatch.java:121) 
at test.Stopwatch$1.run(Stopwatch.java:117) 
at java.awt.event.InvocationEvent.dispatch(Unknown Source) 
at java.awt.EventQueue.dispatchEventImpl(Unknown Source) 
at java.awt.EventQueue.access$500(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.awt.EventQueue$3.run(Unknown Source) 
at java.security.AccessController.doPrivileged(Native Method) 
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source) 
at java.awt.EventQueue.dispatchEvent(Unknown Source) 
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source) 
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.pumpEvents(Unknown Source) 
at java.awt.EventDispatchThread.run(Unknown Source) 
+0

Какая ваша ошибка? – Juru

+3

Какая ошибка вы получаете. Пожалуйста, опубликуйте его, чтобы мы могли помочь вам. –

+0

Чтение разума http://sscce.org/? – steffen

ответ

0

Отображаемый элемент пуст, когда вы используете конструктор Секундомер для таймера. По какой-то причине вы создаете новый секундомер и не инициализируете его. Таким образом, элемент Display, который вы хотите изменить, имеет значение null.

//TIMER 
public StopWatch(int seconds) { 
    timer = new Timer(); 
    timer.schedule(new Task(), seconds * 1000); 
} 

Конструктор должен содержать initComponents(), чтобы исключить исключение nullpointer. Но я не уверен, что он будет функционально делать то, что вы хотите.

//TIMER 
public StopWatch(int seconds) { 
    initComponents(); 
    timer = new Timer(); 
    timer.schedule(new Task(), seconds * 1000); 
} 

В результате этого вы увидите, что больше не увидите ошибки. Но на исходном экране ничего не произойдет. Если вы хотите увидеть, что происходит, вам нужно сделать его видимым. Так должно выглядеть так.

//TIMER 
public StopWatch(int seconds) { 
    initComponents(); 
    setVisible(true); 
    timer = new Timer(); 
    timer.schedule(new Task(), seconds * 1000); 
} 

Это делает новое окно видимым, поэтому отдельный секундомер. Что может быть или не быть тем, что вы хотите?

0

В стеке отображается, что в методе displayElapsedTime отображается исключение NullPointerException. Это метод с одной строкой, поэтому не так сложно найти проблему. Добавьте отладочную печать Display и timerFormat. Один из них не был инициирован должным образом

Смежные вопросы