Swing/DispatchEvent のバックアップの現在との差分(No.4)
TITLE:AWTEventを取得して入力イベントを監視
AWTEventを取得して入力イベントを監視
Posted by terai at 2008-02-11- category: swing folder: DispatchEvent title: AWTEventを取得して入力イベントを監視 tags: [AWTEvent, Toolkit, AWTEventListener] author: aterai pubdate: 2008-02-11T21:32:38+09:00 description: AWTEventを取得して、マウスやキーボードの入力イベントを監視します。 image:
概要
AWTEvent
を取得して、マウスやキーボードの入力イベントを監視します。
Screenshot
Advertisement
概要
AWTEventを取得して、マウスやキーボードの入力イベントを監視します。- &jnlp;
- &jar;
- &zip;
#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();
}
});
解説
上記のサンプルでは、一定時間(10-15秒)、マウスやキーボードからの入力が無い場合、接続(ダミー)を切るようになっています。解説
上記のサンプルでは、一定時間(10
秒)マウスやキーボードからの入力が無い場合は接続(実際はなにも実行しない)を終了するようAWTEventListener
をToolkit
に設定しています。
以下のように、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)
を使う方法に変更-
timer
をtimer.setRepeats(false);
でスタート(一回で終了する) -
Toolkit.getDefaultToolkit().addAWTEventListener
でAWTEventListener
を設定 -
AWTEvent
が発生した時にtimer.restart();
でタイマーをリセット - 時間がきたら
Toolkit.getDefaultToolkit().removeAWTEventListener
でAWTEvent
を取り除く -
JDK 1.7.0
以上の場合、LayerUI (Java Platform SE 8)で同様の処理が可能
-