我一直在开发一个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)
我已经阅读了类似的问题:this或this但似乎问题出在其他地方。我仔细检查了拼写等... 有什么简单的我想念,或者手头有更复杂的问题吗?
答案 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
目录指定reports
,applet.jar
指定application.jar
站点根目录下的目录。
..正如您已经注意到的那样,在一个现实生活中的例子中,applet的代码最有可能属于它自己的类,这会对如何将它合并到html文件(这些是在一个单独的类中生成,名为ReportGenerator)?
只需轻微更改即可指向codebase
而不是HTML
。使用applet.jar
将{{1}}与{{1}}的目录分开(尽管也可以通过相对或绝对URL访问档案。)
答案 1 :(得分:2)
创建显示数据的applet绝对可行,但您不希望每次都动态生成新的数据。您想要创建一个单独的独立applet,它可以从文本格式的一组输入数据生成图形/报告,然后在创建HTML页面时,使用applet参数提供报告数据(使用PARAM标记)。