Java: прошить окно, чтобы привлечь внимание пользователя - PullRequest
3 голосов
/ 05 сентября 2008

Есть ли лучший способ прошить окно в 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);
}

Я знаю, что этот код страшен ... Но он работает хорошо. (Я должен реализовать цикл ...)

Ответы [ 2 ]

5 голосов
/ 05 сентября 2008

Существует два распространенных способа сделать это: использовать JNI, чтобы установить подсказки срочности в окне панели задач, и создать значок / сообщение уведомления. Я предпочитаю второй способ, так как он кроссплатформенный и менее раздражающий.

См. документацию по TrayIcon классу , в частности, по методу displayMessage().

Следующие ссылки могут представлять интерес:

1 голос
/ 05 сентября 2008

Ну, есть несколько небольших улучшений, которые мы могли бы сделать. ;)

Я бы использовал Timer, чтобы вызывающие абоненты не ожидали возврата метода. И предотвращение более чем одной операции мигания за один раз для данного окна тоже было бы неплохо.

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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...