gpt4 book ai didi

java - Java中创建秒表的定时器延迟方法

转载 作者:太空宇宙 更新时间:2023-11-04 13:35:21 28 4
gpt4 key购买 nike

您好,我正在尝试为 Java 基础教科书中的项目问题之一创建一个秒表应用程序。到目前为止我已经编写了这段代码:

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

public class StopWatchPanel extends JPanel{
private JPanel userPanel = new JPanel();
private JLabel timeDisplay = new JLabel("00:00:00", SwingConstants.CENTER);
private JButton startButton = new JButton("Start");
private JButton stopButton = new JButton("Stop");
private JButton resetButton = new JButton("Reset");
private Timer refreshRate = new Timer(1, new ActionListen());
private int milliseconds, seconds, minutes, hours;

public StopWatchPanel(){
// user panel settings
userPanel.setPreferredSize(new Dimension(400, 100));
userPanel.setBackground(new Color(200, 200, 255));

// add listeners
startButton.addActionListener(new ActionListen());
stopButton.addActionListener(new ActionListen());
resetButton.addActionListener(new ActionListen());

// component setting
timeDisplay.setPreferredSize(new Dimension(400, 50));

// add components
userPanel.add(timeDisplay);
userPanel.add(startButton);
userPanel.add(stopButton);
userPanel.add(resetButton);

// add to main frame
add(userPanel);
}

private int milsec(){
if(milliseconds > 1000){
milliseconds = 0;
seconds++;
}
return milliseconds++;
}

private int sec(){
if(seconds > 59){
seconds = 0;
minutes++;
}
return seconds;
}

private int min(){
if(minutes > 59){
minutes = 0;
hours++;
}
return minutes;
}

private int hrs(){
if(hours > 23){
hours = 0;
}
return hours;
}


private class ActionListen implements ActionListener{
public void actionPerformed(ActionEvent e){
if(e.getSource().equals(startButton)){
refreshRate.start();
}

else if(e.getSource().equals(refreshRate)){
timeDisplay.setText(sec()+":"+milsec());
}

else if(e.getSource().equals(stopButton)){
refreshRate.stop();
}

else if(e.getSource().equals(resetButton)){
timeDisplay.setText("00:00:00");
milliseconds = 0;
seconds = 0;
minutes = 0;
hours = 0;
}
}
}
}

如果我将计时器的延迟设置为 1000 毫秒,因此显示秒(如果我排除 milsec 方法),它会起作用,但我也想显示毫秒。所以我将延迟设置为 1 毫秒,以便每 1 毫秒后,它会将 Text 设置为当前秒数(秒方法)。但由于某种原因,这不起作用,因为考虑到 1000 毫秒 = 1 秒,数字加起来太慢。

我做错了什么?

最佳答案

1毫秒的延迟意味着定时器每1毫秒生成一次事件。然后,事件被分派(dispatch)到事件分派(dispatch)线程,这会引入延迟(因为事件分派(dispatch)线程上还运行其他代码),因此调用 actionPerformed() 之间的实际间隔可能大于 1 毫秒。

如果您需要精确的时钟,则需要测量调用之间的确切耗时(例如,使用 System.currentTimeMillis() 方法),而不是在每次调用时将时间增加 1 毫秒。

关于java - Java中创建秒表的定时器延迟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31759972/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com