# applet Methode aus abstrakter Klasse aufrufen



## helene (26. Nov 2010)

Hallo,

ich habe ein Applet, indem eine abstrakte Klasse implementiert wurde. Nun möchte ich in dieser abstrakten Klasse auf die Funktion 
	
	
	
	





```
getCodeBase()
```
 zugreifen.

Da diese Funktion in der Klasse java.applet.Applet implementiert wird, kann ich sie in meiner abstrakten Klasse nicht aufrufen. Wie kann ich dies dennoch schaffen. Hat jemand eine Idee?

Vielen Dank im voraus.


----------



## L-ectron-X (26. Nov 2010)

Ich weiß nicht, ob ich dich jetzt richtig verstanden habe...
Du hast eine Klasse, die von Applet erbt und darin eine innere abstrakte Klasse?

Schreib am besten gleich mal dazu, was du eigentlich machen möchtest.


----------



## helene (30. Nov 2010)

Ich habe eine Applikation als Applet umgewandelt. Die Applikation ist so aufgebaut, daß eine main Klasse mein Gui Fenster aufruft. In diesem Gui Fenster kann ein Ablaufdiagramm gezeichnet werden, welches gespeicher werden kann. Über einen Menüpunkt kann eine Hilfedatei aufgerufen werden.
Für mein Applet habe ich die main Klasse von JApplet erben lassen. In der Gui Klasse habe ich nun beim Punkt Hilfedatei aufrufen eine AbstractAction Methode. Ich poste mal den code


```
/**
	* Aktion des Menuepunktes "Hilfethemen"
	 * @param url 
	*/
	private AbstractAction getThemenAction() {
		if(themenAction == null) {
			themenAction = new AbstractAction("Hilfethemen", null) {
				public void actionPerformed(ActionEvent evt) {
					try{
								URL page;
								page = new URL(getCodeBase(), "/Hilfethemen/index);
								getAppletContext().showDocument(page);
					} catch (MalformedURLException ex){
					}
					
				}
			}
		return themenAction;
		}
	}
```

Gibt es bei einem Applet keine abstrakten Klassen?


----------



## L-ectron-X (30. Nov 2010)

helene hat gesagt.:


> Über einen Menüpunkt kann eine Hilfedatei aufgerufen werden.


Kann mich erinnern, da habe ich dir bereits geholfen.



helene hat gesagt.:


> Gibt es bei einem Applet keine abstrakten Klassen?


Doch, gibt es. Applets bestehen auch nur aus Java-Code und unterwerfen sich den allgemeinen Regeln.

Möglicherweise ist dein Code fehlerhaft. Wenn du die Fehlermeldung mit gepostet hättest, wären wir hier viel schneller fertig.

Ich habe deinen Code berichtigt:

```
/**
    * Aktion des Menuepunktes "Hilfethemen"
    */
    private AbstractAction getThemenAction() {
        if(themenAction == null) {
            themenAction = new AbstractAction("Hilfethemen") { //wenn ohne Icon
                public void actionPerformed(ActionEvent evt) {
                    try {
                         URL page = new URL(getCodeBase(), "/Hilfethemen/index.html"); //URL muss vollständig sein
                         getAppletContext().showDocument(page);
                    } catch (MalformedURLException ex) {
                         ex.printStackTrace(); //Exceptions niemals unbehandelt lassen!
                    }                    
                }
            }; //Anweisung abschließen nicht vergessen
        }
        return themenAction;
    }
```

Geht es damit?


----------



## helene (30. Nov 2010)

Leider nicht. 
Entschuldigung, daß ich die Fehlermeldung nicht gleich mit angegeben habe. Hier ist sie:

Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
	at java.applet.Applet.getCodeBase(Unknown Source)
	at frame.GUIJFrame$14.actionPerformed(GUIJFrame.java:591)
	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
	at javax.swing.AbstractButton.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)
	at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)
	at java.awt.Component.processMouseEvent(Unknown Source)
	at javax.swing.JComponent.processMouseEvent(Unknown Source)
	at java.awt.Component.processEvent(Unknown Source)
	at java.awt.Container.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
	at java.awt.Container.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEvent(Unknown Source)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
	at java.awt.EventDispatchThread.run(Unknown Source)

Die Hilfedateien habe ich in einem Ordner Hilfethemen im /bin Verzeichnis.


----------



## L-ectron-X (30. Nov 2010)

Ups, sorry, ich habe noch einen Fehler übersehen und ihn nachträglich korrigiert.
Bitte noch mal den obigen Code ausprobieren.



> at java.applet.Applet.getCodeBase(Unknown Source)


Deutet auf eine unbrauchbare URL hin. Hast du die bereits korrigiert?
Wenn die URL nicht initialisiert werden konnte bleibt sie _null_ und es wird beim Zugriff eine NullPointerException geworfen.


----------



## helene (30. Nov 2010)

Ich habe deinen Code erneut ausprobiert und es kommt immer noch dieselbe Fehlermeldung. Vielleicht verstehe ich die Methode getCodeBase() nicht richtig.

Sollte mir mit getCodeBase() nicht die URL bzw. der Verzeichnispfad des Applets angezeigt werden? Und mit dem dahinterliegenden String sollte doch in das Verzeichnis Hilfethemen gesprungen werden und anschließend die Datei index.html geöffnet werden.

Danke noch einmal für deine bisherige Hilfe.


----------



## L-ectron-X (30. Nov 2010)

helene hat gesagt.:


> Sollte mir mit getCodeBase() nicht die URL bzw. der Verzeichnispfad des Applets angezeigt werden?


Genau, das Verzeichnis, in dem die .class-Datei des Applets liegt.



helene hat gesagt.:


> Und mit dem dahinterliegenden String sollte doch in das Verzeichnis Hilfethemen gesprungen werden und anschließend die Datei index.html geöffnet werden.


Stimmt.

Hast du es schon mal so versucht?
[JAVA=9]URL page = new URL(getCodeBase(), "Hilfethemen/index.html");[/code]
Ich glaube der Pfad, den getCodeBase() liefert, endet bereits mit einem Slash (/).
Bei einem schnell geschriebenen Test-Applet hat es bei mir so funktioniert.


----------



## helene (30. Nov 2010)

Habe ich jetzt mal versucht, ändert aber leider nichts an der Fehlermeldung, hmm. Ich habe mal versucht mir die Methode getCodeBase() auf der Konsole auszugeben mit:


```
System.out.println("getCodeBase() = " + getCodeBase());
```

Geht in der abstrakten Klasse leider auch nicht. Aber in dem der main Class, mit der ich mein GuiFrame aufrufe funktioniert es. Da muß mein Fehler wohl in der Instanziierung meiner GuiFrame liegen.


----------



## L-ectron-X (30. Nov 2010)

Vielleicht kannst du die Java-Dateien hier als Anhang (gepackt) hochladen... 
Dann kann man sich das mal genauer ansehen und muss nicht immer nur mit Fragmenten handtieren.
Wenn du noch Hilfe brauchst, meldest du dich einfach wieder.


----------



## helene (30. Nov 2010)

Danke, ich probier erst noch ein wenig.


----------



## L-ectron-X (30. Nov 2010)

Ich hab das mal mit einem Test-Applet ausprobiert. Mit dem berichtigten Code funktioniert das.


----------



## helene (30. Nov 2010)

Juchu, jetzt läuft es auch bei mir. Ich habe die separate Aufruf Klasse des Applets weggelassen. Da muß ich wohl noch mal nachlesen wie das zu funktionieren hat.

Vielen Dank nochmal für deine Hilfe.


----------

