Заставить Окно JFace мигнуть в панели задач или привлечь пользовательское внимание?

Интересно у кого-то есть любая идея, как решить это:

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

Я взглянул на org.eclipse.jface.window, но could'nt находят что-либо как этот, то же идет для документации SWT...

Другая вещь, которая стала по моему мнению - людьми, использует это приложение на Mac OS X и Linux также, есть ли платформа независимое решение, которое сообщит пользователю, что процесс закончился, но не принося окно к вершине?

Любые идеи очень приветствуются!

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

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

9
задан Community 23 May 2017 в 02:00
поделиться

4 ответа

Я не думаю, что есть независимый от платформы способ сделать это. Вам нужно будет взглянуть на вызовы 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 () библиотека, когда вы закончите с ней.

2
ответ дан 3 November 2019 в 07:12
поделиться

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

shellName.setText("task 20% complete")

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

1
ответ дан 3 November 2019 в 07:12
поделиться

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

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

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

0
ответ дан 3 November 2019 в 07:12
поделиться

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

2
ответ дан 3 November 2019 в 07:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: