TITLE:AWTEventを取得して入力イベントを監視

AWTEventを取得して入力イベントを監視

編集者:Terai Atsuhiro~

作成日:2008-02-11
更新日:2024-02-02 (金) 11:43:40
  • 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

概要

AWTEventを取得して、マウスやキーボードの入力イベントを監視します。

概要

AWTEventを取得して、マウスやキーボードの入力イベントを監視します。

#screenshot

サンプルコード

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

解説

上記のサンプルでは、一定時間(10秒)、マウスやキーボードからの入力が無い場合、接続(ダミー)を切るようになっています。

解説

上記のサンプルでは、一定時間(10秒)マウスやキーボードからの入力が無い場合は接続(実際はなにも実行しない)を終了するようAWTEventListenerToolkitに設定しています。 以下のように、AWTEventListenerを使っても同様*1のことが可能です。
#spanend
#spandel
Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() {
#spanend
  public void eventDispatched(AWTEvent e) {
    System.out.println(e);
  }
#spandel
}, AWTEvent.KEY_EVENT_MASK + AWTEvent.MOUSE_EVENT_MASK);
#spanend
#spandel
  • -
  • Application Inactivity « Java Tips Weblogを参考にしてToolkit.getDefaultToolkit().getSystemEventQueue().push(eventQueue)は使用せず、以下のようにToolkit.getDefaultToolkit().addAWTEventListener(AWTEventListener)を使う方法に変更
    • timertimer.setRepeats(false);でスタート(一回で終了する)
    • Toolkit.getDefaultToolkit().addAWTEventListenerAWTEventListenerを設定
    • AWTEventが発生した時にtimer.restart();でタイマーをリセット
    • 時間がきたらToolkit.getDefaultToolkit().removeAWTEventListenerAWTEventを取り除く
    • JDK 1.7.0以上の場合、LayerUI (Java Platform SE 8)で同様の処理が可能

コメント

参考リンク

コメント