是否可以在执行另一个Java应用程序期间创建一个Java applet

时间:2011-04-18 09:47:45

标签: java applet jung

我一直在开发一个Java应用程序,它执行一系列的查询和计算,并将结果显示为一系列HTML页面。为了可视化图形,我一直在玩JUNG库一段时间,看来图书馆的真正优势在于支持用户交互,当图形保存为静态图像时,这当然不可用(PNG在我的案件)。

我想知道是否会:

a)可能的

b)可行

c)明智的

...在主应用程序执行期间创建一个applet,然后可以插入到HTML报告中,并在应用程序完成执行并且用户浏览报告页面后以交互方式使用。

如果由于技术原因无法做到这一点;对于如何实现这样的目标,您有任何其他建议/建议吗?

谢谢,

编辑:为了澄清这个概念,“主要”应用程序是一系列事件中的链接,因此具有如此独立的GUI。使用applet的想法不是模仿或将所有内容从主应用程序传输到HTML页面,而是当用户在执行后查看图形结果时,可以使用JUNG库附带的交互式工具。主要软件已经完成。

让我知道这个概念是否还不清楚,我会再次尝试更详细地解释一下。

更新:按照我的建议,thnx到@boffinBrain& @AndrewThompson,我编写了我的applet,并将其与其他可视化相关的类一起放在我的项目中。层次结构如下:

my.domain.project
my.domain.project.tests
my.domain.project.visualization

现在,HTML报告是在本地驱动器上的任意位置创建的,这是一项功能,因为用户在运行“主”应用程序之前会提供输出文件夹。在我的ReportGenerator类(生成这些HTML文件)中,我有以下代码:

File bin = new File(getClass().getProtectionDomain().getCodeSource().getLocation().toString());
String codebase = bin.getParent();
System.out.println(codebase);
String archive = "lib/collections-generic-4.01/collections-generic-4.01.jar";
String applet_name = "bin/my.domain.project.visualization.HierarchyGraphApplet.class";

codebase打印输出显示:file:/home/username/workspace/project这正是我所期望的。在项目文件夹下有bin /和lib /,而bin里面有正确的文件夹层次结构,一直到我的applet类,它也存在。

现在我为什么写下这一切;好吧,因为当我尝试在我得到的报告上运行我的小程序时:

java.lang.NoClassDefFoundError: bin/my/domain/project/visualization/HierarchyGraphApplet (wrong name: my/domain/project/visualization/HierarchyGraphApplet)

我已经阅读了类似的问题:thisthis但似乎问题出在其他地方。我仔细检查了拼写等... 有什么简单的我想念,或者手头有更复杂的问题吗?

2 个答案:

答案 0 :(得分:3)

也许这个例子会给你一些想法。它创建用作“报告”的数据文件,供applet使用。

因为applet通过输入文件获取数据,该输入文件的标题在applet param中指定。数据文件的内容仅受报告要求,您创建报告的技能和限制。解析它,..和可用的磁盘空间。 ;)

编译&运行main(String[])以(希望)在浏览器的标签页中打开2个网页。

import java.awt.Desktop;
import javax.swing.*;
import java.net.*;
import java.io.*;

/** Simplistic example, not intended to show good I/O practices
or Exception handling for the sake of brevity. */
public class Reporter extends JApplet {

    public void init() {
        String input = getParameter("input");

        JEditorPane report = new JEditorPane();
        report.setText("Problem loading input file");
        add(report);

        URL url;
        try {
            url = new URL(getDocumentBase(), input);
            report.setPage(url);
        } catch(Exception e) {
            e.printStackTrace();
        }
    }

    /** The main represents our report generator.  It is part
    of the applet class only in order to create an SSCCE. Good
    design would imply that it might be in a class ReportGenerator,
    while the applet is in class ReportViewer. */
    public static void main(String[] args) throws Exception {
        File f;
        String title = "1";
        String data = "apples";

        createInput(title, data);
        f = createHTML(title);
        Desktop.getDesktop().browse(f.toURI());

        title = "2";
        data = "oranges";

        createInput(title, data);
        f = createHTML(title);
        Desktop.getDesktop().browse(f.toURI());

        System.out.println( "End of report generation.." );
    }

    public static void createInput(String title, String data) throws Exception {
        File f = new File("data" + title + ".txt");
        PrintWriter pw = new PrintWriter(f);
        pw.println(data);

        pw.flush();
        pw.close();
    }

    public static File createHTML(String title) throws Exception {
        File f = new File("Data" + title + ".html");
        PrintWriter pw = new PrintWriter(f);

        pw.println("<html>");
        pw.println("<title>");
        pw.println("Data " + title);
        pw.println("<title>");
        pw.println("<body>");
        pw.println("<h1>");
        pw.println("Data " + title);
        pw.println("</h1>");
        pw.println("<applet ");
        pw.println("code='Reporter'");
        pw.println("width='400'");
        pw.println("height='400'");
        pw.println(">");
        pw.println("<param name='input' value='data" + title + ".txt'>");
        pw.println("</applet>");
        pw.println("</body>");
        pw.println("</html>");

        pw.flush();
        pw.close();

        return f;
    }
}

关于进一步的问题:

  

..给定的代码是否假设html报告和applet位于同一个文件夹中?

不一定。 input参数可以为../other/data3.txt目录指定other,与HTML包含的/reports/data3.txt目录指定reportsapplet.jar指定application.jar站点根目录下的目录。

  

..正如您已经注意到的那样,在一个现实生活中的例子中,applet的代码最有可能属于它自己的类,这会对如何将它合并到html文件(这些是在一个单独的类中生成,名为ReportGenerator)?

只需轻微更改即可指向codebase而不是HTML。使用applet.jar将{{1}}与{{1}}的目录分开(尽管也可以通过相对或绝对URL访问档案。)

答案 1 :(得分:2)

创建显示数据的applet绝对可行,但您不希望每次都动态生成新的数据。您想要创建一个单独的独立applet,它可以从文本格式的一组输入数据生成图形/报告,然后在创建HTML页面时,使用applet参数提供报告数据(使用PARAM标记)。