- PR -

SWTで一定時間操作がなければアプリケーションを終了したい

1
投稿者投稿内容
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-23 14:22
SWTでグループウェアを作成中です。

各個人に権限を変化させる為、アプリケーションを立ち上げっぱなしにして、離席されるとセキュリティの問題が出てきます。
そこで、例えば10分間、キー入力等、ユーザーの操作がなければ、特定の動作を行いたいと思っております。
(特定の動作→終了やスクリーンセーバーのようなものを出現させる等)

Shellにmousemoveやmousehover、keypressed等のリスナーをつければ、
ユーザーが操作をしたかどうかは判別がつくのですが、
ShellにComposite等を設置すると、そのリスナーは機能しなくなってしまいます。
イメージとしてはDisplayをリスニングできれば良いと思ったのですが、そういったリスナーが見当たりません。

全てのオブジェクトに同一のリスナーをつける必要があるのでしょうか。
どなたか、良い方法があれば、教えて頂いてもよろしいでしょうか。
よろしくお願い致します。
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-27 16:48
これって、やっぱり不可能なんでしょうか・・・。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-27 16:53
SWTは知りませんが、Swing でも同じく内包する全てのコンポーネントにたいしてリスナを設定する必要があった気がします。
再起的に内包するComponent(SWTではたぶん違う用語ですが、GUIを構成するオブジェクトのこと)を再起的に走査してリスナを設定する必要があるのではないでしょうか。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2005-09-27 19:17
引用:

インギさんの書き込み (2005-09-27 16:53) より:
SWTは知りませんが、Swing でも同じく内包する全てのコンポーネントにたいしてリスナを設定する必要があった気がします。



Swing/AWTならToolkitにイベントリスナーを登録することで、アプリケーション全体のイベントを取得することができます。

引用:

再起的に内包するComponent(SWTではたぶん違う用語ですが、GUIを構成するオブジェクトのこと)を再起的に走査してリスナを設定する必要があるのではないでしょうか。


SWTならこの方法しかないでしょうね。多分。

例えば以下のようなコードを使って。
コード:
private static void addListenerToAllChildren(MouseMoveListener listener, Composite comp) {
   Control[] children = comp.getChildren();
   for (int i = 0; i < children.length; i++) {
      children[i].addMouseMoveListener(listener);

      if(children[i] instanceof Composite) {
         addListenerToAllChildren(listener, (Composite) children[i]);
      }
   }
}



ちなみにSWTでSwing/AWTのComponentに該当するのはWidgitかControlですね。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-09-28 02:29
>Swing/AWTならToolkitにイベントリスナーを登録することで、アプリケーション全体のイベントを取得するこ
>とができます。
おぉっと、存じあげませんでした。勉強になりました。ありがとうございます。
NULL
会議室デビュー日: 2005/09/28
投稿数: 4
投稿日時: 2005-09-28 02:43
SWT の Display に

addFilter(int eventType, Listener listener)

という関数があるのでそれでいけると思います。

ただ、気をつけなくてはいけないのは、このリスナーは登録した Display に対して本当にグローバルなリスナーですので、関数内でエラーを起こしてしまうと、その後の処理が完全にストップしてしまいます。
具体的には、ダイアログなどが一切表示できなくなったりします。
過去にそれではまった事がありました。
しんい
ベテラン
会議室デビュー日: 2005/09/01
投稿数: 55
投稿日時: 2005-09-28 12:08
インギさん、Wataさん、NULLさん、ありがとうございました。

色んな方法があるのですね。
addFilter、早速試してみます。ありがとうございます。
再帰的にリスナーを設定する方法は、他にも使えそうですね。勉強になりました。ありがとうございます。

今朝思いついたのは、
Displayに対して、getCursorControl()を使って、マウスの移動がなされているかどうかをリスニングしようと考えておりました。
キーボードは全くリスニング出来ないですけど、無いよりはマシかと・・・。
アドバイス頂けて良かったです。
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-10-06 01:52
メッセージループ内でイベントを監視する、ってほうほうもあります。
手を抜いてDisplay#timerExecを使ったので、ちと重いかもしませんが。

------------------------------------------------ InactiveTimer.java
* 3秒間 (3 * 1000) なにも操作しないと、ダイアログを表示します。

コード:
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;

public class InactiveTimer {

    private Display display;
    private Shell shell;
    private TimerExec showDialogExec;
    private int msec = 3 * 1000;
    
    public void open() {
        display = Display.getDefault();
        createContents();

        //
        showDialogExec = new TimerExec();
        display.timerExec(msec, showDialogExec);

        //
        shell.open();
        shell.layout();
        
        while (!shell.isDisposed()) {
            if (!display.readAndDispatch()) {
                display.timerExec(-1, showDialogExec);
                display.timerExec(msec, showDialogExec);
                display.sleep();
            }
        }
    }

    private void createContents() {
        shell = new Shell();
        shell.setSize(640, 480);
        shell.setText("Inactive Timer Sample");
    }
    
    private class TimerExec implements Runnable {
        public void run() {
            final MessageBox mbox = new MessageBox(shell, SWT.OK);
            mbox.setMessage("Innactive!");
            mbox.open();
        }
    }

    public static void main(final String[] args) {
        new InactiveTimer().open();
    }
}


1

スキルアップ/キャリアアップ(JOB@IT)