2008-09-05 24 views
3

orada bundan daha Java bir pencere yanıp daha iyi bir yolu var mı kullanıcının dikkatini çekmeye:Java: Flaş bir pencere

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

Bu kod korkutucu olduğunu biliyoruz ... Ama tamam çalışır. (Ben bir döngü uygulamalıdır ...)

cevap

5

Bunu yapmanın iki ortak yolu vardır: görev çubuğu penceresinde aciliyet ipuçlarını ayarlama ve bildirim simgesi/mesajı oluşturmak için JNI kullanın. o çapraz platform ve daha az rahatsız edici olduğundan ben ikinci yolu tercih ediyorum.

documentation on the TrayIcon class, özellikle displayMessage() yöntem bakınız.

Aşağıdaki bağlantılar ilginizi çekebilecek:

1

Eh, yapabiliriz birkaç küçük iyileştirmeler vardır. ;)

Eminim arayanlar yöntem dönmek için beklemek gerekmez yapmak için bir Timer kullanmak. Ve belirli bir pencerede bir defada birden fazla yanıp sönen çalışmasını engelleyen çok güzel olurdu.

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