Заставить JFace Window мигать на панели задач или привлечь внимание пользователей? - PullRequest
9 голосов
/ 05 мая 2010

Интересно, кто-нибудь знает, как решить эту проблему:

В моем плагине Java Eclipse есть некоторые процессы, которые занимают некоторое время. Поэтому пользователь может свернуть окно и разрешить процессу работать в фоновом режиме .
Теперь, когда процесс завершен , я могу заставить окно снова подняться на вершину, но это удобно для использования. Я бы предпочел, чтобы процесс мигал на панели задач . Есть ли способ добиться этого?

Я взглянул на org.eclipse.jface.window , но ничего подобного не смог найти, то же самое касается документации SWT ...

Еще одна вещь, которая пришла мне в голову - поскольку люди используют это приложение на mac os x и linux , есть ли независимое от платформы решение , которое будет сообщить пользователю, что процесс завершен, но без вывода окна наверх?

Любые идеи приветствуются!

Edit:
Я обнаружил, что в Windows пользователь может настроить, хочет ли он включить силу на передний план или нет. Если этот параметр отключен, задача будет просто мигать на панели задач ...
Вот хороший читать на этом ...

Если кто-то знает о каком-либо независимом от платформы способе достижения такого поведения, поделитесь со мной своими знаниями!

Ответы [ 4 ]

2 голосов
/ 18 мая 2010

Ну, это не совсем мигает, но, начиная с Eclipse 3.6 M6, вы можете наложить текст, изображение или индикатор выполнения на TaskItem независимо от платформы с помощью SWT. См. Новый и заслуживающий внимания и SWT-фрагмент .

2 голосов
/ 05 мая 2010

Я не думаю, что есть независимый от платформы способ сделать это. Вам нужно взглянуть на вызовы API для конкретной платформы и реализовать их через JNI или JNA.

Для Windows вот фрагмент из одного из моих собственных приложений:

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() библиотеке, когда закончите с ней.

1 голос
/ 18 мая 2010

То, что вы могли бы сделать, чтобы привлечь внимание пользователей, не раздражая, - это изменить текст окна, который можно переносить с помощью простого:

shellName.setText("task 20% complete")

это позволит пользователю получить обновление при свернутом окне, а затем добавить слушателя фокуса, чтобы вернуть окно к его обычному тексту, когда фокус будет восстановлен. Это позволит обеспечить минимальное вмешательство при информировании пользователя.

0 голосов
/ 18 мая 2010

У меня была похожая проблема с моим плагином.

Я закончил тем, что создал маленькую иконку для моей программы в нижней панели статуса (или как там называется эта вещь внизу). На основании завершения процессов и других фоновых событий мой значок меняет цвет и мигает (например, меняет цвет с серого на зеленый после завершения первоначальной настройки).

Делая двойной щелчок или щелчок правой кнопкой мыши на этом значке с учетом контекста, я могу сделать такие вещи, как открыть соответствующее окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...