example - Java: Destello de una ventana para captar la atención del usuario
java gui example button (2)
¿Hay una mejor manera de mostrar una ventana en Java que esta:
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);
}
Sé que este código da miedo ... Pero funciona bien. (Debo implementar un bucle ...)
Bueno, hay algunas mejoras menores que podríamos hacer. ;)
Usaría un temporizador para asegurarme de que las personas que llaman no tengan que esperar a que regrese el método. Y también sería bueno evitar más de una operación de flasheo a la vez en una ventana determinada.
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);
}
}
Hay dos formas comunes de hacerlo: use JNI para establecer sugerencias de urgencia en la ventana de la barra de tareas y cree un icono / mensaje de notificación. Prefiero la segunda forma, ya que es multiplataforma y menos molesto.
Consulte la documentación de la clase TrayIcon
, particularmente el método displayMessage()
.
Los siguientes enlaces pueden ser de interés: