swing嵌入ocx或dll影像控件

来源:互联网 发布:手机淘宝尺码怎么设置 编辑:程序博客网 时间:2024/05/16 07:08
关于swing嵌入ocx或dll影像控件的问题,自己研究了一下,今天发出来给大家共享一下
swing调用OCX或dll的方法有很多,其中包括:jcob、comfyj、jawin、jni、jna等等很多方式,但是如果要显示dll或ocx的控件在swing界面上,就有点麻烦了,就像ocx在IE中显示的<object...>对象一样。
这几种我都实验过,最好用的还是comfyj,但是这个东东最后发现是收费的,而且还不菲~~,如果给客户使用可能存在风险,所以就抛弃了。
然后实验jcob,jcob大家应该都非常熟悉,其实只调用ocx的方法的话,就他就能够满足了,但是如果是ocx或dll视频控件在你的swing程序上显示出来,就非常麻烦了,网上找了很久,也没找到可供参考的资料。最后作罢。
再然后又测试的jawin,最终jawin可以正确展示我的ocx/dll控件视频框,但是好像仅仅支持加载32位动态库,如果是64位的,百度和谷歌了很久也没找到,最后在csdn一个论坛里找了一个加载不报错的,但是不能用~~,郁闷了。

再最后,看到一篇文章,SWT中可以显示word文档,然后心想应该有门,所以又做了测试,并且最终测试成功,现在能在swing上显示32位和64位的动态库或ocx的影像控件了~~~~~~

原理: 用SWT显示控件的视频框,然后将SWT放在swing界面上,然后通过SWT调用封装的dll方法实现交互调用
前提: 用到的OCX或dll必须在系统注册表中已经注册,通过regsvr32 xxxx.dll命令

/** * 人脸采集控件的SWT图形控件 */private static Canvas swtCanvas = new Canvas() {private static final long serialVersionUID = 1L;@Overridepublic void addNotify() {super.addNotify();synchronized (getTreeLock()) {// 另起线程,以免阻塞new Thread() {public void run() {......// swt的初始化Display display = new Display();Shell _shell = SWT_AWT.new_Shell(display, swtCanvas);_shell.setLayout(new org.eclipse.swt.layout.RowLayout());// 加载第一个ocx窗口OleFrame _frameL = new OleFrame(_shell, SWT.NONE);// tesoClsid : 注册表中已注册的控件PROGID,也就是nameOleControlSite _siteL = new OleControlSite(_frameL, SWT.NONE, tesoClsid);_siteL.doVerb(OLE.OLEIVERB_SHOW);_siteL.setSize(400, 300);......_shell.pack();while (!_shell.isDisposed()) {if (!display.readAndDispatch()) {display.sleep();}}}}.start();}}};......//然后在swing的jPanel中放入swtCanvasjPanelCapture.add(swtCanvas);



具体的代码实现,请到我在CSDN上传的资料中下载 http://download.csdn.net/detail/yangyanhe/9383932
2 0
原创粉丝点击