Java:刷新窗口以吸引用户的注意

时间:2020-03-05 18:47:59  来源:igfitidea点击:

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

我知道这段代码很可怕...但是它可以正常工作。 (我应该实现一个循环...)

解决方案

回答

好吧,我们可以做一些小的改进。 ;)

我将使用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);
    }
}

回答

有两种常用的方法来执行此操作:使用JNI在任务栏的窗口上设置紧急提示,并创建通知图标/消息。我更喜欢第二种方式,因为它是跨平台的,而且不那么烦人。

请参见" TrayIcon"类的文档,尤其是" displayMessage()"方法。

以下链接可能是我们感兴趣的:

  • Java SE 6中的新系统托盘功能
  • Java编程-图标化的窗口闪烁
  • 适用于Java早期版本的TrayIcon