我的Java应用程序(JFrame)中有一个主窗口。现在我想确定用户是否仍在使用该窗口。为了实现这一点,我将运行一个15分钟的计时器,并在计时器用完后,例如我的应用程序关闭。到目前为止一直很好,但我怎样才能确定用户是否点击了窗口中的内容?
每次在主窗口本身执行操作时,我想重置计时器。当然,我可以将actionListeners
(已执行的动作)添加到我窗口中的每个元素,但这似乎太多了#34;。是否有任何actionListener
可以附加到主框架(窗口),可以收听任何操作?
答案 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)
它使用Timer来控制不活动时间段。然后是侦听MouseEvent和KeyEvent。每当发生事件时,计时器都会重置。
您需要做的就是在Timer实际触发时编写一个Action
来调用。