在 Eclipse RCP 中运用 Open Flash Chart 展现图表

openkk 13年前
     <p><a name="1.Open Flash Chart 简介|outline"><span class="atitle">Open Flash Chart 简介</span></a></p>    <p>Open Flash Chart(OFC)是一个开源的 Flash 图表绘制工具,提供了各种程序接口的数据生成方式,包括 PHP、Ruby、Perl、Python、Java、.Net、AS、JS 等,OFC 2.0 提供了对 JSON 格式数据的支持。通过 Flash 展示的功能,很简单的就生成一份直观形象的数据统计图表,是制作 Flash 图形报表的不错开源工具。</p>    <p>OFC 的出现,源自作者作为客户经历的一个不愉快的故事。OFC 的作者曾经使用了某个公司开发的 Flash 图表软件,但在使用时出现了一个问题,于是作者写信去询问什么时候可以解决这个问题。令作者感到不愉快的是,过了三四个星期都没有得到答复。作者想,他应 该学习下Flash 和 Actionscript,自己写一个软件来用。因此,OFC 出现了!作者把 OFC 放到 sourceforge,作为一个免费的开源软件来发布。作者最后说,千万不要招惹你的客户 (don't piss off your customers) 。</p>    <p>Open Flash Chart 提供了很强大的图形报表绘制功能,依赖于 Flash,使得图形美观、流畅,具有很好的动态效果,因此,越来越受开发人员和用户的欢迎。</p>    <p>Open Flash Chart 所支持的统计样式比较丰富,包括: Line Chart,Bar Chart,Sketch Bar Chart, Horizontal Bar Chart, Stacked Bar Chart, Area Chart, Pie Chart, Scatter Chart, Radar Chart 等等。下面是部分样式的示例图。</p>    <br />    <a name="N100C8"><b>图 1. OFC 部分样式的示例图</b></a>    <br />    <img alt="在 Eclipse RCP 中运用 Open Flash Chart 展现图表" src="https://simg.open-open.com/show/167b9923f527b33a73f63b86d4a4eacc.jpg" width="582" height="621" />    <br />    <p><a name="2.Open Flash Chart 在 Web 上的应用|outline"><span class="atitle">Open Flash Chart 在 Web 上的应用</span></a></p>    <p>目前,Open Flash Chart 主要应用在 Web 开发上,实现了很好的图形效果。OFCGWT 项目是Google在 Web 方面应用 OFC 的一个实例。OFCGWT 基于 Open Flash Chart 2 开发,用于GWT 应用的开源图表制作组件。</p>    <p>Web 开发中,主要使用下面两个文件,</p>    <ul>     <li>open-flash-chart.swf: Flash 文件接口,通过该文件来生成 Flash 文件,备页面调用(在 web 目录下,与 WEB-INF 目录并级)。</li>    </ul>    <ul>     <li>swfobject.js: Flash 文件依赖的 JS 文件(在 web 目录下,与 WEB-INF 目录并级)。</li>    </ul>    <p><a name="N100EC"><span class="smalltitle">调用 open-flash-chart.swf</span></a></p>    <p>首先在页面中编写 script 脚本,保存页面为 chart.html。</p>    <br />    <a name="N100F7"><b>清单 1. chart.html</b></a>    <br />    <table class="ke-zeroborder" border="0" cellspacing="0" cellpadding="0" width="100%">     <tbody>      <tr>       <td class="code-outline"><pre class="displaycode">                                         <script type="text/javascript" src="js/swfobject.js"></script>                                         <script type="text/javascript"> swfobject.embedSWF("open-flash-chart.swf", "my_chart", "250", "200", "9.0.0");                                         </script>  <p>Hello World</p>                                         <div id="my_chart"></div> </pre></td>      </tr>     </tbody>    </table>    <br />    <p><a name="N100FE"><span class="smalltitle">编写 JSON 数据</span></a></p>    <p>其次,编写图表的 JSON 文本,将该文本保存为 data.json, 放在与 chart.html 同一个目录下。</p>    <br />    <a name="N10109"><b>清单 2. JSON 数据样本</b></a>    <br />    <table class="ke-zeroborder" border="0" cellspacing="0" cellpadding="0" width="100%">     <tbody>      <tr>       <td class="code-outline"><pre class="displaycode">{   "title":{     "text":  "Many data lines",     "style": "{font-size: 20px; color:#0000ff; font-family: Verdana; text-align: center;}"   },     "y_legend":{     "text": "Open Flash Chart",     "style": "{color: #736AFF; font-size: 12px;}"   },     "elements":[     {       "type":      "bar",       "alpha":     0.5,       "colour":    "#9933CC",       "text":      "Page views",       "font-size": 10,       "values" :   [9,6,7,9,5,7,6,9,7]     },     {       "type":      "bar",       "alpha":     0.5,       "colour":    "#CC9933",       "text":      "Page views 2",       "font-size": 10,       "values" :   [6,7,9,5,7,6,9,7,3]     }   ],     "x_axis":{     "stroke":1,     "tick_height":10,     "colour":"#d000d0",     "grid_colour":"#00ff00",     "labels": ["January","February","March","April","May",                 "June","July","August","Spetember"]    },     "y_axis":{     "stroke":      4,     "tick_length": 3,     "colour":      "#d000d0",     "grid_colour": "#00ff00",     "offset":      0,     "max":         20   } }</pre></td>      </tr>     </tbody>    </table>    <br />    <p><a name="N10110"><span class="smalltitle">OFC图表展示</span></a></p>    <p>在浏览器地址栏输入URL,比如:<a href="/misc/goto?guid=4959498117963038848">http://localhost:8080/chart/chart.html?ofc=data.json</a>, 就可以看到的图表效果。</p>    <br />    <a name="N1011E"><b>图 2. Web 图表效果</b></a>    <br />    <img alt="在 Eclipse RCP 中运用 Open Flash Chart 展现图表" src="https://simg.open-open.com/show/0e1790e7bf22cfc978976abade792c94.jpg" width="330" height="417" />    <br />    <br />    <p><a name="3.在 Eclipse RCP 中使用 Open Flash Chart|outline"><span class="atitle">在 Eclipse RCP 中使用 Open Flash Chart</span></a></p>    <p>目前,有许多应用的 GUI 是基于 Eclipse RCP 或者 SWT 开发的。但是 OFC 这样强大的图形报表工具还没有出现在 Eclipse RCP 应用中。在这些应用中也需要绘制图形报表,需要 Open Flash Chart 这样的工具来实现很好的图形效果。</p>    <p>Open Flash Chart 2 在 Eclipse RCP 中的使用很简单。在 SWT 组件中,通过 Flash 播放器来播放 open-flash-chart.swf,然后再加载图表的 JSON 格式数据即可。</p>    <p><a name="N10137"><span class="smalltitle">在 RCP 中播放 Open Flash Chart</span></a></p>    <p>要使用 Open Flash Chart,我们需要播放 open-flash-chart.swf 这个文件。在 Window 平台,我们使用包 org.eclipse.swt.ole.win32 提供的 Ole 组件来实现 Flash 的播放。</p>    <ol type="1">     <li>注册 Flash 组件</li>    </ol>    <p>首先创建一个 OleFrame 对象来作为容纳 Ole 对象的容器,然后再创建一个 Flash 类型的 Ole对象。"ShockwaveFlash.ShockwaveFlash" 为 Macromedia Flash 的 ShockwaveFlash 控件在 Windows 平台上的唯一标识符,程序将自动使用当前控件的最新版本。打开 Windows 注册表,在注册表中可以找到 HKEY_CLASSES_ROOT\ShockwaveFlash.ShockwaveFlash 相关项及对应版本。</p>    <br />    <a name="N1014B"><b>清单 3. 注册Flash组件</b></a>    <br />    <table class="ke-zeroborder" border="0" cellspacing="0" cellpadding="0" width="100%">     <tbody>      <tr>       <td class="code-outline"><pre class="displaycode">OleFrame oleFrame = new OleFrame(shell, SWT.NONE); oleFrame.setLayoutData(new GridData(GridData.FILL_BOTH)); OleControlSite controlSite =      new OleControlSite(oleFrame, SWT.NONE, "ShockwaveFlash.ShockwaveFlash"); controlSite.doVerb(OLE.OLEIVERB_SHOW); //定义为显示控件</pre></td>      </tr>     </tbody>    </table>    <br />    <ol type="1">     <li>通过 OleAutomation 来调用注册组件</li>    </ol>    <p>对 Active X 控件的操作通过 OleAutomation 对象来实现,并通过 automation.getIDsOfNames()来得到控件方法对应的 id 值。借助 OleView.exe 工具,可以查看 ActiveX 控件的方法。</p>    <br />    <a name="N1015D"><b>清单 4. 调用注册的 Flash 组件</b></a>    <br />    <table class="ke-zeroborder" border="0" cellspacing="0" cellpadding="0" width="100%">     <tbody>      <tr>       <td class="code-outline"><pre class="displaycode">final OleAutomation automation = new OleAutomation(controlSite); int[] methodIDs = automation.getIDsOfNames(new String[] { "LoadMovie" });</pre></td>      </tr>     </tbody>    </table>    <br />    <ol type="1">     <li>加载 JSON 文件</li>    </ol>    <p>通过 automation.invoke(int, Variant[]) 来调用 Active X 控件的方法。其中的 int 参数表示要调用的 Active X 控件的方法的 ID,Variant[] 参数就是要传递给 Active X 控件的方法的参数。</p>    <br />    <a name="N1016F"><b>清单 5. 加载 JSON 文件,调用控件</b></a>    <br />    <table class="ke-zeroborder" border="0" cellspacing="0" cellpadding="0" width="100%">     <tbody>      <tr>       <td class="code-outline"><pre class="displaycode">Variant[] methodArgs = {      new Variant(0), new Variant(file+"?data-file=jsonfile.txt ") };  automation.invoke(methodIDs[0], methodArgs);</pre></td>      </tr>     </tbody>    </table>    <br />    <p>在清单5中,String file 是 open-flash-chart.swf 的绝对路径,jsonfile.txt 是需要加载的 JSON 数据的文件路径。</p>    <p><a name="N10179"><span class="smalltitle">图表数据文件的生成</span></a></p>    <p>要通过 Open Flash Chart 来绘制图表,需要生成图表对应的 JSON 数据文件。我们使用 Json Tools 来对 JSON 进行处理。</p>    <ol type="1">     <li>使用 JSON Tools</li>    </ol>    <p>JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,基于 ECMAScript 标准中对ObjectLiteral 的定义 (ECMA-262, 11.1.5),通过一组键值对来定义一个对象。可以用 JSON 来描述一个图表,然后通过 Open Flash Chart 加载 JSON 数据持久化后的文本文本,就能展示这个图表。</p>    <p>JSON Tools 采用 Java 面向对象的方法对 JSON 的处理进行了封装。使用 JSON Tools 封装的API,可以很方便的对 JSON 格式的文本进行操作,进行 JSON 文本到 java 对象之间的相互转换。利用 JSON Tools,即使对 JSON 不是很了解的开发人员,也能很容易的构造出想要的 JSON 格式文本。在 <a href="/misc/goto?guid=4959498118050246671">http://developer.berlios.de/projects/jsontools/</a> 可以下载到 JSON Tools.</p>    <ol type="1">     <li>Chart 模型的设计</li>    </ol>    <p>我们根据 Chart 需要支持的相关属性来设计 Chart 的模型。依赖于 JSON Tools,采用策略模式进行 Chart 模型和 JSON 对象间的转换。下面是简单的设计类图。</p>    <br />    <a name="N1019C"><b>图 3. Chart 模型设计类图 </b></a>    <br />    <img alt="在 Eclipse RCP 中运用 Open Flash Chart 展现图表" src="https://simg.open-open.com/show/fff2d4d4536ba30b2138859dbcb4e31f.jpg" width="553" height="261" />    <br />    <p>各种不同类型的 Chart 需要继承和扩展 Element 来实现。通过 Chart 模型,使用面向对象的编程方法,只需调用 ChartData 里的 buildJSON 方法就可以构建展示 Flash 图表所需要的 JSON 格式的文本文件。</p>    <p>buildJSON 方法是从 Chart 模型到 JSON 对象转换的桥梁,这个方法中,根据 Chart 的属性和 JSON 文本的映射关系进行转换。这里给出 AbstractAxis 中的 buildJSON 方法:</p>    <br />    <a name="N101B1"><b>清单 6. buildJSON 方法</b></a>    <br />    <table class="ke-zeroborder" border="0" cellspacing="0" cellpadding="0" width="100%">     <tbody>      <tr>       <td class="code-outline"><pre class="displaycode">public JSONValue buildJSON()  {     JSONObject json = new JSONObject();         if (stroke != null)              json.getValue().put(                 "stroke",                  new JSONInteger(BigInteger.valueOf(stroke)));         if (colour != null)              json.getValue().put("colour", new JSONString(colour));      if (gridColour != null)              json.getValue().put("grid-colour", new JSONString(gridColour));      if (steps != null)              json.getValue().put("steps", new JSONInteger(BigInteger.valueOf(steps)));      if (offset != null)              json.getValue().put("offset", new JSONInteger(BigInteger.valueOf(offset)));      if (zdepth3d != null)              json.getValue().put("3d", new JSONInteger(BigInteger.valueOf(zdepth3d)));      if (min != null)              json.getValue().put("min", new JSONInteger(BigInteger.valueOf(min)));      if (max != null)              json.getValue().put("max", new JSONInteger(BigInteger.valueOf(max)));           return json;  }</pre></td>      </tr>     </tbody>    </table>    <br />    <p><a name="4.JFreeChart,BIRT Chart 和 Open Flash Chart 比较|outline"><span class="atitle">JFreeChart,BIRT Chart 和 Open Flash Chart 比较</span></a></p>    <p>JFreeChart,BIRT Chart 和 Open Flash Chart 是3种应用较多的图表绘制工具。这三种工具各有自身的优势。为了更好的对这3中图表绘制工具进行比较,我们基于 RCP 实现了这3种绘制工具对比的示例,下图给出了 Bar Chart 和 Area Chart 两种类型 chart 的对比。</p>    <br />    <a name="N101C2"><b>图 4. 三种 Charts 对比示例</b></a>    <br />    <img alt="在 Eclipse RCP 中运用 Open Flash Chart 展现图表" src="https://simg.open-open.com/show/a79a9b9f0cbc709336984b70c8c2e544.jpg" width="582" height="508" />    <br />    <p>JFreeChart 是一种基于 JAVA 语言的图表开发技术。 JFreeChart 可用于 Servlet,JSP,applet,Java Appication 环境中。 JFeeChart 中有 DataSet 这个数据集对象,提供了很强的数据处理的功能,并且还能对已经生成的图形进行调整和配置操作。</p>    <p>BIRT Chart 是基于 Eclipse 的开源报表工具。BIRT 可以产生 PNG, JPG, BMP, SVG 格式的图形,使得图形的使用范围很广泛。另外,BIRT 有很强的数据访问的功能,提供了 JDBC, XML, Web Services 和 Flat File 数据源处理的支持。</p>    <p>Open Flash Chart 是 Flash 图形报表工具。它最大的特点就是使用简单,图形美观,拥有很好的动态效果。对于 OFC2,它只需加载一个图形对应的 JSON 格式文本,就能在 Flash 中展示图形报表,可以通过修改 JSON 文本来改变图形的数据和展现效果。</p>    <br />    <a name="表格1|table"><b>表 1. 三种 charts 比较</b></a>    <br />    <table class="ibm-data-table ke-zeroborder" border="0" cellspacing="0" cellpadding="0">     <tbody>      <tr>       <td style="text-align:center;vertical-align:middle;"><strong>Name</strong> </td>       <td style="text-align:center;vertical-align:middle;"><strong>License</strong> </td>       <td style="text-align:center;vertical-align:middle;"><strong>Latest Version</strong> </td>       <td style="text-align:center;vertical-align:middle;"><strong>OSSC Review Level 1 in IBM</strong> </td>      </tr>      <tr>       <td style="text-align:left;vertical-align:top;">JFreeChart</td>       <td style="text-align:left;vertical-align:top;">LGPL</td>       <td style="text-align:left;vertical-align:top;">1.0.11</td>       <td style="text-align:left;vertical-align:top;">No</td>      </tr>      <tr>       <td style="text-align:left;vertical-align:top;">BIRT Chart</td>       <td style="text-align:left;vertical-align:top;">Eclipse Public License 1.0</td>       <td style="text-align:left;vertical-align:top;">2.3.1</td>       <td style="text-align:left;vertical-align:top;">Yes</td>      </tr>      <tr>       <td style="text-align:left;vertical-align:top;">Open Flash Chart</td>       <td style="text-align:left;vertical-align:top;">LGPL</td>       <td style="text-align:left;vertical-align:top;">2</td>       <td style="text-align:left;vertical-align:top;">No</td>      </tr>     </tbody>    </table>    <br />    <br />    <p><a name="resources"><span class="atitle">参考资料 </span></a></p>    <ul>     <li>查看 <a href="/misc/goto?guid=4958183401282618874">Open Flash Chart 项目主页</a>。 <br /> <br /> </li>     <li>下载 <a href="/misc/goto?guid=4959498118294193085">Open Flash Chart 2</a>。 <br /> <br /> </li>     <li>查看 <a href="/misc/goto?guid=4959498118385316939">Google OFCGWT 项目</a>。 <br /> <br /> </li>     <li><a>如何使用 Flash 控件请参考《Eclipse从入门到精通》第 2 版的访问 ActiveX 章节。</a><br /> <br /> </li>     <li>在 Windows 中使用 Active X 控件,请参考 <a href="/misc/goto?guid=4959498118562029250">BlogJava 上相关文章</a>。 <br /> <br /> </li>     <li><a>OleView.exe 来自 Windows 资源工具包“Windows Resource Kit Tools”,可以从 Windows 网站上下载。</a> <br /> <br /> </li>     <li>查看 <a href="/misc/goto?guid=4959498118645888318">Introducing JSON</a>。 <br /> <br /> </li>     <li>下载 <a href="/misc/goto?guid=4959498118050246671">Java JSON Tools</a>。 <br /> <br /> </li>     <li>了解 <a href="/misc/goto?guid=4958201349754676817">JFreeChart</a><br /> <br /> </li>     <li><a href="/misc/goto?guid=4958184743724309295">Business Intelligence and Reporting Tools</a><br /> <br /> </li>     <li>在 <a href="/misc/goto?guid=4959498118918712940">Eclipse Plugin 中使用 BIRT Chart</a>。 <br /> <br /> </li>     <li>访问 developerWorks <a href="/misc/goto?guid=4959498118997613166">开放源码专区</a> 获得丰富的 how-to 信息、工具和项目更新,帮助您用开放源码技术进行开发,并将它们结合 IBM 产品使用。<br /> <br /> </li>     <li>查看 IBM developerWorks 的 <a href="/misc/goto?guid=4959498119077755370">Eclipse 项目资源</a>,提高您的 Eclipse 技巧。</li>    </ul>    <p><a href="/misc/goto?guid=4959498119163053654" target="_blank">http://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ofc/</a></p>