Есть ли лучший способ прошить окно на Java, чем этот:
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);
}
Я знаю, что этот код страшный ... Но работает нормально. (Я должен реализовать цикл ...)




Что ж, есть несколько небольших улучшений, которые мы могли бы сделать. ;)
Я бы использовал таймер, чтобы убедиться, что вызывающим абонентам не нужно ждать возврата метода. Также было бы неплохо предотвратить более одной операции мигания одновременно в данном окне.
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);
}
}
Есть два распространенных способа сделать это: использовать JNI для установки подсказок срочности в окне панели задач и создать значок / сообщение уведомления. Я предпочитаю второй способ, так как он кроссплатформенный и менее раздражающий.
См. документация по классу TrayIcon, особенно метод displayMessage().
Следующие ссылки могут быть интересны:
TrayIcon для более ранних версий Java