为了账号安全,请及时绑定邮箱和手机立即绑定

手动调用javax.swing.Timer的actionPerformed

手动调用javax.swing.Timer的actionPerformed

至尊宝的传说 2021-04-16 17:20:19
以下计时器可以完美运行。private static final Timer TICK_HOUR = new Timer(3600000, new ActionListener() {    @Override    public void actionPerformed(ActionEvent e) {        // ...    }});我想做的是actionPerformed()手动调用。我怎样才能做到这一点?对于读者来说,这个问题似乎还不清楚,我将尽力解释更多。计时器每小时执行一些处理。我想在不干扰计时器过程的情况下随时执行此操作。
查看完整描述

3 回答

?
白板的微信

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));

    }

}


查看完整回答
反对 回复 2021-04-28
?
天涯尽头无女友

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 */);


查看完整回答
反对 回复 2021-04-28
?
慕斯709654

TA贡献1840条经验 获得超5个赞

使用getActionListeners()

返回在此计时器上注册的所有动作侦听器的数组。
返回:所有计时器的ActionListeners;如果当前未注册任何动作侦听器,则返回 一个空数组。

〜Java文档〜

TICK_HOUR.getActionListeners()[0].actionPerformed(null);

ArrayIndexOutOfBoundsException如果没有ActionListener注册计时器,则将抛出。因此,最好在使用前检查数组的长度。


查看完整回答
反对 回复 2021-04-28
  • 3 回答
  • 0 关注
  • 256 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信