2012-06-15 2 views
5

Я начинающий Java, и я пытаюсь создать простую программу секундомера, которая отображает время на графическом интерфейсе swing. Сделать секундомер легко, однако я не могу найти способ сделать обновление GUI каждую секунду и отобразить текущее время на секундомере. Как я могу это сделать?Java Секундомер, который обновляет графический интерфейс каждую секунду?

+10

Используйте класс '' Таймера' Swing'. Более подробно о способе использования «Таймера» доступно, например, [в вопросе и, в частности, ответы на него.] (Http://stackoverflow.com/q/11053097/613495) – Boro

+3

См. Также [ответ] (http://stackoverflow.com/a/5529043/230513). – trashgod

+0

Да, я знаю, что у меня это было где-то [один из моих ответов, связанных с использованием таймера] (http://stackoverflow.com/a/5911514/613495). @trashgod очень хороший ответ/образец +1 здесь и +1 там ... и я вне голосов ... на сегодня :) – Boro

ответ

6

Что-то вдоль этих линий должны сделать это:

import java.awt.EventQueue; 
import java.util.Timer; 
import java.util.TimerTask; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

/** @see https://stackoverflow.com/a/11058263/230513 */ 
public class Clock { 

    private Timer timer = new Timer(); 
    private JLabel timeLabel = new JLabel(" ", JLabel.CENTER); 

    public Clock() { 
     JFrame f = new JFrame("Seconds"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(timeLabel); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
     timer.schedule(new UpdateUITask(), 0, 1000); 
    } 

    private class UpdateUITask extends TimerTask { 

     int nSeconds = 0; 

     @Override 
     public void run() { 
      EventQueue.invokeLater(new Runnable() { 

       @Override 
       public void run() { 
        timeLabel.setText(String.valueOf(nSeconds++)); 
       } 
      }); 
     } 
    } 

    public static void main(String args[]) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       final Clock clock = new Clock(); 
      } 
     }); 
    } 
} 

timeLabel всегда будет отображать количество секунд, таймер работает.

  1. Вам необходимо будет правильно отформатировать его для отображения «hh: mm: ss»; один подход показан here.

  2. Создайте контейнер и добавьте в него ярлык, чтобы вы могли отображать его как часть графического интерфейса.

  3. Сравните результат alternate используя javax.swing.Timer.

+0

Я сделал графический интерфейс с помощью визуального редактора из netbeans, как я могу ссылаться на jlabel внутри GUI? – Dangerosking

+0

@trashgod, в какой части требуется invokeLater? – GETah

+0

@GETah 'run()' метод 'UpdateUITask', так как java.util.Timer будет запускать его с EDT. – millimoose