Pregunta

Estoy desarrollando una aplicación Swing y necesito actualizar la barra de tareas de Windows. No puedo usar frame.requestFocus() porque no quiero robar el foco de ninguna otra aplicación.

¿Fue útil?

Solución

No sé si se aplica a las versiones más recientes de Windows, pero el método .toFront () se utiliza para mostrar la ventana si ninguna de las ventanas de la VM actual estaba en primer plano.

Esto significa que llamar a frame.toFront () en un marco minimizado siempre hará que parpadee ...

Otros consejos

JNIWrapper con su extensión winpack puede hacer lo que quiera.

La demostración en el sitio lo muestra en acción.

Puede forzar-minimizar su GUI y .toFront - en ella:

        Gui.frame.setState(Frame.ICONIFIED);
        for (int i = 0; i < 3; i++) {
            Thread.sleep(10);
            Gui.frame.toFront();
            Thread.sleep(10);
            Gui.frame.setVisible(false);
            Thread.sleep(10);
            Gui.frame.toBack();
            Thread.sleep(10);
            Gui.frame.setVisible(true);
        }
        // be creative!!

que lamentablemente eliminará el foco de la ventana activa. Puede encontrar la ventana activa y reactivarla después. Pero aún así, el parpadeo solo durará unos tres segundos.

... o diríjase a la raíz del asunto utilizando una DLL -call en FlashWindow. No es posible llamar a dlls con un código Java limpio, necesitará la ayuda de otros lenguajes de programación, como p. Ej. con JNA . Aparte de eso, también podría escribir su propio programa en otro idioma y llamarlo desde su aplicación Java. Daré un ejemplo en AutoHotkey a continuación:

Código de AutoHotkey:

    if 0 != 1       ; note: in ahk, 1 corresponds args[1] and 0 corresponds args.length
    {
        msgbox, There needs to be ONE parameter passed over to this file, which is the name of the window that should be flashed.
        ExitApp
    }
    programName = %1%
    winget, hWnd, ID, %programName%
    DllCall("FlashWindow",UInt,hWnd,Int,True)

compilado en un archivo llamado flash.exe, puesto en su directorio de trabajo de Java, puede llamarlo desde cualquier función:

    Runtime.getRuntime().exec("./flash.exe \"" + MyJFrame.getTitle() + "\"");

Alternativamente, uno podría usar AutoHotkey.dll y acceder a él dentro del código Java (hay guías sobre cómo hacerlo en Internet), por lo que no sería necesario ningún archivo exe externo.

Si aún tiene problemas para lograr el parpadeo en la barra de tareas de Windows, ¡avíseme!

La mejor manera de hacer esto:

if (!isFocused()) {
        setVisible(false);
        setVisible(true);
    }

Usando Swing per se, muy probablemente no puedas; eso es algo específico de Windows.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top