2013-10-25 4 views
0

Я попытался создать таймер в Java, который отображается в окне JFrame, но мне не повезло!java timer not incrementing

Таймер всегда остается на 0. Оценил если кто-нибудь может увидеть, где я неправильно :(

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 

class Globals 
{ 
    public static int seconds = 0; 
} 

class main 
{ 
    public static void main(String Args[]) 
    { 

     JFrame testing = new JFrame(); 
     testing.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     testing.setSize(1000,1000); 
     testing.setVisible(true); 

     Countdown timer = new Countdown(); 
     Timer countdown = new Timer(5000, timer); 
     countdown.start(); 

     JLabel firstline = new JLabel(); 
     firstline.setText("Time is:" + Globals.seconds); 
     testing.add(firstline); 

    } 
} 

class Countdown implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
    Globals.seconds++; 

    } 
} 

ответ

2

Вы можете установить текст в JLabel здесь:

JLabel firstline = new JLabel(); 
firstline.setText("Time is:" + Globals.seconds); 

Но когда установлено, что это все , вы никогда не меняете его.

Все, что делает таймер, это изменение состояния переменной. Оно ничего не делает для графического интерфейса, например, указывает JLabel на использование нового значения. Пожалуйста, поймите, что JLabel не собирающийся волшебно отслеживать любую переменную, используемую для создания своей строки текста. Все, что он знает, это то, что он был установлен с неизменяемой строкой, и все.

Ваш таймер должен вместо этого позвонить setText(...) в JLabel, чтобы обновить его текст или, лучше, использовать ссылку на класс, содержащий JLabel, и вызвать общедоступный метод этого класса для изменения состояния JLabel.

Например:

import java.awt.Dimension; 
import java.awt.event.*; 
import javax.swing.*; 

public class TimerTest { 
    private static final int TIMER_DELAY = 20; 

    private static void createAndShowGui() { 
     MyGui myGui = new MyGui(); 
     TimerListener timerListener = new TimerListener(myGui, 2 * 60 * 1000); 
     new Timer(TIMER_DELAY, timerListener).start(); 
     JFrame frame = new JFrame("TimerTest"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().add(myGui.getMainComponent()); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGui(); 
     } 
     }); 
    } 
} 

class MyGui { 
    private static final int PREF_W = 200; 
    private static final int PREF_H = 80; 
    private JPanel mainPanel = new JPanel() { 
     public Dimension getPreferredSize() { 
     return MyGui.this.getPreferredSize(); 
     }; 
    }; 
    private JLabel statusLabel = new JLabel(); 

    public MyGui() { 
     mainPanel.add(statusLabel); 
    } 

    public Dimension getPreferredSize() { 
     return new Dimension(PREF_W, PREF_H); 
    } 

    public JComponent getMainComponent() { 
     return mainPanel; 
    } 

    public void setStatus(String text) { 
     statusLabel.setText(text); 
    } 
} 

class TimerListener implements ActionListener { 
    private static final String FORMAT = "Count Down: %02d:%02d:%03d"; 
    private static final int MS_PER_SEC = 1000; 
    private static final int SEC_PER_MIN = 60; 
    private MyGui myGui; 
    private long countDownTime; 
    private long startTime; 

    public TimerListener(MyGui myGui, long countDownTime) { 
     this.myGui = myGui; 
     this.countDownTime = countDownTime; 
     startTime = System.currentTimeMillis(); 
    } 

    @Override 
    public void actionPerformed(ActionEvent evt) { 
     long currentTime = System.currentTimeMillis(); 
     long deltaTime = countDownTime - (currentTime - startTime); 
     if (deltaTime < 0) { 
     ((Timer) evt.getSource()).stop(); 
     deltaTime = 0; 
     } 
     int minutes = (int) (deltaTime/(MS_PER_SEC * SEC_PER_MIN)); 
     deltaTime = deltaTime % (MS_PER_SEC * SEC_PER_MIN); 
     int seconds = (int) (deltaTime/MS_PER_SEC); 
     deltaTime = deltaTime % MS_PER_SEC; 
     int msecs = (int) deltaTime; 
     String text = String.format(FORMAT, minutes, seconds, msecs); 
     myGui.setStatus(text); 
    } 
} 
2

запускает таймер, ожидая в течение 5 секунд.

В течение этого 5 секунд, он работает этот код:

JLabel firstline = new JLabel(); 
firstline.setText("Time is:" + Globals.seconds); 
testing.add(firstline); 

Затем он увеличивает свою ценность.

Поскольку вышеуказанный код не находится в цикле или что-то еще, он никогда не запускает его снова.

Возможно попробовать поставить JLabel обновления в самом таймере:

class Countdown implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     Globals.seconds++; 
     main.firstline.setText("Time is:" + Globals.seconds); 
    } 
} 

Очевидно, что вам нужно иметь доступ к JLabel здесь, я оставлю выясняя, что к вам.