Question

Je développe une application Swing et je dois flasher la barre des tâches Windows. Je ne peux pas utiliser frame.requestFocus() car je ne veux pas voler le focus d'une autre application.

Était-ce utile?

La solution

Je ne sais pas si cela s'applique aux versions plus récentes de Windows, mais la méthode .toFront () permettait de faire clignoter la fenêtre si aucune des fenêtres de la machine virtuelle actuelle n'était au premier plan.

Cela signifie que l'appel de frame.toFront () sur une image réduite le ferait toujours clignoter ...

Autres conseils

JNIWrapper avec son extension winpack peut faire ce que vous voulez.

La démonstration sur le site le montre en action.

Vous pouvez forcer la minimisation de votre interface graphique et .toFront - en it:

        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!!

qui va malheureusement enlever le focus de la fenêtre active. Vous pouvez trouver la fenêtre active et la réactiver par la suite. Néanmoins, le clignotement ne durera que trois secondes environ.

... ou allez au fond des choses en utilisant un DLL -appel sur FlashWindow. L'appel de dll n'est pas possible avec du code Java propre, vous aurez besoin de l'aide d'autres langages de programmation, par exemple, possible. avec la la JNA . Sinon, vous pouvez également écrire votre propre programme dans un autre langage et l'appeler à partir de votre application Java. Je vais donner un exemple dans AutoHotkey ci-dessous:

Code de clé automatique:

    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)

compilé dans un fichier nommé flash.exe, placé dans votre répertoire de travail Java, vous pouvez l'appeler à partir de n'importe quelle fonction:

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

Sinon, vous pouvez utiliser AutoHotkey.dll et y accéder dans le Javacode (il existe des guides sur la procédure à suivre sur Internet), de sorte qu'aucun fichier exe externe ne sera nécessaire.

Si vous rencontrez toujours des problèmes pour réaliser le clignotement dans la barre des tâches de Windows, merci de me le signaler!

La meilleure façon de faire cela:

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

En utilisant Swing en soi, vous ne pourrez probablement pas; c'est une chose spécifique à Windows.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top