《量化投资:以MATLAB为工具》

MATLAB技术论坛

 找回密码
 注册账号
查看: 6751|回复: 9
收起左侧

[教程] [原创]利用Java.awt.Robot执行MATLAB命令窗口代码

    [复制链接]
发表于 2012-8-17 20:22:09 | 显示全部楼层 |阅读模式
由于最近在MATLAB中使用Java比较频繁,经常使用到Yair Altman的函数uiinspect(点击查看),在NetBeans中编写完Java代码后需要在MATLAB中测试,函数uiinspect在这个过程中相当好用,在此先感谢Yair Altman! Actually,all utilities that  Yair Altman submitted to the Matlab File Exchange is useful, and several of them have been selected for POTW.如此可见Yair Altman代码的强大.

下面就以一个在NetBeans中使用java测试网页连接时间,然后导入到MATLAB中进行测试的例子吧.在NetBeans 7.2中Ping.java文件内容:
2012-8-17 20-25-55.png

  1. package net;
  2. /*
  3. * 星夜回缘 2012-08-17-15-46-52 修改完成;
  4. */

  5. import java.io.IOException;
  6. import java.net.SocketTimeoutException;
  7. import org.apache.http.HttpResponse;
  8. import org.apache.http.client.methods.HttpGet;
  9. import org.apache.http.impl.client.DefaultHttpClient;

  10. /**
  11. * Pings a URL to query its status.
  12. * @author 星夜回缘
  13. */
  14. public class Ping {

  15.     /**
  16.      * Pings a URL to query its status. The method defaults to a 30 second timeout.
  17.      */
  18.     public static String ping() throws IOException {
  19.         return ping("http://www.google.com.hk", 30000, "ms");
  20.     }

  21.     public static String ping(String url) throws IOException {
  22.         return ping(url, 30000, "ms");
  23.     }

  24.     public static String ping(String url, int timeout) throws IOException {
  25.         return ping(url, timeout, "ms");
  26.     }

  27.     public static String ping(String url, int timeout, String secondflag) throws IOException {
  28.         if (url.isEmpty()){
  29.             url = "http://www.google.com.hk";
  30.         }
  31.         if (String.valueOf(timeout).isEmpty()){
  32.             timeout = 30000;
  33.         }

  34. // // HttpClient 4.2.1
  35. //        HttpClientParams httpClientParams = new HttpClientParams();
  36. //        httpClientParams.setSoTimeout(timeout);
  37. //        HttpClient httpClient = new HttpClient(httpClientParams);
  38. //        HttpMethod method = new GetMethod(url);

  39.         DefaultHttpClient httpClient = new DefaultHttpClient();
  40.         httpClient.getParams().setIntParameter("http.socket.timeout", timeout);

  41.         HttpGet method = new HttpGet(url);
  42. //        PingResponse pingResponse = new PingResponse();
  43.         try {
  44.             long startTime = System.currentTimeMillis();
  45.             long startTime_ = System.nanoTime();

  46.             HttpResponse response = httpClient.execute(method);

  47.             long endTime = System.currentTimeMillis();
  48.             long endTime_ = System.nanoTime();

  49.             int statusCode = response.getStatusLine().getStatusCode();
  50. //            pingResponse.setResponseCode(statusCode);
  51.             if (statusCode == 200) {
  52. //                pingResponse.setResponseStatus(ResponseStatus.Connect_Okey);
  53.                 if (secondflag.toLowerCase().equals("ms")) {
  54.                     String statusString = (endTime - startTime) + " ms";
  55.                     return statusString;
  56.                 } else {
  57.                     String statusString_ = (endTime_ - startTime_) + " ns";
  58.                     return statusString_;
  59.                 }
  60.             } else {
  61.                 return "Connect_Error";
  62.             }
  63.         } catch (SocketTimeoutException e) {
  64.             return "Connect_Timeout";
  65.         }
  66.     }

  67.     public static void main(String args[]) throws IOException {
  68.         String status = Ping.ping("http://www.google.com.hk");
  69.     }
  70. }
复制代码
在NetBeans中编译成.jar文件后,在MATLAB中使用javaaddpath或者直接添加到classpath.txt中静态加载,由于我经常要修改NetBeansForMATLAB.jar文件,所以我一般直接使用javaaddpath函数动态加载.但根据Yair AltmanThread Subject: Java classpath.txt中的说法,在动态加载出错的情况下应该测试静态是否可行,当然这不在本文的测试范围,到目前为止,我也只遇到过一次只能添加到classpath.txt中,而不能使用javaaddpath动态的加载.
  1. javaaddpath('C:\Users\Administrator\Documents\NetBeans\NetBeansForMATLAB\NetBeansForMATLAB.jar')
复制代码
如果想加载修改后的.jar文件,只需要clear java后再加载即可.OK,下面在MATLAB中继续进行...
  1. >> net.Ping.ping('http://www.matlabsky.com', 5000, 'ns')
  2. ans =
  3. 285543163 ns
  4. >> net.Ping.ping('http://www.matlabsky.com', 5000)
  5. ans =
  6. 435 ms
  7. >> net.Ping.ping('http://www.matlabsky.com/space-uid-42271.html')
  8. ans =
  9. 484 ms
  10. >> net.Ping.ping('http://hi.baidu.com/new/fuxianwublue', 3000, 'ns')
  11. ans =
  12. 322704157 ns
复制代码
当然这个只是最简单的,我们可以使用uiinspect('net.Ping')来查看ping的用法:

2012-8-17 19-16-58.png

到目前为止本文还没有进入正题,算了,本文的主题需要更改...{:soso_e144:}最简单的办法是在MATLAB界面中添加快捷方式,遇到的第一个问题是怎样保证将net.Ping输入到括号中,或者直接uiinspect net.Ping这样也行,其实两种本质上是一样的,就是怎样把它们合成一行.

这就要用到Nate Jensen的工具Dynamic Search Box中的java_robot或者Yair Altman的EditorMacro,或者Gautam Vallabha的MouseInput.你可以测试使用其它的工具,我选择的是java_robot.那么下面的代码就有了.
  1. str = clipboard('paste');
复制代码
Ok,似乎完成了我所想的功能,或者更近一步,可以直接添加一个快捷键,这个比较简单,就不说了.但实际上,上面会出现一个问题:

1. 在使用代码前,我得复制代码,能不能实现选择后,快捷键或者鼠标点击就完成命令?

2. 运行uiinspect(org.apache.http.conn.params.ConnRoutePNames)会出错,因为Object没用引号,好吗,uiinspect org.apache.http.conn.params.ConnRoutePNames间接解决了问题,那直接如何解决呢?简单:
  1. java_robot('normal',['uiinspect(''', str, ''')'], 'special','\Enter');
复制代码
应该会解决吧,但它没解决,因为java_robot中无法输出单引号!!!.多次尝试失败!!!那就直接使用java.awt.Robot来解决问题吧,实际上java_robot也是使用的java.awt.Robot来操作的.点此查看java.awt.Robot的API,在该说明中也可以查到单引号的虚拟键代码为KeyEvent.VK_QUOTE.现在就好办多了.一个if语句即可:
  1. str = clipboard('paste');

  2. if sum(str == '.') == 0
  3.     java_robot('normal',['uiinspect(', str, ')'], 'special','\Enter');
  4. else
  5.     robot = java.awt.Robot;
  6.     java_robot('normal', 'uiinspect(');

  7.     robot.keyPress(java.awt.event.KeyEvent.VK_QUOTE);
  8.     robot.keyRelease(java.awt.event.KeyEvent.VK_QUOTE);
  9.    
  10.     java_robot('normal', str);
  11.    
  12.     robot.keyPress(java.awt.event.KeyEvent.VK_QUOTE);
  13.     robot.keyRelease(java.awt.event.KeyEvent.VK_QUOTE);  
  14.    
  15.     java_robot('normal', ')');
  16.     java_robot('special','\Enter');
  17. end
复制代码
OK,下面解决第一个问题,执行前不用复制代码:
  1. mde = com.MathWorks.mde.desk.MLDesktop.getInstance;
  2. cw = mde.getClient('Command Window'); %actual edittable command window pane
  3. xCmdWndView = cw.getComponent(0).getViewport.getComponent(0);
  4. comm = xCmdWndView.getSelectedText;
复制代码
不过个人感觉并不是太好用,因为当你点击的时候会再现焦点转移,经常会出现问题,只是知道可以实现而已.

好像说完了啊.噢,还没有,设置快捷方式的问题,部分代码如下,可以自己进行测试
  1. jWindows = com.mathworks.mwswing.MJDialog.getWindows;
  2. jPosition = java.awt.Rectangle(x,y,width,heigth);
  3. jDesktop = com.mathworks.mde.desk.MLDesktop.getInstance;

  4. mainFrame = jDesktop.getMainFrame;
  5. for idx=1 : mainFrame.getComponentCount
  6.     if strcmp(get(mainFrame.getComponent(idx),'UIClassID'),'RootPaneUI')
  7.         rootPanel = mainFrame.getComponent(idx);
复制代码

算了,根据经验,隐藏部分内容吧.


转载请注明:http://www.matlabsky.com/forum.php?mod=viewthread&tid=29084


评分

参与人数 2威望 +2 贝壳 +11 贡献 +13 收起 理由
houxiaoping + 1 + 3
lijinfeng042 + 2 + 10 + 10 支持原创内容,有空学习下 混编java没有试.

查看全部评分

发表于 2012-8-17 20:34:57 | 显示全部楼层
不错,看看~~{:soso_e100:}
发表于 2012-8-17 22:13:46 | 显示全部楼层
顶顶顶顶当当
发表于 2012-8-21 01:27:54 | 显示全部楼层
楼主是高手,最近也准备用swing来丰富GUI,也经常用到Yair大神的程序,但是JAVA不是太熟,很是头疼哦
发表于 2012-8-25 18:31:37 | 显示全部楼层
看看你的帖子,呵呵
发表于 2013-11-17 16:29:14 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2013-11-21 13:22:47 | 显示全部楼层
VERY NICE INDEED.
回复 支持 反对

使用道具 举报

发表于 2014-1-22 11:53:00 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2014-5-30 09:03:33 | 显示全部楼层
高端,瞅瞅
回复 支持 反对

使用道具 举报

发表于 2016-12-19 19:46:42 | 显示全部楼层
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

QQ|网站地图|MATLAB技术论坛|Simulink仿真论坛 ( 蜀ICP备19014457号 

GMT+8, 2020-12-1 09:47 , Processed in 0.062483 second(s), 18 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表