`
阳光雨露
  • 浏览: 23800 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Swing程序嵌入Html/Jsp页面

阅读更多

对于一个Swing写的应用程序,在很多的工程中,是需要嵌入到页面的。这样不仅增加了交互性和界面可操作性,而且让程序更加人性化。

而以往的界面嵌入,大多是以Applet为主的。但是对于Swing为主的程序,sun公司仍然是提供解决方案的。

原理:

页面代码:

<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
    width="400" height="300" align="baseline"
    codebase="
http://java.sun.com/products/plugin/1.4/jinstall-14-win32.cab#Version=1,4,0,mn">
    <PARAM NAME="code" VALUE="Example.class">
    <PARAM NAME="codebase" VALUE="\">
    <PARAM NAME="type" VALUE="application/x-java-applet;jpi-version=1.4">
    <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
    <PARAM NAME="scriptable" VALUE="true">

    <COMMENT>
    <EMBED type="application/x-java-applet;jpi-version=1.4" width="400"
     height="300" align="baseline" code="Example.class" codebase="\"
     model="models/HyaluronicAcid.xyz"
     pluginspage="
http://java.sun.com/j2se/1.4/download.html">
     <NOEMBED>
      No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
     </NOEMBED>
    </EMBED>
    </COMMENT>
</OBJECT>

解释:

<OBJECT> 是IE浏览器推荐用来嵌入Applet的标签。这个标签中的URI以“clsid”开始,只有IE浏览器支持这个属性,其他浏览器都不支持。URI以“clsid”开始,表明这是一个ActiveX控件,只有Windows中的IE才识别的属性,代表注册表中一个注册的ActiveX类,“CAFEEFAC-0014-0002-0000-ABCDEFFEDCBA”是SUN JRE安装时在Windows中注册的,代表SUN Java Plug-in 1.4.2。因此当IE解析到示例中的标签时,会通过注册表,查找到Java Plug-in,然后启动JRE,在当前位置渲染这个Applet。另外一个clsid值:“8AD9C840-044E-11D1-B3E9-00805F499D93”,代表当前最新的JRE版本。“codebase”属性指定了一个特定版本JRE的下载地址,当客户端机器上没有安装Java Plug-in时,会自动从这个地址下载安装Java Plug-in。“scriptable”属性用于指定Applet示例是否能与页面中的JavaScript交互。

<EMBED >是Netscape Navigator 4.x浏览器支持的嵌入Applet的标签,其他浏览器很少支持这个标签的,因此实际应用的很少。这个标签不支持以内嵌Param标签的方式为Applet传递参数。

因此,最上面的写法是一种折中的写法-----为的是这种主流浏览器对Swing的支持。把Embed标签用Comment标签包含起来,放在Object标签内部。IE在解释Object标签时,会忽略Comment标签内的内容。而Netscape Navigator不能识别clsid、不能识别Comment标签,它会忽略忽略外层的Object标签和Comment标签,而只看到Embed标签的内容。这样,这段代码可以同时适应IE和Netscape Navigator两种浏览器。

 

(对于其他浏览器的支持,这里先不讨论,可使用Object:java Tag

实战:

示例1:Swing代码嵌入Html

demo代码:

import java.awt.*;
import java.awt.event.*;
import java.io.File;
import javax.swing.*;

public class Demo2 implements ActionListener {
Frame f = new Frame("文件复制!");
JLabel l = new JLabel("选择文件:");
JTextField tf = new JTextField(20);
JButton b = new JButton("选择。。。");
JFileChooser fd = new JFileChooser();

public Demo2() {
   fd.setDialogTitle("哈哈。。。");
   fd.setCurrentDirectory(new File("C:\\"));
   double lx = Toolkit.getDefaultToolkit().getScreenSize().getWidth();
   double ly = Toolkit.getDefaultToolkit().getScreenSize().getHeight();
   b.addActionListener(this);
   f.setLayout(new FlowLayout());
   f.add(l);
   f.add(tf);
   f.add(b);
   f.setLocation((int) lx / 2 - 150, (int) ly / 2 - 150);
   f.setSize(400, 400);
   f.setVisible(true);
   f.addWindowListener(new WindowAdapter() {
    public void windowClosing(WindowEvent e) {
     System.exit(0);
    }
   });
}

public void actionPerformed(ActionEvent e) {
   if (e.getSource().equals(b)) {
    fd.setFileSelectionMode(JFileChooser.FILES_ONLY); //只能选择文件
    int state = fd.showOpenDialog(null);
    if (state == 1) {
     return;// 撤销则返回
    } else {
     File f = fd.getSelectedFile();// f为选择到的文件
     tf.setText(f.getAbsolutePath());
    }
   }
}

public static void main(String[] args) {
   Demo2 d = new Demo2();
}
}

然后编译。结构图在最下面

 

Demo2.java为源文件,而Demo2.class为生成的二进制文件,demo2.html为嵌入的html页面。它们都在D:\aaa这个文件夹下

demo2.html代码:

<OBJECT classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93"
    width="400" height="300" align="baseline"
    codebase="
http://java.sun.com/products/plugin/1.4/jinstall-14-win32.cab#Version=1,4,0,mn">
    <PARAM NAME="code" VALUE="Demo2.class">
    <PARAM NAME="codebase" VALUE="D:\aaa">
    <PARAM NAME="type" VALUE="application/x-java-applet;jpi-version=1.4">
    <PARAM NAME="model" VALUE="models/HyaluronicAcid.xyz">
    <PARAM NAME="scriptable" VALUE="true">

    <COMMENT>
    <EMBED type="application/x-java-applet;jpi-version=1.4" width="400"
     height="400" align="baseline" code="Demo2.class" codebase="D:\aaa"
     model="models/HyaluronicAcid.xyz"
     pluginspage="
http://java.sun.com/j2se/1.4/download.html">
     <NOEMBED>
      No Java 2 SDK, Standard Edition v 1.4 support for APPLET!!
     </NOEMBED>
    </EMBED>
    </COMMENT>
</OBJECT>

注意:

<OBJECT>中的<PARAM NAME="codebase" VALUE="D:\aaa"><EMBED >中的code="Demo2.class" codebase="D:\aaa" 有个codebasevalue属性------这个属性很重要,它指的是class文件所在的具体的路径,而<PARAM NAME="code" VALUE="Demo2.class">value仅指文件名。

这里因为把class和html页面放在一个文件里面,所以,可以这样写:

<PARAM NAME="codebase" VALUE="|\"> 另一个地方

<EMBED type="application/x-java-applet;jpi-version=1.4" width="400"
     height="400" align="baseline" code="Demo2.class" codebase="\"

方便吧---------用"\"代替绝对路径。

运行,出错!

原因1.我们的Swing代码需要操作本地文件(JFileChooser ),java为了安全,是不允许这样做的。因此,需要修改一个文件。

路径:比如java安装地址:C:\Program Files\Java\jre1.5.0_06\lib\security   (注意:是jre不是jdk)

修改 java.policy文件

添加

permission java.security.AllPermission;
permission java.util.PropertyPermission "file.encoding", "read";

OK!通过!

但是,在页面左上角的Applet载入中出现红叉,Swing程序却弹出在页面之上。解决:

1.消除红叉------只要Swing程序集成Applet就OK了。

public class Demo2 extends Applet implements ActionListener

 

来源于:http://kathy198908.blog.hexun.com/32350196_d.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics