JFace-Fenster in der Taskleiste blinken lassen oder die Aufmerksamkeit des Benutzers erregen?

StackOverflow https://stackoverflow.com/questions/2773364

Frage

Ich frage mich, ob jemand eine Idee hat, wie man das löst:

In meinem Java-Eclipse-Plugin gibt es einige Prozesse, die einige Zeit dauern.Daher könnte der Benutzer Minimieren Sie das Fenster und lass das Prozess läuft im Hintergrund.
Nun, wenn die Der Vorgang ist abgeschlossen, ich kann das Fenster zwingen, wieder nach oben zu kommen, aber das ist ein Tabu für die Benutzerfreundlichkeit.Ich möchte lieber, dass der Prozess funktioniert blinken im Taskleiste stattdessen.Gibt es eine Möglichkeit, dies zu erreichen?

Ich habe mir das angeschaut org.eclipse.jface.window Konnte aber nichts dergleichen finden, das Gleiche gilt für die SWT-Dokumentation ...

Eine andere Sache, die mir in den Sinn kam, ist, dass die Leute diese App verwenden Mac OS X Und Linux Gibt es auch eine Plattformunabhängige Lösung, wodurch der Benutzer darüber informiert wird, dass der Vorgang abgeschlossen ist, das Fenster jedoch nicht nach oben angezeigt wird?

Alle Ideen sind herzlich willkommen!

Bearbeiten:
Ich habe herausgefunden, dass der Benutzer unter Windows einstellen kann, ob er das Erzwingen des Vordergrunds aktivieren möchte oder nicht.Wenn diese Option deaktiviert ist, blinkt die Aufgabe nur in der Taskleiste ...
Hier ist ein gutes lesen auf diesem...

Wenn jemand vielleicht eine plattformunabhängige Möglichkeit kennt, dieses Verhalten zu erreichen, teilen Sie mir bitte Ihr Wissen mit!

War es hilfreich?

Lösung

Ich glaube nicht, dass es dafür eine plattformunabhängige Möglichkeit gibt.Sie müssen sich die plattformspezifischen API-Aufrufe ansehen und diese über JNI oder JNA implementieren.

Für Windows ist hier ein Ausschnitt aus einer meiner eigenen Anwendungen:

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) {
    }
}

Hier ist eine vereinfachte Version von 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;
    }
}

Achte auf dispose() die Bibliothek, wenn Sie damit fertig sind.

Andere Tipps

Nun ja, das ist nicht gerade ein Wunder, aber seit Eclipse 3.6 M6 können Sie mit SWT plattformunabhängig Text, Bilder oder Fortschrittsbalken in das TaskItem einblenden.Siehe die Neu und bemerkenswert und das SWT-Ausschnitt.

Was Sie tun können, um die Aufmerksamkeit des Benutzers zu erregen, ohne zu stören, ist, den Windows-Text zu ändern. Dies ist mit einem einfachen Trick möglich:

shellName.setText("task 20% complete")

Dies würde es dem Benutzer ermöglichen, ein Update zu erhalten, während das Fenster minimiert ist, und dann einen Fokus-Listener hinzuzufügen, um das Fenster auf seinen normalen Text zurückzusetzen, wenn der Fokus wiedererlangt wird.Dies würde eine minimale Eindringlichkeit bei der Information des Benutzers ermöglichen.

Ich hatte ein ähnliches Problem mit meinem Plug-in.

Am Ende habe ich im unteren Statusdock (oder wie auch immer das Ding unten heißt) ein kleines Symbol für mein Programm erstellt.Basierend auf dem Abschluss von Prozessen und anderen Hintergrundereignissen ändert mein Symbol die Farbe und blinkt (z. B. wechselt es von Grau zu Grün, wenn die Ersteinrichtung abgeschlossen ist).

Indem ich kontextsensitiv Doppelklicks oder Rechtsklicks auf dieses Symbol mache, kann ich dann beispielsweise ein entsprechendes Fenster öffnen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top