I code it

Code and Life

在JSEvaluator使用外部的jar包

今天早上快起床时,忽然想到一个很妙的想法:由于JSEvaluator是基于Rhino的,那么在其中使用swing,那么可能会使得使用JSEvaluator做实验时更加有趣。

   1: importPackage(java.awt, java.awt.event);
   2: importPackage(Packages.javax.swing);
   3:  
   4: (function(title){
   5:     var frame = new JFrame(title);
   6:     frame.setSize(300, 150);
   7:     
   8:     var label = new JLabel("I'am a label");
   9:     frame.add(label);
  10:     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  11:     
  12:     frame.setVisible(true);
  13: })("Script frame");

 

上边的代码可以绘制一个JFrame,该Frame中包含一个大的Label(I am a label)。

image

去年发布过一个phoc(可编程的高阶计算器)的开源项目,曾为其添加了绘图模块,使用的是另一个开源项目jmathtools。当时在phoc中就是使用脚本来访问jmathtools来实现绘图的,那么我也可以在JSEvaluator中使用它了。去年的这个时候,phoc刚刚写完最初版本,其中有段脚本如下:

   1: /**
   2:  * author : juntao.qiu@gmail.com
   3:  * last update : 2011/1/21
   4:  *
   5:  * Thanks for the author of the niec library jmathplot Yann Richet, I'm using
   6:  * the jmathplot lib in this plugin and can thus plot the function in 2d/3d ways
   7:  *
   8:  * 
   9:  */
  10:  
  11: importPackage(Packages.javax.swing)
  12: importPackage(java.awt)
  13: importClass(org.math.array.DoubleArray)
  14: importClass(org.math.plot.Plot2DPanel)
  15: importClass(org.math.plot.Plot3DPanel)
  16:  
  17: /**
  18:  * a little helper for plot
  19:  */
  20: function increment(start, step, stop){
  21:     var x = [];
  22:     for(start; start+step < stop; start += step){
  23:         x.push(start);
  24:     }
  25: }
  26:  
  27: /**
  28:  * plot function 3d
  29:  */
  30: function plot3d(func, xrange, yrange){
  31:     var x = DoubleArray.increment(xrange.start, xrange.step, xrange.stop);
  32:     var y = DoubleArray.increment(yrange.start, yrange.step, yrange.stop);
  33:     
  34:     var name = func.toString();
  35:     
  36:     var z = (function(x, y){
  37:         var dims = new Array(y.length, x.length);
  38:         var r = java.lang.reflect.Array.newInstance(java.lang.Double.TYPE, dims);
  39:         for(var i = 0, len = x.length; i < len; i++){
  40:             for(var j = 0, len2 = y.length; j < len2; j++){
  41:                     r[j][i] = func(x[i], y[j]);
  42:             }
  43:         }
  44:         return r;
  45:     })(x, y);
  46:  
  47:     var plot = new Plot3DPanel("SOUTH");
  48:  
  49:     plot.addGridPlot(name, x, y, z);
  50:  
  51:     var frame = new JFrame("plot function : "+name);
  52:     frame.setSize(600, 600);
  53:     frame.setContentPane(plot);
  54:     frame.setVisible(true);
  55: }
  56:  
  57: var PI = Math.PI;
  58: var E = Math.E;
  59:  
  60: function sin(x){
  61:     return Math.sin(x);
  62: }
  63:  
  64: function cos(x){
  65:     return Math.cos(x);
  66: }
  67:  
  68: function cs(x, y){
  69:     return cos(PI*x) * sin(PI*y);
  70: }
  71:  
  72: plot3d(cs, {start:0.0, step:0.1, stop:1.0}, {start:0.0, step:0.05, stop:1.0});

 

在JSEvaluator中执行效果如下:

image

这个稍微有点不同,及jmathtools的jar包不是JDK自带的,因此访问的时候可能会找不到,可以通过修改JSEvaluator.jar中的MANIFEST.MF文件来实现:

   1: Class-Path: lib/jsyntaxpane-0.9.5-b29.jar lib/jmathplot.jar 
   2:  lib/jmatharray.jar lib/jmathio.jar

 

将MANIFEST.MF中的Class-Path属性修改为上述的形式,注意各个jar包通过空格隔开。然后再次运行即可。

Comments