gpt4 book ai didi

java - ActionListener 类的引用问题

转载 作者:行者123 更新时间:2023-11-30 09:26:17 27 4
gpt4 key购买 nike

我在将 Timer 引用到 ActionListener 类时遇到问题。我想在 Java 显示显示时间的对话框后停止计时器,并在单击"is"后再次启动。

这是我目前拥有的:

public class AlarmClock 
{
public static void main(String[] args)
{
boolean status = true;

Timer t = null;

ActionListener listener = new TimePrinter(t);
t = new Timer(10000, listener);

t.start();

while(status)
{
}
}
}

class TimePrinter implements ActionListener
{
Timer t;

public TimePrinter(Timer t)
{
this.t = t;
}
public void actionPerformed(ActionEvent event)
{
t.stop(); //To stop the timer after it displays the time

Date now = Calendar.getInstance().getTime();
DateFormat time = new SimpleDateFormat("HH:mm:ss.");

Toolkit.getDefaultToolkit().beep();
int choice = JOptionPane.showConfirmDialog(null, "The time now is "+time.format(now)+"\nSnooze?", "Alarm Clock", JOptionPane.YES_NO_OPTION);

if(choice == JOptionPane.NO_OPTION)
{
System.exit(0);
}
else
{
JOptionPane.showMessageDialog(null, "Snooze activated.");
t.start(); //To start the timer again
}
}
}

但是这段代码给出了一个空指针异常错误。有没有其他方法可以引用计时器?

最佳答案

这里有一个先有鸡还是先有蛋的问题,因为两个类的构造函数都需要相互引用。您需要以某种方式打破循环,最简单的方法是构造没有监听器的 Timer,然后构造监听器,然后将其添加到计时器:

    t = new Timer(10000, null);
ActionListener l = new TimePrinter(t);
t.addActionListener(l);

或者,您可以向 TimePrinter 添加一个 setter,而不是将 Timer 传递给它的构造函数:

class TimePrinter implements ActionListener
{
Timer t;

public TimePrinter() {}

public setTimer(Timer t)
{
this.t = t;
}

然后做

    TimePrinter listener = new TimePrinter();
t = new Timer(10000, listener);
listener.setTimer(t);

无论哪种方式,最终结果都是一样的。

关于java - ActionListener 类的引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14984240/

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