Swing JFrame响应关闭事件的本机窗口

时间:2010-10-30 17:11:03

标签: java windows swing accessibility section508

我有一个Swing应用程序,它由一个设置为Always On Top的JFrame组成。

在Windows下运行时,我使用以下代码分别打开本机默认电子邮件客户端和浏览器:

Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + Utils.formatMailtoUrl(to, subject, body));
Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url);

由于JFrame设置为Always On Top,而典型的默认浏览器或电子邮件客户端(我们客户的IE和Outlook)未打开为Always On Top,前者阻碍了后者。

我们当前的“解决方案”是在打开本机窗口的同时最小化JFrame。但事实证明这是一个508合规问题,我们被要求:

  1. 不要最小化JFrame。
  2. 关闭浏览器或电子邮件客户端后,将焦点返回到JFrame
  3. 我想到的策略是“关闭”JFrame的Always On Top状态并拥有某种回调或事件监听器,它将通知JFrame电子邮件或浏览器窗口已关闭,然后切换JFrame返回Always On Top状态并设置焦点。

    因为这是一个Java应用程序,我担心这几乎是不可能的,因为我们正在谈论本机互操作。我的策略是否可行,是否有更好的可行策略,最重要的是,如何才能实现?!

    提前致谢!

2 个答案:

答案 0 :(得分:1)

我不确定是否有本机方法可以执行此操作,但您可以运行tasklist.exe或vb脚本,捕获结果并从那里确定Outlook或IExplore是否正在运行。这将要求您以合理的间隔运行检查,而不是等待事件。

Process p = Runtime.getRuntime().exec("tasklist.exe /FO CSV /FI eq outlook.exe");
BufferedReader input = new BufferedReader (new InputStreamReader(p.getInputStream()));
while ((line = input.readLine()) != null) {
    look for a line containing outlook.exe
}
input.close();

您必须单独检查outlook.exe和iexplorer.exe,因为我认为您不能在此OR上过滤任务列表。

我确信这可以推广到寻找原始电话打开的内容。

编辑:现在我已经写完了所有这些,我发现原来的调用返回了一个可以使用的进程。所以要尝试一下,启动一个新线程,打开该线程中的默认电子邮件程序或浏览器,删除“always on top”条件并在返回的进程上调用waitfor。通话结束后,设置“始终在线”状态。该线程将等待进程结束而不会锁定你的gui或其他程序函数。

答案 1 :(得分:0)

我在以下方面取得了一些成功:

  1. 当触发打开浏览器的操作(例如)时,请关闭JFrame Always On Top设置。
  2. 进行窗口焦点操作,打开JFrame Always On Top设置。
  3. 如果用户没有导航到除浏览器之外的任何其他窗口,那么当浏览器关闭时,JFrame将自动重新获得焦点,从而被设置回Always On Top
  4. 这种方法有两个缺点。第一个是用户可能会在关闭浏览器窗口之前手动返回JFrame窗口,导致JFrame重新获得焦点并陷入Always On Top模式。但这可能是可以接受的。第二个问题是,一旦JFrame重新获得焦点,JAWS版本9屏幕阅读器就会疯狂并重新读取最后一个焦点组件至少3次。