日期:2014-05-20  浏览次数:20850 次

求助,java如何调用ocx控件里的事件?
以下是ocx控件的使用说明:

1.打开初始化:
txUDP1.UDPConnect()
返回值:
 0。说明成功
 1。说明失败:原因可能是端口已被其它设备用或禁用
‘出错返回错信息

2.结束关闭
txUDP1.UDPclose

3.取得数据事件
txUDP1_UDPdata
-------------------------------
'5种状态:-----标符(状态),来电号码,用户名/线路号码,通道,E(结束符)
'第1种来电号码:M,075526664777,26664777,01,E
'第2种去电号码:T,075526664777,26664777,01,E
'第3种来电摘机:A,,26664777,01,E(在来电时有效用于通道状态)
'第4种挂机:    B,,26664777,01,E
'第5种未接电话: X,,26664777,01,E

使用jacob调用时,里面的方法能够调用成功,但事件却不能激活。

以下是我的代码:
public static void main(String[] args) {
JFrame f = new JFrame();
JTextArea ta = new JTextArea();
f.add(ta);
f.setSize(400, 500);
f.setVisible(true);

ActiveXComponent com = new ActiveXComponent("txUDPOCX.txUDP");
Dispatch disp = com.getObject();
// 初始化--0表示成功1表示失败
System.out.println(Dispatch.call(disp, "UDPConnect"));
Listener listener = new Listener();
listener.setTa(ta);
// 监听事件
DispatchEvents de = new DispatchEvents(disp, listener,"txUDPOCX.txUDP");
//Dispatch.call(disp, "UDPclose");
}

事件中的代码:
public class Listener {
JTextArea ta;
public JTextArea getTa() {
return ta;
}
public void setTa(JTextArea ta) {
this.ta = ta;
}
public void txUDP1_UDPdata(Variant[] txUDP1_UDPdata) {
ta.append("aaaa");
}
}

是不是那里写错了呢?求大神指点……

------解决方案--------------------
import com.jacob.com.ComThread;
import com.jacob.com.Dispatch;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.DispatchEvents;
import com.jacob.com.Variant;
import java.io.IOException;


public class ocx {
public ocx() {
ComThread.InitMTA(true);
ActiveXComponent iTunesCom = new ActiveXComponent("clsid:287B48B3-80CA-4D0A-AE8E-F97A824FF279");
Dispatch testOcx = (Dispatch)iTunesCom.getObject();
Dispatch.call(testOcx, "BaseConnect",new Variant("COM3"),new Variant("1,3-5"));
Dispatch.call(testOcx, "VoteNew");
Dispatch.call(testOcx, "VoteMode",new Variant("5"),new Variant("1,4,1"));
Dispatch.call(testOcx, "VoteStart");
DispatchEvents events = new DispatchEvents(testOcx, new KeyVoteA());
try {
System.in.read();
} catch (IOException e) {}
ComThread.Release();
System.exit(0);
}

public class KeyVoteA {
//ocx事件返回给java类参数取得
public void KeyVote(Variant[] args) {
         System.out.println("args[0][   "+args[0].getInt());
         System.out.println("args[1][   "+args[1].getInt());
         System.out.println("args[2][   "+args[2].getString());
   }
}

public static void main(String args[]) throws Exception {
    ocx test = new ocx();
}
}
------解决方案--------------------
可能与dll的调法差不多,编译生成存根,代理。也可以用OBJECT classid="clsid:CAFEEFAC-0015-0000-0007-ABCDEFFEDCBA>这种方式调用