2008-09-05 5 views
3

Y at-il une meilleure façon de clignoter une fenêtre en Java que ceci:Java: Flash une fenêtre pour attirer l'attention de l'utilisateur

public static void flashWindow(JFrame frame) throws InterruptedException { 
     int sleepTime = 50; 
     frame.setVisible(false); 
     Thread.sleep(sleepTime); 
     frame.setVisible(true); 
     Thread.sleep(sleepTime); 
     frame.setVisible(false); 
     Thread.sleep(sleepTime); 
     frame.setVisible(true); 
     Thread.sleep(sleepTime); 
     frame.setVisible(false); 
     Thread.sleep(sleepTime); 
     frame.setVisible(true); 
} 

Je sais que ce code est effrayant ... Mais cela fonctionne bien. (Je devrais implémenter une boucle ...)

Répondre

5

Il y a deux façons communes de le faire: utiliser JNI pour définir des conseils d'urgence sur la fenêtre de la barre des tâches, et créer une icône de notification/message. Je préfère la deuxième façon, car elle est multi-plateforme et moins ennuyante.

Voir documentation on the TrayIcon class, en particulier la méthode displayMessage().

Les liens suivants peuvent intéresser:

1

Eh bien, il y a quelques améliorations mineures que nous pourrions faire. ;)

Je voudrais utiliser un temporisateur pour s'assurer que les appelants n'ont pas à attendre le retour de la méthode. Et empêcher plus d'une opération de clignotement à la fois sur une fenêtre donnée serait bien aussi.

import java.util.Map; 
import java.util.Timer; 
import java.util.TimerTask; 
import java.util.concurrent.ConcurrentHashMap; 
import javax.swing.JFrame; 

public class WindowFlasher { 

    private final Timer timer = new Timer(); 
    private final Map<JFrame, TimerTask> flashing 
           = new ConcurrentHashMap<JFrame, TimerTask>(); 

    public void flashWindow(final JFrame window, 
          final long period, 
          final int blinks) { 
     TimerTask newTask = new TimerTask() { 
      private int remaining = blinks * 2; 

      @Override 
      public void run() { 
       if (remaining-- > 0) 
        window.setVisible(!window.isVisible()); 
       else { 
        window.setVisible(true); 
        cancel(); 
       } 
      } 

      @Override 
      public boolean cancel() { 
       flashing.remove(this); 
       return super.cancel(); 
      } 
     }; 
     TimerTask oldTask = flashing.put(window, newTask); 

     // if the window is already flashing, cancel the old task 
     if (oldTask != null) 
      oldTask.cancel(); 
     timer.schedule(newTask, 0, period); 
    } 
} 
Questions connexes