Come posso eseguire il flashing della barra delle applicazioni di Windows usando Swing?

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

  •  20-08-2019
  •  | 
  •  

Domanda

Sto sviluppando un'applicazione Swing e devo eseguire il flashing della barra delle applicazioni di Windows. Non riesco a usare frame.requestFocus() perché non voglio rubare lo stato attivo da qualsiasi altra applicazione.

È stato utile?

Soluzione

Non so se si applica alle versioni più recenti di Windows, ma il metodo .toFront () utilizzato per eseguire il flashing della finestra se nessuna delle finestre della VM corrente era in primo piano.

Ciò significa che chiamare frame.toFront () su un frame minimizzato lo farebbe sempre lampeggiare ...

Altri suggerimenti

JNIWrapper con la sua estensione winpack può fare quello che vuoi.

La demo sul sito la mostra in azione.

Puoi minimizzare forzatamente la tua GUI e .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!!

che purtroppo rimuoverà lo stato attivo dalla finestra attiva. Potresti scoprire la finestra attiva e riattivarla in seguito. Tuttavia, il lampeggiamento durerà solo per circa tre secondi.

... o vai alla radice della questione usando una DLL -call su FlashWindow. Chiamare DLL non è possibile con un codice Java pulito, avrai bisogno dell'aiuto di altri linguaggi di programmazione, possibile ad es. con JNA . Oltre a ciò, potresti anche scrivere il tuo programma in un'altra lingua e chiamarlo dalla tua applicazione Java. Fornirò un esempio in AutoHotkey di seguito:

Codice 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)

compilato in un file chiamato flash.exe, inserito nella tua directory di lavoro Java, puoi chiamarlo da qualsiasi funzione:

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

In alternativa, si potrebbe usare AutoHotkey.dll e accedervi all'interno del Javacode (ci sono guide su come farlo su Internet), quindi non ci sarebbe bisogno di alcun file exe esterno.

Se hai ancora problemi a ottenere il lampeggiamento nella barra delle applicazioni di Windows, faccelo sapere!

Il modo migliore per farlo:

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

Usando Swing di per sé, molto probabilmente non puoi; questa è una cosa specifica di Windows.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top