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