applet Methode aus abstrakter Klasse aufrufen

helene

Mitglied
Hallo,

ich habe ein Applet, indem eine abstrakte Klasse implementiert wurde. Nun möchte ich in dieser abstrakten Klasse auf die Funktion
Code:
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.
 
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.
 
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

Java:
/**
	* 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?
 
Über einen Menüpunkt kann eine Hilfedatei aufgerufen werden.
Kann mich erinnern, da habe ich dir bereits geholfen.

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:
Java:
  /**
    * 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?
 
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.
 
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.
 
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.
 
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.

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.
 
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:

Java:
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.
 
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. 😉
 
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.
 

Neue Themen


Zurück
Oben