9

誰かがこれを解決する方法を知っているのだろうか:

私の Java Eclipse プラグインには、時間がかかるプロセスがいくつかあります。したがって、ユーザーはウィンドウを最小化して、プロセスをバックグラウンドで実行させることができます。
これで、プロセスが終了したら、ウィンドウを強制的に再び上に移動させることができますが、それは使いやすさの点でノーノーです。代わりに、タスクバーでプロセスを点滅させたいと思います。これを達成する方法はありますか?

org.eclipse.jface.window を見てみましたが、そのようなものは見つかりませんでした。SWT のドキュメントについても同じことが言えます...

私の頭に浮かんだもう 1 つのこと - 人々がこのアプリをmac os xlinuxでも使用しているため、プロセスが終了したことをユーザーに通知 するプラットフォームに依存しないソリューションはありますか?

どんなアイデアでも大歓迎です!

編集:
Windowsでは、ユーザーがフォアグラウンドへの力を有効にするかどうかを調整できることがわかりました。そのオプションが無効になっている場合、タスクはタスクバーで点滅します...これについて
はよく読んでください...

この種の動作を実現するプラットフォームに依存しない方法を誰かが知っている場合は、その知識を私と共有してください!

4

4 に答える 4

2

まばたきとは言えませんが、Eclipse 3.6 M6 以降では、SWT を使用して、プラットフォームに依存しない方法でテキスト、画像、または進行状況バーを TaskItem に重ねることができます。New and NoteworthySWT スニペットを参照してください。

于 2010-05-18T07:57:03.053 に答える
2

これを行うプラットフォームに依存しない方法はないと思います。プラットフォーム固有の API 呼び出しを確認し、JNI または JNA を介して実装する必要があります。

Windows の場合、これは私自身のアプリケーションの 1 つからのスニペットです。

public static void flashWindow(final Shell shell, boolean flashTray,
        boolean flashWindow) {
    try {
        if (isActiveWindow(shell)) {
            flashWindow = false;
            flashTray = false;
        }
        User32 lib = (User32) getLibrary("user32", User32.class);
        User32.FLASHWINFO flash = new User32.FLASHWINFO();
        flash.hWnd = new W32API.HANDLE(new W32API.UINT_PTR(shell.handle)
                .toPointer());
        flash.uCount = 2;
        flash.dwTimeout = 1000;
        if (flashTray || flashWindow) {
            flash.dwFlags = (flashTray ? User32.FLASHW_TRAY : 0)
                    | (flashWindow ? User32.FLASHW_CAPTION : 0);
        } else {
            flash.dwFlags = User32.FLASHW_STOP;
        }
        flash.cbSize = flash.size();
        if (lib.FlashWindowEx(flash) && !flashWindow) {
            final FocusListener focusListener = new FocusListener() {
                public void focusGained(FocusEvent arg0) {
                    flashWindow(shell, false, false);
                    shell.removeFocusListener(this);
                }

                public void focusLost(FocusEvent arg0) {
                }
            };
            shell.addFocusListener(focusListener);
        }
    } catch (UnsatisfiedLinkError e) {
    }
}

の簡略版は次のgetLibrary()とおりです。

protected static StdCallLibrary getLibrary(String libraryName,
        Class<?> interfaceClass) throws UnsatisfiedLinkError {
    try {
        StdCallLibrary lib = (StdCallLibrary) Native.loadLibrary(libraryName,
                interfaceClass);
        return lib;
    } catch (UnsatisfiedLinkError e) {
        Logger.out.error("Could not load " + libraryName + " library.");
        throw e;
    }
}

dispose()使い終わったら、ライブラリに注意してください。

于 2010-05-05T18:39:11.527 に答える
1

迷惑にならずにユーザーの注意を引くためにできることは、Windowsのテキストを変更することです。これは簡単です:

shellName.setText("task 20% complete")

これにより、ユーザーはウィンドウを最小化しながら更新を取得し、フォーカス リスナーを追加して、フォーカスが回復したときにウィンドウを通常のテキストに戻すことができます。これにより、ユーザーに通知する際の煩わしさを最小限に抑えることができます。

于 2010-05-17T21:15:23.533 に答える
0

プラグインにも同様の問題がありました。

私がやったことは、プログラムの小さなアイコンを下のステータスドックに作成することです(または、一番下にあるものは何でも)。プロセスやその他のバックグラウンド イベントの完了に基づいて、アイコンの色が変わり、点滅します (たとえば、初期設定が完了すると、灰色から緑色に変わります)。

このアイコンのダブルクリックまたは右クリックを状況依存にすることで、対応するウィンドウを開くなどの操作を行うことができます。

于 2010-05-17T21:32:50.543 に答える