Fly

 

SuperMap Objects Java & Applet

现在也不知道什么原因,竟然有人想使用APPLET了,考虑到使用中一系列需要注意的问题,现将详细步骤列出(虽然我不理解为什么要用APPLET):

步骤一:新建两个类,实现Objects Java中地图相关功能(并不一定需要建两个类,因为习惯原因,比较喜欢将地图功能放在一个类,APPLET单独使用一个类)。

一个类实现地图功能,名字暂定为PANEL,此处需要注意,此类稍后会加载在APPLET中,所以此类只能继承JPANEL,不能继承JFRAME等,网上对此都有详细解释,代码如下:

public class panel extends JPanel{

//仅定义一个按钮,实现打开地图功能
 JButton jBtnOpen=new JButton();
 Workspace workSpace=new Workspace();
 MapControl mapControl=new MapControl();
 public panel(){
  setSize(new Dimension(485, 350));
  setLocation(150,150);
  Init();
 }
 public void Init(){
  mapControl.setBounds(10, 40, 600, 450);
  jBtnOpen.setBounds(new Rectangle(3, 10, 471, 27));
  jBtnOpen.setText("Open");
  jBtnOpen.addActionListener(new ActionListener(){

   public void actionPerformed(ActionEvent arg0) {
    OpenWksp();
   }
   
  });
  mapControl.setBounds(new Rectangle(9, 44, 700, 840));
  setLayout(null);
  add(jBtnOpen);
  add(mapControl,null);
 }

//实现打开地图功能
 public void OpenWksp(){
  WorkspaceConnectionInfo conn=new WorkspaceConnectionInfo();
  conn.setType(WorkspaceType.SXW);
  conn.setServer("E:\\java\\Data\\world.sxw");//此处打开的是本地工作空间文件,所以需要对APPLET进行数字签名,以实现访问本地文件的功能。
  boolean bOpen=workSpace.open(conn);
  if(bOpen==true){
   System.out.println("success");
   Maps objMaps=workSpace.getMaps();
   if(objMaps.getCount()>0){
    mapControl.getMap().setWorkspace(workSpace);
    String strMap=objMaps.get(0);
    mapControl.getMap().open(strMap);
    mapControl.getMap().viewEntire();
    mapControl.getMap().refresh();
   }
  }else{
   System.out.println("fail");
  } 
 } 

//此函数功能主要为实现在HTML中增加用户自定义按钮,在APPLET之外实现地图漫游功能

 public void setMapAction(int curAction){
  switch(curAction){
  case 1:mapControl.setAction(Action.ZOOMIN);
  case 2:mapControl.setAction(Action.ZOOMOUT);
  case 3:mapControl.setAction(Action.ZOOMFREE);
  case 4:mapControl.setAction(Action.PAN);
  case 5:mapControl.getMap().viewEntire();
  case 6:mapControl.setAction(Action.SELECT);
  }
 }
}

一个类实现APPLET,代码如下:

public class applet extends JApplet{
 panel frame=new panel();
 public void init(){
  getContentPane().add(frame);
 }
 //地图功能完全在PANEL类中实现,此处设置一个函数方便APPLET外调用地图漫游功能
 public void setMapAction(int curAction){
  frame.setMapAction(curAction);
 }
}

步骤二:对编译后的文件进行打包

之前PANEL和APPLET两个类放在名称为two 的包下面,绝对路径为E:\java\Eclipse_Workspace\myapplet\bin\two,操作如下:

1.打开运行窗口,进入E:\java\Eclipse_Workspace\myapplet\bin;

2.输入打包命令,jar cvf testapplet.jar two,将文件夹two下的所有文件打包至testapplet.jar包中;

步骤三:生成密钥库,对JAR包进行签名

由于其“沙箱”模型,在保证安全的要求下,JApplet一般不能访问本地磁盘的数据(读写均禁止),例如一个未经过签名的JApplet中使用JFileChoosershowOpenDialog()将抛出SecurityException异常。所以如果JApplet对象需要访问本地数据时,需要针对其进行签名,操作如下:

1.生成密钥库,keytool -genkey -keystore applet.store -alias applet,在步骤二中第二步操作后,执行此句代码,生成一个别名为applet的密钥库,关于此函数的其它信息,请参考另一篇博文。

2.对JAR包进行数字签名,jarsigner -keystore applet.store testapplet.jar applet

3.在JApplet运行的过程中,通过调用类库JAR包访问本地DLL文件同样受限于“沙箱”模型,所以需要对本地所有需要加载的JAR包进行数字签名

jarsigner -keystore applet.store com.supermap.data.jar applet,此处为了方便,将Objects Java使用到的几个JAR文件拷贝至testapplet.jar同级目录下,以相同的签名方式,为其它JAR包进行数字签名;

步骤四:编写HTML

如果只希望展示原APPLET中的内容,在HTML中可以只用写很少的内容,如下所示:

<applet id="apple" code=two.applet  archive="testapplet.jar,com.supermap.data.jar,com.supermap.mapping.jar" width=800 height=768>
</applet>

id是HTML中每个控件对应的唯一标识,code表明APPLET所在的CLASS。

在完成以后步骤后,就可实现在HTML中访问APPLET。

如果需要在HTML中另外开辟一些地图相关功能,可在原PANEL类中封装一些方法,在APPLET类中用公共方法表示,HTML文件中定义一些DIV,以及DIV所对应的函数来实现扩展功能。

posted on 2009-12-15 23:47  Emily_Fly  阅读(475)  评论(0编辑  收藏  举报

导航