4

私は、長い一連のクエリと計算を実行し、その結果を一連の HTML ページとして表示する Java アプリケーションを開発しています。グラフを視覚化するために、しばらく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 内には、同じく存在するアプレット クラスに至るまでのフォルダーの適切な階層があります。

なぜ私はこれらすべてを書き留めたのでしょうか。レポートでアプレットを実行しようとすると、次のようになるからです。

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

thisまたはthisのような同様の質問を読みましたが、問題は別の場所にあるようです。スペルなどを再確認しました...単純なものが欠けていますか、それとももっと複雑な問題がありますか?

4

2 に答える 2

3

おそらく、この例から追求すべきアイデアが得られるでしょう。アプレットで使用するための「レポート」として使用されるデータ ファイルを作成します。

アプレットは、アプレットで指定されたタイトルの入力ファイルを介してデータを取得するためparamです。データ ファイルの内容は、レポートの要件、レポートを作成して解析するスキル、および使用可能なディスク容量によってのみ制限されます。;)

をコンパイルして実行するmain(String[])と、ブラウザのタブに 2 つの Web ページが表示されます (うまくいけば)。

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場合があります。otherHTML/reports/data3.txtreports

..また、あなたが指摘したように、実際の例では、アプレットのコードは独自のクラスにある可能性が高く、html ファイル (別のクラス、ReportGenerator という名前)?

applet.jarではなくを指すようにするには、わずかな変更のみが必要ですapplication.jar。を使用して、 のディレクトリからcodebase分離します (ただし、アーカイブには相対 URL または絶対 URL を介してアクセスすることもできます)。HTMLapplet.jar

于 2011-04-18T13:21:00.253 に答える
2

データを表示するためのアプレットを作成することは間違いなく実行可能ですが、毎回新しいアプレットを動的に生成する必要はありません。テキスト形式の入力データのセットからグラフ/レポートを生成できる別個のスタンドアロンアプレットを作成し、HTMLページを作成するときに、アプレットパラメータを使用して(PARAMタグを使用して)レポートデータを提供します。 )。

于 2011-04-18T11:40:41.730 に答える