[英]java timer not incrementing
我試圖用Java創建一個計時器,該計時器顯示在JFrame窗口中,但是我沒有運氣!
計時器始終保持為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++;
}
}
您可以在此處設置JLabel的文本:
JLabel firstline = new JLabel();
firstline.setText("Time is:" + Globals.seconds);
但是一旦設置成功,就永遠不會改變它。
計時器所做的只是更改變量的狀態。 它對GUI無任何作用,例如告訴JLabel使用新值。 請理解,JLabel不會神奇地跟蹤用於創建其文本String的任何變量。 它所知道的就是它已經設置了一個不可變的String,僅此而已。
相反,您的Timer應該在JLabel上調用setText(...)
來更新其文本,或者更好地,使用對持有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);
}
}
計時器啟動,等待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
,我將為您解決這個問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.