在使用JDIC在Swing程序中加入了浏览器,但是却发现在使用浏览器后,Swing监听不到全局快键了,测试以后发现被浏览器拿走,无限郁闷ing……
后使用两种方式,一是使用线程,按特定时间将焦点还给出外面的Frame,这可以处理只读的网页问题,但是如果有输入或是选择框时,则无法使用,因为焦点一走,网页的元素的焦点没了。
向JDIC开发组求救,然未果,无奈,只能做如下解决:
1. 在程序中内嵌一个jetty服务器,监听一个端口,如8000,后台使用一个Servlet接收HTTP请求。Servlet内容大致如下:
public class MainServlet extends HttpServlet implements ILogger{
private PrintWriter out;
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException{
try{
out = response.getWriter();
if(request.getParameter("keyCode") != null){
int keyCode = Integer.parseInt(request.getParameter("keyCode"));
System.out.println(url + "..........from browser------" + keyCode);
// 键盘事件相关处理
out.print("<script language='javascript'>history.go(-1);</script>");
}
}catch(Exception e){
logger.error("Servlet processor Exception:", e);
}
}
}
2. 在网页做如下处理:
2.1. 增加键盘监听脚本
<SCRIPT LANGUAGE="JavaScript">
<!--
var pscHTMLStr="<form name='focusform' action='http://127.0.0.1:8000' method='post'>";
pscHTMLStr+="<input type='hidden' name='keyCode' value=''></form>";
document.write(pscHTMLStr);
document.onkeydown=function(){
if ((event.keyCode >= 112 && event.keyCode <=123) || event.keyCode ==27){
document.all.keyCode.value = event.keyCode;
document.all.focusform.submit();
history.go(-1);
event.keyCode=0;
event.returnValue=false;
}
};
//-->
</SCRIPT>
2.2. 增加焦点获取处理,这个是因为如果没有这处理的话,则在打开网页后会找不到焦点了,虽然Swing说焦点在RootPane那里,可是仍无法监听,这一步即让网页取得焦点,从而可以使上面的脚本有效,加在网页尾部。
<a href='#' id='focusLink'></a>
<SCRIPT LANGUAGE="JavaScript">
<!--
document.all.focusLink.focus();
//-->
</SCRIPT>
如上解决方法仅在网页也是自己提供的情况可用,否则就需要专门进行转发了,在转发过程中加上相关处理的内容。
----------------------------------------------------------
修改稿如下:
只要在网页尾部增加如下代码,可:
<a href='#' id='focusLink'></a>
<SCRIPT LANGUAGE="JavaScript">
<!--
document.all.focusLink.focus();
document.onkeydown=function(){
if ((event.keyCode >= 112 && event.keyCode <=123) || event.keyCode ==27){
document.all.focusLink.href="http://127.0.0.1:8000?keyCode=" + event.keyCode;
document.all.focusLink.click();
history.go(-1);
event.keyCode=0;
event.returnValue=false;
}
};
//-->
</SCRIPT>
----------------------------------------------------------
又在jdic浏览器老是被windows叫停时,又看到jdicplus,于是加上,再遇老问题,即焦点或是键盘监听处理,于是又是一通查找,至参考http://zhengrenchi.blogbus.com/logs/18012768.html之做法,改进之如下:
1. implements BrComponentListener
@Override
public String sync(BrComponentEvent e) {
switch (e.getID()) {
case BrComponentEvent.DISPID_TITLECHANGE:
System.out.println("标题修改................." + e.getValue());
break;
}
return null;
}
2. BrComponent实例,增加上述实现brMain.addBrComponentListener(this);
3. 在被调用的网页中:
<script type="text/javascript">
document.onkeydown=function(){
document.title = event.keyCode;
}
</script>