3 回答
![?](http://img1.sycdn.imooc.com/545866c40001561502200220-100-100.jpg)
TA贡献1883条经验 获得超3个赞
简短答案...
一个更简单(且设计更好)的解决方案将是,而不是...
private static final Timer TICK_HOUR = new Timer(3600000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("OK");
}
});
您应该将工作外在化ActionListener...
private static final Timer TICK_HOUR = new Timer(3600000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
doReallyImportantWorkEveryHour();
}
});
然后Timer从等式中删除,即可doReallyImportantWorkEveryHour在需要时调用并解决基本问题
长答案
所以,让我们从...开始
private static final Timer TICK_HOUR = new Timer(3600000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("OK");
}
});
创建Timer这样一来,会自动注册一个ActionListener与Timer。
然后,您声明:
我想做的是手动在计时器的ActionListener中调用actionPerformed()方法。我怎样才能做到这一点?
这表明您想尝试做类似的事情...
private static final Timer TICK_HOUR = new Timer(3600000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
TICK_HOUR.getActionListeners()[0].actionPerformed(null);
}
});
这可能会导致NullPointerException,但更重要的是,这将对系统性能产生不利影响,因为没有办法让人们ActionListener知道它不应该连续不断地自身-基本上是无限循环。
但是,如果你想,过早地,触发Timer小号ActionListenerS(所有已注册侦听外)
那是的,您可以使用...
ActionEvent evt = new ActionEvent(
TICK_HOUR,
0,
TICK_HOUR.getActionCommand(),
System.currentTimeMillis(),
0);
for (ActionListener listener : TICK_HOUR.getActionListeners()) {
listener.actionPerformed(evt);
}
但请确保您是在EDT的上下文中调用它们,因为这是制造商的保证之一Timer。
一个“简单”的解决方案可能只是使用Timer本身已经提供的功能...
public class ManuallyTimer extends Timer {
public ManuallyTimer(int delay, ActionListener listener) {
super(delay, listener);
}
public void tigger() {
ActionEvent evt = new ActionEvent(TICK_HOUR, 0, TICK_HOUR.getActionCommand());
fireActionPerformed(new ActionEvent(this, 0, getActionCommand(),
System.currentTimeMillis(),
0));
}
}
![?](http://img1.sycdn.imooc.com/5458657e000125a302200220-100-100.jpg)
TA贡献1831条经验 获得超9个赞
在变量的static-initializer-block存储ActionListener中,而不是将其直接传递给Timer:
private static final Timer TICK_HOUR;
static{
ActionListener listener = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// ...
}
};
TICK_HOUR = = new Timer(3600000, listener);
listener.actionPerformed(/* someEvent */);
}
您也可以将listener变量存储为类级静态变量,然后在代码中的其他位置调用它:
private static final ActionListener LISTENER = new ActionListener(){
@Override
public void actionPerformed(ActionEvent e) {
// ...
}
};
private static final Timer TICK_HOUR = new Timer(3600000, LISTENER);
然后在代码中的某处
LISTENER.actionPerformed(/* someEvent */);
![?](http://img1.sycdn.imooc.com/545862120001766302200220-100-100.jpg)
TA贡献1840条经验 获得超5个赞
使用getActionListeners()
。
返回在此计时器上注册的所有动作侦听器的数组。
返回:所有计时器的ActionListeners;如果当前未注册任何动作侦听器,则返回 一个空数组。
〜Java文档〜
TICK_HOUR.getActionListeners()[0].actionPerformed(null);
ArrayIndexOutOfBoundsException
如果没有ActionListener
注册计时器,则将抛出。因此,最好在使用前检查数组的长度。
添加回答
举报