我们在vrml中调用java文件,为什么总是不能调用?能否提供点帮助,先说声谢谢了!
的有关信息介绍如下:要用jdk1.3编译才可以
2.1. 1Java通过Script类(vrml.node包)与Script结点建立联系,控制VRML结点
首先,定义Script节点中的各域域值,设置路由(Route)使VRML中的其它节点与Script节点联系起来。当与Script节点有联系的节点发生事件时,事件通过路由传给Script节点的eventIn域,Script节点则通过url域中指定的地址找到java类。
然后,Java类开始工作,最先执行的是initialize()方法:在initialize()方法中必须获得Script节点中eventIn或field域的值,或者把java中的值返回给Script中的eventOut域。Script类提供的方法有: getField(fieldName); getEventIn(eventInName); getEventOut(eventOutName); 作为参数的fieldName、eventInName、eventOutName要与Script节点中定义的名称相符合,对应的Field类的子类(vrml.filed包)与Script节点中定义的各种Type类型一致。它提供getValue()和setValue()方法。
再则,通过Script类提供的processEvent(Event p0)或processEvents(int p0, Event[] p1)方法来捕获Script节点传递的事件。processEvent和processEvents方法是所有外部事件公共的输入点。Java程序通过替代这两个方法对事件做出相应的处理。Vrml包中Event类的getName()方法返回事件名称(该名称与Script节点中发生该事件的eventInName相同),确定发生的事件,从而做出相应的处理;Event类的getValue()方法则返回一个ConstField类的实例 (它是Script节点中发生该事件的eventIn域),ConstField类是Field类的子类,它没有setValue()方法,因而只能取出Script节点中eventIn域的值,而不能修改。
最后,所有事件处理完后,程序就调用Script类中的eventsProcessed()方法,在这儿可以加入用户想要实现的动画、交互等各种效果。Script类中的shutdown()方法实现离开VRML文件的方式。
通过Script节点,能java程序处理过的数据返回给VRML文件。通过初始化时getEventOut()得到的变量的setValue()方法将值传递给Script节点的eventOut域,再通过路由传递给VRML中的各类节点,完成整个通信过程。
2.1.2 Java通过Script节点和Node类(vrml.node包)直接修改VRML节点
通过Script节点和路由,同时又必须在Script节点的eventOut域设置控制点,java程序才能改变VRML文件中节点值。当有大量数据需要传送时,这种给每个数据设置一个eventOut域加一个路由的方法显然是相当麻烦的。因此java,提出直接修改节点的方法。
Java直接修改场景中的节点,仍然要用到Script节点。首先在定义Script节点时,将eventOut域改为field域,fieldType定义为SFNode,具体格式如下:
“field SFNode fieldname USE nodeName”。 “nodeName”为要修改的节点名称(在VRML中由DEF语句命名),产生一个指向名为nodeName节点的指针。执行初始化时通过getField()方法得到相应的SFNode类的一个实例,通过getValue()方法得到该类的值,这里它的值恰好是名称为nodeName的Node类的实例,然后通过Node类提供的方法直接修改节点。getExposedField(String p0)、getEventIn(String p0)方法,分别得到节点的field和eventIn域,并把结果作为Field类;再通过各Field类的子类提供的方法读取和设置值,将设置结果直接返回节点,不用再设置路由,从而达到了直接修改节点的目的。
Node类还提供了getEventOut(String p0)方法,用它可以得到节点的eventOut域,与前两个方法不同,它得到的结果是一个不能修改的Field类,即Field类的子类ConstField类。 使用改进后的方法,可以有效的缩减代码长度,节省VRML文件的计算时间,提高VRML场景的生成速度。
2.1.3 Java通过Script节点和Browser类(vrml包)直接创建VRML场景
设置Group节点的addChindren和removeChindren的值来可添加和删除具体节点,但还无法操作路由。当有大量不同的并相互关联的节点要通过java在VRML中创建时,工作量是难以想象的。为了满足这一要求,Script类继承BaseNode(vrml包)类,BaseNode类中定义了两个方法:getBrowser()和getType()。getBrowser()方法将会返回BaseNode类所处的浏览器。Browser类存在于vrml包中,它提供了一系列方法来对整个VRML文件进行控制。 如:
(1)、添加和删除路由:addRoute(SFNode fromNode,SFString fromEventOut,SFNode toNode,SFString toEventIn),deleteRoute(SFNode fromNode,SFString fromEventOut,SFNode toNode,SFString toEventIn)
(2)、直接创建VRML:createVrmlFromString(SFString vrmlSyntax)(把要创建的节点语法以字符串的方式作为参数写入)
(3)、在VRML中建立相应节点:createVrmlFromURL(MFString url,SFNode node,SFString event)(该方法的提供节点语法的参数是放在url地址所指出的VRML文件中,浏览器通过url找到要加入的节点,把它加入到node参数指定的节点中event参数指定的eventIn域中)
(4)、用指定的节点来替换整个VRML文件:replaceWorld(MFNode nodes)
用url指定的另一个VRML文件来替换当前的文件:loadURL(MFString url,MFString parameter)。
Script类执行initialize()方法时,得到浏览器实例,然后processEvent(Event e)方法执行时使用上述方法建立、修改VRML场景。 通过改进,不仅VRML文件代码长度缩减,java程序代码也大大减少,进一步提高了VRML场景的生成速度。
不知道帮不帮得到你