4

我一直在开发一个 Java 应用程序,它执行一系列查询和计算,并将其结果显示为一系列 HTML 页面。为了可视化图表,我一直在使用 JUNG 库,它看起来库的真正优势在于对用户交互的支持,当图表保存为静态图像(PNG 在我的案子)。

我想知道它是否会是:

a) 可能的

b) 可行的

c) 明智的

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

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

谢谢,

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

让我知道这个概念是否仍然不清楚,我将再次尝试更详细地解释事情。

更新:根据我得到的建议,感谢@boffinBrain 和@AndrewThompson,我编写了我的小程序,并与其他可视化相关类一起放在我的项目中的一个包中。层次结构如下:

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,但似乎问题出在其他地方。我仔细检查了拼写等...我缺少一些简单的东西,还是手头有更复杂的问题?

4

2 回答 2

3

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

因为小程序通过输入文件获取数据,该输入文件的标题在小程序中指定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 报告和小程序位于同一文件夹中?

不必要。该input参数可以指定../other/data3.txt与 包含的other目录处于同一级别的目录HTML,或者/reports/data3.txt指定reports站点根目录中的目录。

..正如您还指出的那样,在现实生活中的示例中,applet 的代码很可能在其自己的类中,这是否会对如何将其合并到 html 文件(在单独的类,名为 ReportGenerator)?

它只需要稍作改动即可指向applet.jar而不是application.jar. 使用 a将与目录codebase分开(尽管档案也可以通过相对或绝对 URL 访问)。HTMLapplet.jar

于 2011-04-18T13:21:00.253 回答
2

创建一个小程序来显示数据肯定是可行的,但是您不想每次都动态生成一个新的。您想创建一个单独的独立小程序,它可以从一组文本格式的输入数据生成图表/报告,然后在创建 HTML 页面时,使用小程序参数提供报告数据(使用 PARAM 标签)。

于 2011-04-18T11:40:41.730 回答