百度首页 | 百度空间
 
查看文章
 
使用JDIC浏览器之全局快键问题
2007-11-30 11:52

在使用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>


类别:技术 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码:
 

     

©2008 Baidu