创建一个从用户输入开始的JavaGUI倒计时
这是github 因此,我试图创建一个应用程序,并将其分为三个部分,其中之一是创建一个计时器。此计时器有两个字段:一个输入分钟,一个输入秒。用户输入的时间应为分钟或秒,并在应用程序屏幕上显示倒计时。当计时器达到0时,它会提醒用户。我到处都找遍了,在Java中找不到一个倒计时的计时器。我发现的只是在控制台中工作的倒计时,或者已经由开发人员(而不是用户)设置了预定义值的倒计时 我想制作一个计时器,就像谷歌的一样: 另外,我是一个自学成才的新程序员。这是我的第二个java项目,所以我还没有太多经验。期待任何帮助:) 这是我的密码:创建一个从用户输入开始的JavaGUI倒计时,java,swing,timer,Java,Swing,Timer,这是github 因此,我试图创建一个应用程序,并将其分为三个部分,其中之一是创建一个计时器。此计时器有两个字段:一个输入分钟,一个输入秒。用户输入的时间应为分钟或秒,并在应用程序屏幕上显示倒计时。当计时器达到0时,它会提醒用户。我到处都找遍了,在Java中找不到一个倒计时的计时器。我发现的只是在控制台中工作的倒计时,或者已经由开发人员(而不是用户)设置了预定义值的倒计时 我想制作一个计时器,就像谷歌的一样: 另外,我是一个自学成才的新程序员。这是我的第二个java项目,所以我还没有太多经验。
public class TestPane extends JFrame {
private LocalDateTime startTime;
private JLabel timerLabel;
private Timer timer;
private JButton startbtn;
private JTextField timeSet;
int count;
int count_2;
private Duration duration;
private JTextField minSet;
private JTextField secSet;
public TestPane() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setSize(400,400);
getContentPane().setLayout(new CardLayout(0, 0));
JPanel panel = new JPanel();
getContentPane().add(panel, "name_87856346254020");
panel.setLayout(null);
timerLabel = new JLabel("New label");
timerLabel.setBounds(59, 48, 194, 14);
panel.add(timerLabel);
startbtn = new JButton("New button");
startbtn.setBounds(124, 187, 89, 23);
panel.add(startbtn);
timeSet = new JTextField(1);
timeSet.setBounds(106, 85, 86, 20);
panel.add(timeSet);
timeSet.setColumns(10);
JLabel lblHours = new JLabel("Hours");
lblHours.setBounds(29, 88, 46, 14);
panel.add(lblHours);
JLabel lblMinss = new JLabel("Mins");
lblMinss.setBounds(29, 114, 46, 14);
panel.add(lblMinss);
JLabel lblSecs = new JLabel("Secs");
lblSecs.setBounds(29, 139, 46, 14);
panel.add(lblSecs);
minSet = new JTextField(60);
minSet.setBounds(75, 116, 86, 20);
panel.add(minSet);
minSet.setColumns(10);
secSet = new JTextField();
secSet.setBounds(75, 147, 86, 20);
panel.add(secSet);
secSet.setColumns(10);
startbtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
startbtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
timeSet.getText().trim();
if(timeSet.getText().isEmpty()) {
duration = Duration.ofMinutes(count_min);
} else {
count_hour = Integer.parseInt(timeSet.getText());
duration = Duration.ofHours(count_hour);
}
minSet.getText().trim();
if(minSet.getText().isEmpty()) {
duration = Duration.ofHours(count_hour);
} else {
count_min = Integer.parseInt(minSet.getText());
duration = Duration.ofMinutes(count_min);
}
secSet.getText().trim();
if(secSet.getText().isEmpty() && minSet.getText().isEmpty()) {
duration = Duration.ofHours(count_hour);
}
else if(secSet.getText().isEmpty() && timeSet.getText().isEmpty()){
duration = Duration.ofMinutes(count_sec);
}
else {
count_sec = Integer.parseInt(secSet.getText());
duration = duration.ofSeconds(count_sec);
}
if (timer.isRunning()) {
timer.stop();
startTime = null;
startbtn.setText("Start");
}
else {
startTime = LocalDateTime.now();
timer.start();
startbtn.setText("Stop");
}
}
});
timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
LocalDateTime now = LocalDateTime.now();
Duration runningTime = Duration.between(startTime, now);
Duration timeLeft = duration.minus(runningTime);
if (timeLeft.isZero() || timeLeft.isNegative()) {
timeLeft = Duration.ZERO;
startbtn.doClick(); // Cheat
}
timerLabel.setText(format(timeLeft));
}
});
}
protected String format(Duration duration) {
long hours = duration.toHours();
long mins = duration.minusHours(hours).toMinutes();
long seconds = (duration.minusMinutes(mins).toMillis() / 1000) %60;
return String.format("%02dh %02dm %02ds", hours, mins, seconds);
}
public static void main(String args[]){
new TestPane();
}
}
更新:
到目前为止,当用户设置小时并将分钟和秒留空时,它会从小时开始倒计时。秒也一样。但是,我没有时间做同样的事情。如果我把所有内容都留空,除了分钟,计时器什么也不做。另外,我想让计时器与小时、分钟和秒同时工作。到目前为止,它一次只能使用一台设备
因此,基本思想是从一个Swing
计时器开始。使用它来更新UI是安全的,不会阻塞UI线程,并且可以定期重复。有关更多详细信息,请参阅
因为所有计时器只保证最短的持续时间(也就是说,它们可以等待比指定的延迟更长的时间),所以不能仅仅通过添加预期的持续时间来更新状态值。相反,您需要能够计算到时间点之间的时间差
为此,我将使用Java8中引入的日期/时间API。有关更多详细信息,请参阅和
从这里开始,只需设置一个计时器
,计算从开始时间到现在的持续时间
,并格式化结果
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.Duration;
import java.time.LocalDateTime;
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 class TestPane extends JPanel {
private LocalDateTime startTime;
private JLabel label;
private Timer timer;
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(2, 2, 2, 2);
gbc.gridwidth = GridBagConstraints.REMAINDER;
label = new JLabel("...");
add(label, gbc);
JButton btn = new JButton("Start");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (timer.isRunning()) {
timer.stop();
startTime = null;
btn.setText("Start");
} else {
startTime = LocalDateTime.now();
timer.start();
btn.setText("Stop");
}
}
});
add(btn, gbc);
timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
LocalDateTime now = LocalDateTime.now();
Duration duration = Duration.between(startTime, now);
label.setText(format(duration));
}
});
}
protected String format(Duration duration) {
long hours = duration.toHours();
long mins = duration.minusHours(hours).toMinutes();
long seconds = duration.minusMinutes(mins).toMillis() / 1000;
return String.format("%02dh %02dm %02ds", hours, mins, seconds);
}
}
}
倒计时。。。
这个计时器计时。我怎样才能让它倒计时呢?我试着从你的链接中输入代码,但是没有用。这些文件也没有帮助我理解太多
这需要更好地理解日期/时间API
基本上,您需要知道预期的持续时间(计时器应该运行多长时间)和计时器已经运行的时间量。由此,您可以计算剩余时间(倒计时)
为了简单起见,我从5分钟的持续时间开始
private Duration duration = Duration.ofMinutes(5);
每次定时器
滴答作响时,我只需计算运行时间并计算剩余时间
LocalDateTime now = LocalDateTime.now();
Duration runningTime = Duration.between(startTime, now);
Duration timeLeft = duration.minus(runningTime);
if (timeLeft.isZero() || timeLeft.isNegative()) {
timeLeft = Duration.ZERO;
// Stop the timer and reset the UI
}
我真正做的只是在API上玩。我知道我最终需要一个持续时间
(因为我正在格式化),所以我想保留这个时间。因为我还需要一个“持续时间”,来表示计时器
应该运行的时间长度,所以持续时间
类似乎是一个很好的开始
我原以为我可能需要计算两个持续时间之间的差异(就像我对运行时所做的那样),但事实证明,我真正想要的是它们之间的差异(即从一个减去另一个)
剩下的就是添加一个检查,以确保计时器不会运行到负时间,并且您知道有一个“超时”或“倒计时”计时器的概念
当你处理这类问题时,从一个“核心概念”开始总是一件好事,它“可能”是如何工作的——也就是说,从计算如何在几秒钟内倒计时开始。这为您提供了一些基础工作,从这里,您可以看到API提供了哪些支持,以及如何利用它来发挥优势。在本例中,Duration
非常简单,并继续提供对输出格式的支持
例如
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.time.Duration;
import java.time.LocalDateTime;
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 class TestPane extends JPanel {
private LocalDateTime startTime;
private JLabel label;
private Timer timer;
private Duration duration = Duration.ofMinutes(5);
public TestPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.insets = new Insets(2, 2, 2, 2);
gbc.gridwidth = GridBagConstraints.REMAINDER;
label = new JLabel("...");
add(label, gbc);
JButton btn = new JButton("Start");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (timer.isRunning()) {
timer.stop();
startTime = null;
btn.setText("Start");
} else {
startTime = LocalDateTime.now();
timer.start();
btn.setText("Stop");
}
}
});
add(btn, gbc);
timer = new Timer(500, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
LocalDateTime now = LocalDateTime.now();
Duration runningTime = Duration.between(startTime, now);
Duration timeLeft = duration.minus(runningTime);
if (timeLeft.isZero() || timeLeft.isNegative()) {
timeLeft = Duration.ZERO;
btn.doClick(); // Cheat
}
label.setText(format(timeLeft));
}
});
}
protected String format(Duration duration) {
long hours = duration.toHours();
long mins = duration.minusHours(hours).toMinutes();
long seconds = duration.minusMinutes(mins).toMillis() / 1000;
return String.format("%02dh %02dm %02ds", hours, mins, seconds);
}
}
}
您可以颠倒这个概念,这样您就有了开始时间和持续时间,让计时器以固定的间隔(例如半秒)滴答作响,然后检查计时器是否已经运行了指定的时间段。通过从持续时间中减去运行时间,您可以轻松生成倒计时时间。请记住,大多数时间操作发生在毫秒级,因此您需要将输入转换为毫秒。你可能还想看一看添加一个稍微复杂一点的谢谢,我会查看链接。这是我在Java中的第二个项目,所以我想我需要从小处着手代码>什么都不感谢你让我开始!我需要获得用户输入,并从用户在JTextField中指定的内容开始倒计时。我只是不知道怎么做。我建议当启动按钮被触发时,你从文本字段中读取这个计时器计数点的值。我怎样才能让它倒计时呢?我试着从你的链接中输入代码,但是没有用。这些文档也没有帮助我理解太多。你需要-一个持续时间(计时器应该运行多长时间);计时器已运行的当前时间量(您已经有此时间);然后,您只需计算两者之间的差异。例如:非常感谢你的帮助!我有一个小时和秒的问题。我发现,如果我设置小时,计时器将使用秒而不是小时倒计时。但是,我通过添加以下内容解决了这个问题:long seconds=(duration.minus minutes.toMillis()/1000)%60;