gpt4 book ai didi

javax.swing.timer 减去我单击开始按钮的数量

转载 作者:行者123 更新时间:2023-12-01 23:34:39 24 4
gpt4 key购买 nike

首先大家好!这是我在 stackoverflow 上的第一篇文章!这是我第二次尝试用 Java 进行编程,也是第一次尝试使用 gui。

我实际上有两个问题。第一个是程序,第二个是理解部分代码。

程序应该如何工作:

按下开始键后,每分钟从 01:00 倒计时到 00:00(01:00 -> 00:59 -> 00:58)。当您按“停止”时,它会停止倒计时(废话),当您再次按“开始”时,它会像第一次一样从 01:00 开始。

程序问题:

话虽如此。这仅在我第一次按开始时有效。当我多次按开始时,它会从时钟中减去该时间。按 2 次 (01:00 -> 00:58 -> 00:56)。按 4 次(01:00 -> 00:56 -> 00:52)。等等...这显然不应该发生。

理解问题:

我很难理解为什么计时器需要 ActionListener 以及为什么当您使用“null”时它会起作用。在某些情况下,使用“this”时它也有效(我也不明白。)。

Java Swing Timer Documentation

import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class CountdownClock extends JFrame
{

private int oneSecond = 1000; //Milliseconds
private Timer timer = new Timer(oneSecond * 60, null);
private int timerCount = 59;

public static void main(String args[])
{
new CountdownClock();
}

CountdownClock()
{
this.getContentPane().setLayout(null);
this.setBounds(800, 450, 300, 125);

final JLabel countdownLabel = new JLabel("01:00");
countdownLabel.setBounds(110, 10, 125, 30);
countdownLabel.setFont(new Font("Serif", Font.PLAIN, 30));

JButton startButton = new JButton("Start");
startButton.setBounds(10, 50, 125, 30);
startButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
timer.setRepeats(true);
timer.stop();
countdownLabel.setText("01:00");
timerCount = 59;
timer.start();
timer.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
if (timerCount == 0)
{
timer.stop();
countdownLabel.setText("00:00");
timerCount = 59;
}
else if (timerCount <= 9)
{
countdownLabel.setText("00:0" + String.valueOf(timerCount));
timerCount = timerCount - 1;
}
else
{
countdownLabel.setText("00:" + String.valueOf(timerCount));
timerCount = timerCount - 1;
}
}
});
}
});

JButton stopButton = new JButton("Stop");
stopButton.setBounds(150, 50, 125, 30);
stopButton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
timer.stop();
countdownLabel.setText("01:00");
timerCount = 59;
}
});

add(countdownLabel);
add(startButton);
add(stopButton);

setVisible(true);
}
}

最佳答案

发生这种情况是因为您每次按下按钮时都会向 Timer 添加一个 ActionListener。因此,由于 Timer 允许多个监听器,因此当计时器计时时,每个监听器都会收到通知。

要解决这个问题,您只需在每次按下开始按钮时实例化一个新的 Timer (timer = new Timer())。或者在您的 JFrame 构造函数中添加一次 ActionListener 。或者甚至删除监听器(但您应该在某处保存对它的引用)。

关于javax.swing.timer 减去我单击开始按钮的数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18883709/

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