有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java手动调用javax的actionPerformed。摆动计时器

下面的计时器工作正常

private static final Timer TICK_HOUR = new Timer(3600000, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // ...
    }
});

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


对于读者来说,这个问题似乎不清楚,我将尝试解释更多

计时器每小时进行一次处理。我想在不干扰计时器进程的情况下,随时做这件事


共 (1) 个答案

  1. # 1 楼答案

    简短的回答

    一个更简单(设计更好)的解决方案是,而不是

    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

    然后你陈述:

    What I want to do is call the actionPerformed() method inside the timer's ActionListener manually. How can I achieve this?

    这表明你想尝试做一些像

    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不可能知道它不应该一直都是自己——基本上是无限循环

    但是,如果您想过早地触发TimersActionListeners(在任何已注册的侦听器之外)

    那么是的,你可以用

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