猿问

手动调用javax.swing.Timer的actionPerformed

以下计时器可以完美运行。


private static final Timer TICK_HOUR = new Timer(3600000, new ActionListener() {

    @Override

    public void actionPerformed(ActionEvent e) {

        // ...

    }

});

我想做的是actionPerformed()手动调用。我怎样才能做到这一点?


对于读者来说,这个问题似乎还不清楚,我将尽力解释更多。


计时器每小时执行一些处理。我想在不干扰计时器过程的情况下随时执行此操作。


至尊宝的传说
浏览 257回答 3
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));    }}

天涯尽头无女友

在变量的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 */);

慕斯709654

使用getActionListeners()。返回在此计时器上注册的所有动作侦听器的数组。返回:所有计时器的ActionListeners;如果当前未注册任何动作侦听器,则返回 一个空数组。〜Java文档〜TICK_HOUR.getActionListeners()[0].actionPerformed(null);ArrayIndexOutOfBoundsException如果没有ActionListener注册计时器,则将抛出。因此,最好在使用前检查数组的长度。
随时随地看视频慕课网APP

相关分类

Java
我要回答