• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:AWTEventを取得して入力イベントを監視
#navi(../)
*AWTEventを取得して入力イベントを監視 [#ad33b611]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2008-02-11~
更新日:&lastmod;
---
category: swing
folder: DispatchEvent
title: AWTEventを取得して入力イベントを監視
tags: [AWTEvent, Toolkit, AWTEventListener]
author: aterai
pubdate: 2008-02-11T21:32:38+09:00
description: AWTEventを取得して、マウスやキーボードの入力イベントを監視します。
image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTLPUOE2MI/AAAAAAAAAXQ/5qrFGk7E5GM/s800/DispatchEvent.png
---
* 概要 [#summary]
`AWTEvent`を取得して、マウスやキーボードの入力イベントを監視します。

#contents
#download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTLPUOE2MI/AAAAAAAAAXQ/5qrFGk7E5GM/s800/DispatchEvent.png)

**概要 [#waee37f2]
AWTEventを取得して、マウスやキーボードの入力イベントを監視します。

#screenshot

**サンプルコード [#fc4a223d]
#code{{
Toolkit.getDefaultToolkit().getSystemEventQueue().push(new EventQueue() {
  protected void dispatchEvent(AWTEvent e) {
    super.dispatchEvent(e);
    if(e instanceof InputEvent) {
      //System.out.println("i:"+((InputEvent)e).getWhen());
      when = ((InputEvent)e).getWhen();
    }
* サンプルコード [#sourcecode]
#code(link){{
private static int DELAY = 10 * 1000; //10s
private final Timer timer = new Timer(DELAY, new ActionListener() {
  @Override public void actionPerformed(ActionEvent e) {
    setTestConnected(false);
    Toolkit.getDefaultToolkit().removeAWTEventListener(awtEvent);
    timer.stop();
  }
});
timer = new javax.swing.Timer(5000, new ActionListener() {
  public void actionPerformed(ActionEvent e) {
    if(when>0 && e.getWhen()-when>10000) {
      setTestConnected(false);
      timer.stop();
private final AWTEventListener awtEvent = new AWTEventListener() {
  @Override public void eventDispatched(AWTEvent e) {
    if (timer != null && timer.isRunning()) {
      // System.out.println("timer.restart()");
      timer.restart();
    }
  }
};
JButton button = new JButton(new AbstractAction("Connect") {
  @Override public void actionPerformed(ActionEvent e) {
    setTestConnected(true);
    Toolkit.getDefaultToolkit().addAWTEventListener(awtEvent,
        AWTEvent.KEY_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK);
    timer.setRepeats(false);
    timer.start();
  }
});
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#rdf0df57]
上記のサンプルでは、一定時間(10秒)、マウスやキーボードからの入力が無い場合、接続(ダミー)を切るようになっています。
* 解説 [#explanation]
上記のサンプルでは、一定時間(`10`秒)マウスやキーボードからの入力が無い場合は接続(実際はなにも実行しない)を終了するよう`AWTEventListener`を`Toolkit`に設定しています。

以下のように、AWTEventListenerを使っても同様((イベントマスクは適当に追加してください。))のことが可能です。
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
  public void eventDispatched(AWTEvent e) {
    System.out.println(e);
  }
}, AWTEvent.KEY_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK);
----
- [https://tips4java.wordpress.com/2008/10/24/application-inactivity/ Application Inactivity « Java Tips Weblog]を参考にして`Toolkit.getDefaultToolkit().getSystemEventQueue().push(eventQueue)`は使用せず、以下のように`Toolkit.getDefaultToolkit().addAWTEventListener(AWTEventListener)`を使う方法に変更
-- `timer`を`timer.setRepeats(false);`でスタート(一回で終了する)
-- `Toolkit.getDefaultToolkit().addAWTEventListener`で`AWTEventListener`を設定
-- `AWTEvent`が発生した時に`timer.restart();`でタイマーをリセット
-- 時間がきたら`Toolkit.getDefaultToolkit().removeAWTEventListener`で`AWTEvent`を取り除く
-- `JDK 1.7.0`以上の場合、[https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/plaf/LayerUI.html LayerUI (Java Platform SE 8)]で同様の処理が可能

//**参考リンク
**コメント [#k0faafe0]
* 参考リンク [#reference]
- [https://tips4java.wordpress.com/2008/10/24/application-inactivity/ Application Inactivity « Java Tips Weblog]

* コメント [#comment]
#comment
- `java.security.AccessControlException: access denied ("java.awt.AWTPermission" "listenToAllAWTEvents")`が発生するので、`Web Start`起動のリンクを削除。 -- &user(aterai); &new{2014-01-14 (火) 13:57:01};

#comment