确定用户是否仍在使用JFrame

时间:2015-09-17 10:09:54

标签: java swing jframe actionlistener

我的Java应用程序(JFrame)中有一个主窗口。现在我想确定用户是否仍在使用该窗口。为了实现这一点,我将运行一个15分钟的计时器,并在计时器用完后,例如我的应用程序关闭。到目前为止一直很好,但我怎样才能确定用户是否点击了窗口中的内容?

每次在主窗口本身执行操作时,我想重置计时器。当然,我可以将actionListeners(已执行的动作)添加到我窗口中的每个元素,但这似乎太多了#34;。是否有任何actionListener可以附加到主框架(窗口),可以收听任何操作?

2 个答案:

答案 0 :(得分:2)

可能最简单的解决方案是用自己的实现替换事件队列:

EventQueue queue = Toolkit.getDefaultToolkit().getSystemEventQueue();
queue.push(new MyEventQueue);

MyEventQueue的实现如下所示:

class MyEventQueue extends EventQueue{
    @Override
    public void postEvent(AWTEvent e){
        if(filterMatch(e) && getTimer() != null && getTimer().isRunning())
            getTimer().restart();

         super.postEvent(e);         
    }

    private bool filterMatch(AWTEvent e){
        return (e instanceof ActionEvent);
    }
}

如果用户按下按钮或导致任何其他ActionEvent,此示例代码仅重置计时器。只需更改filterMatch方法即可符合您的要求。

正如@mKorbel提到的,这个问题的另一种方法是Toolkit.addAWTEventListener

Toolkit.addAWTEventListener(
    new AWTEventListener(){
        void eventDispatched(AWTEvent e){
            if(getTimer() != null && getTimer().isRunning())
                getTimer().restart();
        }
    } , AWTEvent.MOUSE_EVENT_MASK | AWTEvent.KEY_EVENT_MASK);

如果触发任何Mouse-或KeyEvent,此示例将重置计时器。

答案 1 :(得分:1)

查看Application Inactivity

它使用Timer来控制不活动时间段。然后是侦听MouseEvent和KeyEvent。每当发生事件时,计时器都会重置。

您需要做的就是在Timer实际触发时编写一个Action来调用。