我不知道停止时如何显示计时器
I don't know how to display timer when stopped
你们都好吗?我的代码有点问题。当我停止我的计时器程序时,它会说 "Done!" 因为我将它设置为 "Done",但我想显示剩余时间而不是 "Done"。例如,如果我的原始时间设置为 4000 秒,我在 3000 秒处停止,我想在停止时显示当前时间 3000 而不是单词 "Done"。你们能帮帮我吗?我真的很感激。
这是我的代码:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class CountdownTimer extends JFrame {
JLabel promptLabel, timerLabel;
int counter;
JLabel tf;
JButton button;
Timer timer;
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new CountdownTimer();
}
});
}
public CountdownTimer() {
JFrame lt = new JFrame();
lt.getContentPane().setBackground(new Color(0, 102, 153));
lt.setBounds(100, 100, 450, 300);
lt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
lt.getContentPane().setLayout(null);
lt.setVisible(true);
promptLabel = new JLabel("Time: ", SwingConstants.CENTER);
promptLabel.setFont(new Font("Modern No. 20", Font.BOLD, 17));
promptLabel.setBounds(21, 30, 210, 30);
lt.add(promptLabel);
tf = new JLabel("4000");
tf.setBounds(160, 36, 40, 20);
lt.add(tf);
button = new JButton("Start");
button.setFont(new Font("Modern No. 20", Font.BOLD, 11));
button.setBounds(299, 37, 89, 23);
lt.add(button);
JButton btnLogout = new JButton("LOGOUT");
btnLogout.setBackground(new Color(112, 128, 144));
btnLogout.setFont(new Font("Trajan Pro", Font.BOLD, 17));
btnLogout.setBounds(149, 189, 121, 36);
btnLogout.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String sbutt = e.getActionCommand();
if(sbutt.equals("LOGOUT")) {
long current = counter;
long elapsed = current - counter;
timer.stop();
timerLabel.setText("Done!");
Toolkit.getDefaultToolkit().beep();
tf.setText(String.valueOf(elapsed));
}
}
});
lt.getContentPane().add(btnLogout);
timerLabel = new JLabel("Waiting...", SwingConstants.CENTER);
timerLabel.setFont(new Font("Modern No. 20", Font.BOLD, 17));
timerLabel.setBounds(119, 97, 176, 62);
lt.getContentPane().add(timerLabel);
event e = new event();
button.addActionListener(e);
}
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void run() {
throw new UnsupportedOperationException("Not supported yet.");
}
public class event implements ActionListener {
public void actionPerformed(ActionEvent e) {
int count = (int)(Double.parseDouble(tf.getText()));
timerLabel.setText("Time left: " + count);
TimeClass tc = new TimeClass(count);
timer = new Timer(1000, tc);
timer.start();
}
}
public class TimeClass implements ActionListener {
int counter;
public TimeClass(int counter) {
this.counter= counter;
}
public void actionPerformed(ActionEvent tc) {
counter--;
if(counter >= 1) {
timerLabel.setText("Time left: " + counter);
}
else {
timer.stop();
timerLabel.setText("Done!");
Toolkit.getDefaultToolkit().beep();
}
}
}
}
but I would like to display the remaining time instead of the word "Done".
把timerLabel.setText("Done!");
改成timerLabel.setText(counter);
?
我应该指出,由于其性质,Swing Timer
并不完全准确,您应该关注已经过去的时间量,而不是调用计时器的频率。当然,这完全取决于您希望计数的准确度,但值得了解 (恕我直言)
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class TestPane extends JPanel {
private JLabel label;
private JButton button;
private Timer timer;
private long startedAt;
public static final int RUN_TIME = 5000;
public TestPane() {
label = new JLabel("...");
button = new JButton("Start");
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(label, gbc);
add(button, gbc);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (timer == null) {
button.setText("Stop");
startedAt = System.currentTimeMillis();
timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
long diff = System.currentTimeMillis() - startedAt;
if (diff >= RUN_TIME) {
label.setText("Out of time; Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
timer.stop();
button.setText("Start");
} else {
label.setText("Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
}
}
});
label.setText("Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
timer.start();
} else {
timer.stop();
long diff = System.currentTimeMillis() - startedAt;
label.setText("Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
button.setText("Start");
timer = null;
}
}
});
}
public int remainingTime() {
long diff = System.currentTimeMillis() - startedAt;
return (int) Math.round((RUN_TIME - diff) / 1000d);
}
public int usedTime() {
long diff = System.currentTimeMillis() - startedAt;
return (int) Math.round(diff / 1000d);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 200);
}
}
}
你们都好吗?我的代码有点问题。当我停止我的计时器程序时,它会说 "Done!" 因为我将它设置为 "Done",但我想显示剩余时间而不是 "Done"。例如,如果我的原始时间设置为 4000 秒,我在 3000 秒处停止,我想在停止时显示当前时间 3000 而不是单词 "Done"。你们能帮帮我吗?我真的很感激。
这是我的代码:
import java.awt.event.*;
import java.awt.*;
import javax.swing.*;
public class CountdownTimer extends JFrame {
JLabel promptLabel, timerLabel;
int counter;
JLabel tf;
JButton button;
Timer timer;
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new CountdownTimer();
}
});
}
public CountdownTimer() {
JFrame lt = new JFrame();
lt.getContentPane().setBackground(new Color(0, 102, 153));
lt.setBounds(100, 100, 450, 300);
lt.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
lt.getContentPane().setLayout(null);
lt.setVisible(true);
promptLabel = new JLabel("Time: ", SwingConstants.CENTER);
promptLabel.setFont(new Font("Modern No. 20", Font.BOLD, 17));
promptLabel.setBounds(21, 30, 210, 30);
lt.add(promptLabel);
tf = new JLabel("4000");
tf.setBounds(160, 36, 40, 20);
lt.add(tf);
button = new JButton("Start");
button.setFont(new Font("Modern No. 20", Font.BOLD, 11));
button.setBounds(299, 37, 89, 23);
lt.add(button);
JButton btnLogout = new JButton("LOGOUT");
btnLogout.setBackground(new Color(112, 128, 144));
btnLogout.setFont(new Font("Trajan Pro", Font.BOLD, 17));
btnLogout.setBounds(149, 189, 121, 36);
btnLogout.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String sbutt = e.getActionCommand();
if(sbutt.equals("LOGOUT")) {
long current = counter;
long elapsed = current - counter;
timer.stop();
timerLabel.setText("Done!");
Toolkit.getDefaultToolkit().beep();
tf.setText(String.valueOf(elapsed));
}
}
});
lt.getContentPane().add(btnLogout);
timerLabel = new JLabel("Waiting...", SwingConstants.CENTER);
timerLabel.setFont(new Font("Modern No. 20", Font.BOLD, 17));
timerLabel.setBounds(119, 97, 176, 62);
lt.getContentPane().add(timerLabel);
event e = new event();
button.addActionListener(e);
}
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
public void run() {
throw new UnsupportedOperationException("Not supported yet.");
}
public class event implements ActionListener {
public void actionPerformed(ActionEvent e) {
int count = (int)(Double.parseDouble(tf.getText()));
timerLabel.setText("Time left: " + count);
TimeClass tc = new TimeClass(count);
timer = new Timer(1000, tc);
timer.start();
}
}
public class TimeClass implements ActionListener {
int counter;
public TimeClass(int counter) {
this.counter= counter;
}
public void actionPerformed(ActionEvent tc) {
counter--;
if(counter >= 1) {
timerLabel.setText("Time left: " + counter);
}
else {
timer.stop();
timerLabel.setText("Done!");
Toolkit.getDefaultToolkit().beep();
}
}
}
}
but I would like to display the remaining time instead of the word "Done".
把timerLabel.setText("Done!");
改成timerLabel.setText(counter);
?
我应该指出,由于其性质,Swing Timer
并不完全准确,您应该关注已经过去的时间量,而不是调用计时器的频率。当然,这完全取决于您希望计数的准确度,但值得了解 (恕我直言)
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class TestPane extends JPanel {
private JLabel label;
private JButton button;
private Timer timer;
private long startedAt;
public static final int RUN_TIME = 5000;
public TestPane() {
label = new JLabel("...");
button = new JButton("Start");
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridwidth = GridBagConstraints.REMAINDER;
add(label, gbc);
add(button, gbc);
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (timer == null) {
button.setText("Stop");
startedAt = System.currentTimeMillis();
timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
long diff = System.currentTimeMillis() - startedAt;
if (diff >= RUN_TIME) {
label.setText("Out of time; Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
timer.stop();
button.setText("Start");
} else {
label.setText("Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
}
}
});
label.setText("Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
timer.start();
} else {
timer.stop();
long diff = System.currentTimeMillis() - startedAt;
label.setText("Used: " + remainingTime() + "s; remaining " + usedTime() + "s");
button.setText("Start");
timer = null;
}
}
});
}
public int remainingTime() {
long diff = System.currentTimeMillis() - startedAt;
return (int) Math.round((RUN_TIME - diff) / 1000d);
}
public int usedTime() {
long diff = System.currentTimeMillis() - startedAt;
return (int) Math.round(diff / 1000d);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 200);
}
}
}