我有一毫秒我转换它hh:mm:ss现在我想让它自动减少超时值..像倒数计时器
例如,当用户看到它时,2:11 0 - > 2:10 59 - > 2:10 58 ......
以下是我的代码..
Timer t = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent e) {
int s = ((TIMER/1000) % 60);
int m = (((TIMER/1000) / 60) % 60);
int h = ((((TIMER/1000) / 60) /60) % 60);
timing.setText(hour + " hours, " + min + " minutes" + sec + " seconds");
timing.repaint();
}
}
t.start();
有可能吗?
答案 0 :(得分:1)
final Timer t = new Timer(1000, new ActionListener() {
private long time = 10 * 1000; //10 seconds, for example
public void actionPerformed(ActionEvent e) {
if (time >= 0) {
long s = ((time / 1000) % 60);
long m = (((time / 1000) / 60) % 60);
long h = ((((time / 1000) / 60) / 60) % 60);
timing.setText(h + " hours, " + m + " minutes " + s + " seconds");
time -= 1000;
}
}
});
t.start();
答案 1 :(得分:1)
正如彼得在他的回答中提到的那样,你不应该继续减少一个数字,因为没有保证每秒都会调用actionPerformed
。下面是一个工作示例,它在完成时停止计时器(详细和相应的代码):
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Test extends JFrame {
private JTextField text;
private Timer timer;
private JButton start;
public Test() {
super("Countdown timer");
text = new JTextField("2", 8);
start = new JButton("Start");
start.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent click) {
final long current = System.currentTimeMillis();
try {
final long limit = Integer.parseInt(text.getText().trim())* 1000; // X seconds
timer = new Timer(1000, new ActionListener() {
public void actionPerformed(ActionEvent event) {
long time = System.currentTimeMillis();
long passed = time - current;
long remaining = limit - passed;
if(remaining <= 0) {
text.setText("2");
timer.stop();
} else {
long seconds = remaining/1000;
long minutes = seconds/60;
long hours = minutes/60;
text.setText(String.format("%02d:%02d:%02d", hours, minutes, seconds%60));
}
}
});
timer.start();
} catch(NumberFormatException nfe) {
// debug/report here
nfe.printStackTrace();
}
}});
JPanel panel = new JPanel();
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.add(text);
panel.add(new JLabel(" seconds"));
panel.add(start);
add(panel);
}
public static void main(String [] args) throws Exception {
Test frame = new Test();
frame.setDefaultCloseOperation(Test.EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
}
答案 2 :(得分:0)
TIMER值永远不会被timer事件递减。因此,每1000毫秒始终会显示相同的时间。
编辑:假设“计时”是一个Swing组件,则不需要重新调用。
答案 3 :(得分:0)
更安全的选择是采用实际的时钟时间。这样做的原因是你的应用程序可以停止使用pewriods。 esp如果您的机器很忙。这意味着倒数计时器可能不会像您期望的那样经常被调用。如果使用System.currentTimeMillis(),无论发生什么情况,时间总是正确的。