# Java Applets in html einbinden



## fatality (19. Jun 2009)

hi allerseits

also mein problem dreht sich um applets 
ich habe prefuse in meine dynamische website importiert ( benutze eclipse als umgebung).und nun möchte ich einen graphen daraus erstellen (was mit sich zieht das sehr viele prefuse  klassen in die klasse die den graphen erstellt importiert werden) .Also alles funktioniert in eclipse super , beziehungsweise das applet wird erstellt , aber die probleme treten auf wenn ich versuche das applet in eine html seite zu importieren 
, ich schaffe es einfach nicht es zum laufen zu bringen . und eine frage hätte ich auch dazu , also müssen all die klassen die in der klasse die den graphen erzeugt auch in de WebContet folder kopiert werden , oder reicht es nur die eine klasse zu kopiren 

und eine andere sache , der graph wird aus einem xml file (das mit einem servlet erzeugt wird) erstellt , muss ich dann den path zu dem file ändern denn jetzt wird das file aus dem "build" ordner gelesen

freue mich auf tipps und anregungen


----------



## L-ectron-X (20. Jun 2009)

Hast du neben deiner Applet-Klasse noch weitere Klassen programmiert, solltest du diese zunächst in einem Jar-File organisieren.
Dieses Jar-File und das der Prefuse-Bibliothek legst du ins archive-Attribut des Applet-Tags. Ins code-Attribut legst du die Applet-Klasse mit Package.
In der FAQ finden sich irgendwo Beispiele zum Einbinden von Applets.


----------



## fatality (20. Jun 2009)

danke für die antwort ,aber ich habe es genau so gemacht ,doch der findet die klasse einfach nicht ,hier mein applet tag

<applet code="prefuse.demo.GraphView.class" archive="whole.jar" codebase="applets"   width=1000 height=500/>

also in whole.jar sind alle klassen , falls ich das richtig gemacht habe , rechtsklick auf die klasse die ausgeführt wird , exportieren als jar file , und dann wählt er alle klassen die er braucht

ich glaube das es am package liegt , aber bin mir nicht sicher , auf jeden fall habe ich einen ordner "applets" im web content ordner erstellt und dann in ihm die ordner "prefuse", dann "demo" und dort dann die GraphView klasse kopiert sowie das jar file auch (hab das alles auch direkt im Web Content ordner , sicher ist sicher) , doch funktionieren tut es trotzdem nicht 

hier im anhang noch der code , vielleicht liegt es daran , obwohl ich das nicht glaube , denn unter eclipse funktioniert alles 

```
package prefuse.demo;

import java.awt.Color;
import java.awt.Dimension;

import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.JComponent;
import javax.swing.JSplitPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

import prefuse.Constants;
import prefuse.Display;
import prefuse.Visualization;
import prefuse.action.ActionList;
import prefuse.action.RepaintAction;
import prefuse.action.assignment.ColorAction;
import prefuse.action.filter.GraphDistanceFilter;
import prefuse.action.assignment.DataColorAction;
import prefuse.action.layout.graph.ForceDirectedLayout;
import prefuse.activity.Activity;
import prefuse.controls.DragControl;
import prefuse.controls.FocusControl;
import prefuse.controls.NeighborHighlightControl;
import prefuse.controls.PanControl;
import prefuse.controls.WheelZoomControl;
import prefuse.controls.ZoomControl;
import prefuse.controls.ZoomToFitControl;
import prefuse.data.Graph;
import prefuse.data.Tuple;
import prefuse.data.event.TupleSetListener;
import prefuse.data.io.GraphMLReader;
import prefuse.data.tuple.TupleSet;
import prefuse.render.DefaultRendererFactory;
import prefuse.render.LabelRenderer;
import prefuse.util.ColorLib;
import prefuse.util.GraphLib;
import prefuse.util.PrefuseLib;
import prefuse.util.force.ForceSimulator;
import prefuse.util.ui.JForcePanel;
import prefuse.util.ui.JPrefuseApplet;
import prefuse.util.ui.JValueSlider;
import prefuse.util.ui.UILib;
import prefuse.visual.NodeItem;
import prefuse.visual.VisualGraph;
import prefuse.visual.VisualItem;

public class GraphView extends JPrefuseApplet {

	private static final String graph = "graph";
    private static final String nodes = "graph.nodes";
    private static final String edges = "graph.edges";
    
    public void init() {
        UILib.setPlatformLookAndFeel();
        JComponent graphview = demo("/socialnet.xml", "name");
        this.getContentPane().add(graphview);
    }

    public static JComponent demo(String datafile, String label) {
        Graph g = null;
        if ( datafile == null ) {
            g = GraphLib.getGrid(15,15);
        } else {
            try {
                g = new GraphMLReader().readGraph(datafile);
            } catch ( Exception e ) {
                e.printStackTrace();
                System.exit(1);
            }
        }
        return demo(g, label);
    }
    
    public static JComponent demo(Graph g, String label) {

        // create a new, empty visualization for our data
        final Visualization vis = new Visualization();
        VisualGraph vg = vis.addGraph(graph, g);
        vis.setValue(edges, null, VisualItem.INTERACTIVE, Boolean.FALSE);
        
        TupleSet focusGroup = vis.getGroup(Visualization.FOCUS_ITEMS); 
        focusGroup.addTupleSetListener(new TupleSetListener() {
            public void tupleSetChanged(TupleSet ts, Tuple[] add, Tuple[] rem)
            {
                for ( int i=0; i<rem.length; ++i )
                    ((VisualItem)rem[i]).setFixed(false);
                for ( int i=0; i<add.length; ++i ) {
                    ((VisualItem)add[i]).setFixed(false);
                    ((VisualItem)add[i]).setFixed(true);
                }
                vis.run("draw");
            }
        });
        
        // set up the renderers
        LabelRenderer tr = new LabelRenderer(label);
        tr.setRoundedCorner(8, 8);
        vis.setRendererFactory(new DefaultRendererFactory(tr));
        
       
        
        // -- set up the actions ----------------------------------------------
        
        int maxhops = 4, hops = 4;
        final GraphDistanceFilter filter = new GraphDistanceFilter(graph, hops);

        ActionList draw = new ActionList();
        draw.add(filter);
       // draw.add(new ColorAction(nodes, VisualItem.FILLCOLOR, ColorLib.rgb(200,200,255)));
        int[] palette = new int[] {
       		 ColorLib.rgb(255,180,180), ColorLib.rgb(190,190,255),ColorLib.rgb(255,170,120),ColorLib.rgb(255,0,0),ColorLib.rgb(128,180,128)
       }; 
        DataColorAction fill = new DataColorAction("graph.nodes", "gender",Constants.NOMINAL, VisualItem.FILLCOLOR, palette);
        draw.add(new ColorAction(nodes, VisualItem.STROKECOLOR, 0));
        draw.add(new ColorAction(nodes, VisualItem.TEXTCOLOR, ColorLib.rgb(0,0,0)));
        draw.add(new ColorAction(edges, VisualItem.FILLCOLOR, ColorLib.gray(200)));
        draw.add(new ColorAction(edges, VisualItem.STROKECOLOR, ColorLib.gray(200)));
        
     //   ColorAction fill = new ColorAction(nodes, 
       //         VisualItem.FILLCOLOR, ColorLib.rgb(200,200,255));
        fill.add("_fixed", ColorLib.rgb(255,100,100));
        fill.add("_highlight", ColorLib.rgb(255,200,125));
        
        ForceDirectedLayout fdl = new ForceDirectedLayout(graph);
        ForceSimulator fsim = fdl.getForceSimulator();
        fsim.getForces()[0].setParameter(0, -1.2f);
        
        ActionList animate = new ActionList(Activity.INFINITY);
        animate.add(fdl);
        animate.add(fill);
        animate.add(new RepaintAction());
        
        // finally, we register our ActionList with the Visualization.
        // we can later execute our Actions by invoking a method on our
        // Visualization, using the name we've chosen below.
        vis.putAction("draw", draw);
        vis.putAction("layout", animate);
        vis.runAfter("draw", "layout");
        
        
        // --------------------------------------------------------------------
        // STEP 4: set up a display to show the visualization
        
        Display display = new Display(vis);
        display.setSize(500,500);
        display.setForeground(Color.GRAY);
        display.setBackground(Color.WHITE);
        
        // main display controls
        display.addControlListener(new FocusControl(1));
        display.addControlListener(new DragControl());
        display.addControlListener(new PanControl());
        display.addControlListener(new ZoomControl());
        display.addControlListener(new WheelZoomControl());
        display.addControlListener(new ZoomToFitControl());
        display.addControlListener(new NeighborHighlightControl());
        
        display.setForeground(Color.GRAY);
        display.setBackground(Color.WHITE);
        
        // --------------------------------------------------------------------        
        // STEP 5: launching the visualization
        
        // create a panel for editing force values
        final JForcePanel fpanel = new JForcePanel(fsim);
        
        final JValueSlider slider = new JValueSlider("Distance", 0, maxhops, hops);
        slider.addChangeListener(new ChangeListener() {
            public void stateChanged(ChangeEvent e) {
                filter.setDistance(slider.getValue().intValue());
                vis.run("draw");
            }
        });
        slider.setBackground(Color.WHITE);
        slider.setPreferredSize(new Dimension(300,30));
        slider.setMaximumSize(new Dimension(300,30));
        
        Box cf = new Box(BoxLayout.Y_AXIS);
        cf.add(slider);
        cf.setBorder(BorderFactory.createTitledBorder("Connectivity Filter"));
        fpanel.add(cf);
        
        fpanel.add(Box.createVerticalGlue());
        
        // create a new JSplitPane to present the interface
        JSplitPane split = new JSplitPane();
        split.setLeftComponent(display);
        split.setRightComponent(fpanel);
        split.setOneTouchExpandable(true);
        split.setContinuousLayout(false);
        split.setDividerLocation(530);
        split.setDividerLocation(800);
        
        
        // position and fix the default focus node
        NodeItem focus = (NodeItem)vg.getNode(0);
        PrefuseLib.setX(focus, null, 400);
        PrefuseLib.setY(focus, null, 250);
        focusGroup.setTuple(focus);

        // now we run our action list and return
        return split;
    }
}
```


----------



## L-ectron-X (20. Jun 2009)

Ich hab nicht ganz verstanden, wie du das Applet für das Internet aufgebaut hast.

Du benutzt eine fremde Bibliothek? Dann muss diese in den Classpath.
Das machst du, indem du sie im archive-Attribut neben deiner eigenen jar-Datei auflistest. Die Packages der fremden Bibliothek und deiner Anwendung brauchst du nicht anlegen, die existieren bereits in den jeweiligen Jar-Dateien.
Im code-Attribut steht dann deine Applet-Klasse mit Packages.
Wenn du über den Package-Verzeichnissen deines Applets noch ein Verzeichnis für die bessere Übersicht eingebaut hast, musst du dieses im codebase-Attribut angeben.
Hier kommt es aber darauf an, wo sich deine HTML-Datei befindet.
Das hast du aber bisher noch nicht verraten.

Und wenn du bereits eine Fehlerausgabe hast, kannst du sie auch gleich mitposten, das könnte bei der Fehlersuche helfen.


----------



## fatality (20. Jun 2009)

nein ich benutze keine fremenden bibliotheken, also ich benutze schon die von prefuse , habe sie aber alle in den src ordner von meinem projekt importiert , hier auch ein kleiner screenshot http://farm3.static.flickr.com/2461/3642977225_9a59a1d5d8.jpg?v=0

meine html seite befindet sich im WebContet ordner ,http://farm4.static.flickr.com/3323/3642978597_63fea8ff18.jpg?v=0, dort habe ich auch die jar und meine GraphView.class reinkopiert(brauche ich immer noch die GraphView.class wenn ich die jar schon reinkopiert habe?) 
 und nochmal die frage , mache ich das richtig mit der jar wenn ich sie durch den rechtsklick auf die klasse GraphView unter exportieren als jar  erstelle

von den Fehlermeldungen her ,ich bekomme keine direkt , aber wenn ich auf den bereich klicke wo das applet sein sollte ,  bekomme ich die Fehlermeldung  die Klasse(prefuse.demo.GraphView.class) nicht gefunden wurde 


```
Laden: Klasse prefuse.demo.GraphView nicht gefunden
java.lang.ClassNotFoundException: prefuse.demo.GraphView
	at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: \prefuse\demo\GraphView.class (Das System kann den angegebenen Pfad nicht finden)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	... 7 more
Ausnahme: java.lang.ClassNotFoundException: prefuse.demo.GraphView
Laden: Klasse prefuse.demo.GraphView nicht gefunden
java.lang.ClassNotFoundException: prefuse.demo.GraphView
	at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: \prefuse\demo\GraphView.class (Das System kann den angegebenen Pfad nicht finden)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	... 7 more
Ausnahme: java.lang.ClassNotFoundException: prefuse.demo.GraphView
```
hab jetzt auch keine unterordner im WebContent mehr , also alles ist direkt drinnen , bin langsam wirklich am verzweifeln , sitz schon 2 tage an dieser sache und nichts funktioniert


----------



## fatality (20. Jun 2009)

aaa , hab noch ein bisschen rumgefuchtelt , und nun bekomme ich eine andere Fehlermeldung , also mir ist wichtig das er die Klasse GraphView.class findet , also folgendes bekomme ich jetzt : 


```
Laden: Klasse prefuse.demo.GraphView nicht gefunden
java.lang.ClassNotFoundException: prefuse.demo.GraphView
	at sun.plugin2.applet.Applet2ClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.plugin2.applet.Plugin2ClassLoader.loadCode(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager.createApplet(Unknown Source)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Caused by: java.io.FileNotFoundException: \prefuse\demo\GraphView.class (Das System kann den angegebenen Pfad nicht finden)
	at java.io.FileInputStream.open(Native Method)
	at java.io.FileInputStream.<init>(Unknown Source)
	at java.io.FileInputStream.<init>(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.connect(Unknown Source)
	at sun.net.www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.getBytes(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader.access$000(Unknown Source)
	at sun.plugin2.applet.Applet2ClassLoader$1.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	... 7 more
Ausnahme: java.lang.ClassNotFoundException: prefuse.demo.GraphView
java.security.AccessControlException: access denied (java.io.FilePermission \socialnet.xml read)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkRead(Unknown Source)
	at java.io.File.exists(Unknown Source)
	at prefuse.util.io.IOLib.streamFromString(IOLib.java:138)
	at prefuse.data.io.AbstractGraphReader.readGraph(AbstractGraphReader.java:29)
	at prefuse.demo.GraphView.demo(GraphView.java:68)
	at prefuse.demo.GraphView.init(GraphView.java:58)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.1)
	at java.security.AccessControlContext.checkPermission(Unknown Source)
	at java.security.AccessController.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkPermission(Unknown Source)
	at java.lang.SecurityManager.checkExit(Unknown Source)
	at java.lang.Runtime.exit(Unknown Source)
	at java.lang.System.exit(Unknown Source)
	at prefuse.demo.GraphView.demo(GraphView.java:71)
	at prefuse.demo.GraphView.init(GraphView.java:58)
	at sun.plugin2.applet.Plugin2Manager$AppletExecutionRunnable.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)
Ausnahme: java.security.AccessControlException: access denied (java.lang.RuntimePermission exitVM.1)
```
also das applet greift auf eine xml datei ,die sich in dem projektordner befindet , zu , nun ,muss ich den ort der xml verschieben oder liest er sie weiter aus dem "build" ordner ?
  das er sie nicht lesen kann liegt wohl daran das ich das applet signieren muss, hoffe ich mal zumindest


----------



## L-ectron-X (20. Jun 2009)

Ich benutze Eclipse nicht, daher kann ich nichts zum Ablauf beim Erzeugen eines Jar-Files sagen.
Ich hätte es so gemacht: Das Applet kompiliert und mit allen selbst geschriebenen KLassen in eine Jar-Datei gepackt. Dann die Prefuse-Bibliothek (in Form einer Jar-Datei) samt der eigenen Jar-Datei ins archive-Attribut des Applet-Tags gelegt.

Ist eigentlich nicht soo schwer.
Wenn du nicht klar kommst, kann ich dir das Ganze auch zusammenbauen, wenn ich die Sourcen bekomme.


----------



## fatality (20. Jun 2009)

funktioniert jetzt , hat daran gelegen dass ich die jar's von prefuse nicht eingebunden habe 

einen großen dank


----------



## fatality (20. Jun 2009)

zu früh gefreut , funktioniert zwar wenn die html via browser öffne , aber nicht in tomcat 

edit : muss wohl die xml verschieben , hab sie in alle "relevantnen" ordner kopiert , jezt werde ich eine nach der anderen löschen um zu sehen wo sie am ende stehen muss 

danke nochmals für die hilfe


----------



## fatality (20. Jun 2009)

ähm , weiß werde langsam lästig , aber hat man mal ein problem gelöst , kommt schon das nächste 

also es geht um das lesen der xml , welche das ganze applet gestaltet 
um es ein bisschen zu erklären , also mache eine social network plattfom , und da  gibt se ja auch beziehungen zwischen den einzelnen usern , die ich nun versuche graphisch darzustellen. die beziehungen sind in sql gespeichert , aber ich konvertiere die einträge mit hilfe eines servlets in eine xml datei , weil prefuse xml braucht 

und nun möchte ich das jeder user der sich einloggt und das applet aufruft seine eignen beziehungen sieht , das habe ich so realisiert das zuerst das servlet aufgerufen wird , das dann wiederrum die html seite mit dem applet aufruft
auf jeden fall generiert das servlet die xml datei , das applet liest sie auch sogar , aber nun kommt das problem , denn wenn ich mich auslogge und als ein anderer user einlogge und das applet aufrufe , bekomme ich die neue xml datei , aber das applet jedoch "liest" die alte . liest habe ich in anführungszeichen aus zwei gründen getan , erstens , es gibt die alte xml nicht mehr (sie wird von der neuen überschrieben), also verstehe ich nicht wie es an die daten kommt  , und zweitens , wenn ich die "neue" xml datei lösche funzt das applet auch nicht , aber wenn ich sie jedoch wieder reinkopiere bekomme ich wieder die alten daten , also klar ist mir das wirklich nicht

also das mache ich alles unter tomcat ,aber wenn ich das applet per browser öffne funktioniert alles tadellos , also es wird immer die aktuelle xml datei gelesen 

nun meine frage , gibt es eine funktion oder etwas ähnliches mit dem ich das applet (wenn es einmal verlassen wurde ) zerstören kann ,so das das applet wieder ganz neu erstellt werden muss , glaube nähmlich  das die daten irgendwo temporär gehalten werden


----------



## fatality (21. Jun 2009)

keiner der eine idee hat 

also um es präziser auszudrücken, gibt es eine möglichkeit neue dateien in das projekt einzufügen ohne aber den ordner in eclipse ,der das projekt beinhaltet , durch "f5" zu aktualisieren


----------

