概述Swing JFrame在closures事件时响应本机窗口
我有一个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设置为始终在最前面,而典型的默认浏览器或电子邮件客户端(我们客户的IE和Outlook)并不像Always On top一样打开,所以前者阻碍了后者。
我们目前的“解决scheme”是在打开本机窗口的同时最小化JFrame。 但事实certificate,这是一个508合规问题,我们被要求:
不要最小化JFrame。
浏览器或电子邮件客户端closures后,将焦点返回给JFrame
我想到的策略是“closures”JFrame的Always On top状态,并具有某种callback或事件侦听器,它将通知JFrame电子邮件或浏览器窗口已closures,然后将JFrame切换回始终处于顶部状态并设置焦点。
因为这是一个Java应用程序,我担心这是不可能的,因为我们正在谈论本地互 *** 作。 我的战略是否可行,是否有更好的可行战略,最重要的是,如何做到这一点?
提前致谢!
我不确定是否有本地方式来执行此 *** 作,但是可以运行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,因为我不认为你可以过滤这个或任务列表。
我敢肯定,这可以推广到寻找你原来的电话打开的任何东西。
编辑:现在,我已经写了所有这一切,对我来说,你的原始调用返回一个过程,可以使用。 因此,可以尝试一下,启动一个新线程,在该线程中打开默认的电子邮件程序或浏览器,删除“always on top”条件并在返回的进程上调用waitfor。 通话结束后,设置“始终在最上面”的条件。 该线程将等待进程结束而不锁定您的GUI或其他程序功能。
我在以下方面取得了一些成功:
当打开浏览器(例如)的 *** 作被触发时,关闭JFrame Always On top设置。
有一个窗口焦点动作,打开JFrame永远在上面设置。
如果用户没有导航到浏览器以外的任何其他窗口,那么当浏览器关闭时,JFrame将自动重新获得焦点,从而被重新设置为Always On top
我用这种方法看到两个缺点。 首先是用户可能会在关闭浏览器窗口之前手动返回到JFrame窗口,导致JFrame重新获得焦点并陷入Always On top模式。 但这可能是可以接受的。 第二个问题是JAWS版本9屏幕阅读器变得疯狂,并且一旦JFrame重新获得焦点,重新读取最后聚焦的组件至少3次。
总结
以上是内存溢出为你收集整理的Swing JFrame在closures事件时响应本机窗口全部内容,希望文章能够帮你解决Swing JFrame在closures事件时响应本机窗口所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
请登录后查看评论内容