# Eigene Hilfsklassen im applet verwenden (Netbeans)



## alex-t (21. Jul 2004)

irgendwie komme ich mit den imports noch nicht ganz klar.

ich habe ein testapplet erstellt. darauf eine textpane und einen button.
zusätzlich arbeite ich an einer hilfsklasse (sendandload), die mir das leben mit meinen php scripten erleichtern soll.
die aktion des buttons ist etwa:

```
SendAndLoad s = new SendAndLoad();
Hashtable h = s.SendAndLoadURL("http://localhost/testseite.php"); //resH.put("test","asdf");
String t = h.get("test");

AusgabeTextpane.setText(t);
```

zunächsteinmal hatte ich 2 tage lang probleme mit der einbindung eigener klassen. ich habe nicht verstanden warum ein

```
import eigeneklasse;
```
aus dem selben verzeichnis und ohne package anweisung nicht funktionierte. jetzt meckert netbeans nicht mehr. allerdings musste ich dafür auch noch einen unterordner im filesystem anlegen. unter root ging das nicht. wenn mir das jeamand erklären könnte, wäre ich sehr dankbar.

aber da dies nun zu laufen scheint, bekomme ich nun andere mir unerklärbare fehlermeldungen. zuerst hatte ich in der methode SendAndLoadURL ein try{} vergessen. nachdem ich dieses (meines wissens nach, korrekt) hinzugefügt habe, kommt ein java applet notinited. im browser hatte ich das schon vorher so, aber nun auch im appletviewer von netbeans aus.


kann mir jemand klip und klar erklären wie ich externe hilfsklassen zu meinem applet hinzufügen kann, bitte! aber so, dass das applet danach noch funktioniert.


----------



## L-ectron-X (21. Jul 2004)

Ich würde mir das gerne mal ansehen. Kann man sich die entsprechenden Klassen irgendwo herunter laden?


----------



## alex-t (22. Jul 2004)

L-ectron-X hat gesagt.:
			
		

> Ich würde mir das gerne mal ansehen. Kann man sich die entsprechenden Klassen irgendwo herunter laden?



*sendenundladen.java*

```
package senden;

import java.util.*;
import javax.swing.*;
import senden.SendAndLoad;


/*
 * sendenundladen.java
 *
 * Created on 19. Juli 2004, 22:38
 */
//import SendAndLoad;

/**
 *
 * @author  Programmierer
 */
public class sendenundladen extends JApplet {
    
    /** Initializes the applet sendenundladen */
    public void init() {
        initComponents();
        setSize(400,300);
    }
    
    /** This method is called from within the init() method to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        Ausgabe = new javax.swing.JTextPane();
        Laden = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        Parameter = new javax.swing.JTextField();

        getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout());

        setName("SendAndLoad");
        jScrollPane1.setPreferredSize(new java.awt.Dimension(400, 200));
        jScrollPane1.setViewportView(Ausgabe);

        getContentPane().add(jScrollPane1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 20, -1, 190));

        Laden.setText("SendAndLoad");
        Laden.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                LadenActionPerformed(evt);
            }
        });

        getContentPane().add(Laden, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 264, 400, 30));

        jLabel1.setText("Empfang");
        getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 0, -1, -1));

        jLabel2.setText("Parameter");
        getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 220, -1, -1));

        getContentPane().add(Parameter, new org.netbeans.lib.awtextra.AbsoluteConstraints(0, 240, 400, -1));

    }

    private void LadenActionPerformed(java.awt.event.ActionEvent evt) {
        SendAndLoad s = new SendAndLoad();
        String t = s.getText();
        Ausgabe.setText(t);
    }
    
    
    // Variables declaration - do not modify
    private javax.swing.JTextPane Ausgabe;
    private javax.swing.JButton Laden;
    private javax.swing.JTextField Parameter;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JScrollPane jScrollPane1;
    // End of variables declaration
    
}
```

*SendAndLoad.java*

```
/*
 * SendAndLoad.java
 *
 * Created on 21. Juli 2004, 09:40
 */

package senden;


import java.*;
import java.util.*;
import java.net.*;
import java.io.*;
/**
 *
 * @author  Programmierer
 */
public class SendAndLoad {
    
    /** Creates a new instance of SendAndLoad */
    public SendAndLoad() {
    }
    
    public String getText(){
        return "lasdkfjöalsdkfjölsadkfjösldfjaösdf";
    }
    
    public Hashtable SendAndLoadURL(String u){
        Hashtable res = new Hashtable(); 
        String text = new String();
        //res.put("key","value"); 
        try{
        URL B = new URL(u);
        InputStream in = B.openStream();
        //buffering:
        in = new BufferedInputStream(in);
        
        Reader r = new InputStreamReader(in);
        int c;
        while((c = r.read()) != -1){
            text += (char) c;
        }
        res.put("T", text );
        }
        catch(MalformedURLException e){
            System.err.println("URL");
        }
        catch(IOException e){
            System.err.println("IO");
        }
        return res;
    }
}
```

ich habe das ganze etwas vereinfacht, die fehler treten immer noch auf. weiter habe ich mit diesem code einen ladefehler:


> Laden: Klasse senden.sendenundladen.class nicht gefunden
> java.lang.ClassNotFoundException: senden.sendenundladen.class
> at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:162)
> at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
> ...




beide .java dateien befinden sich in einem verzeichnis 'senden'. falls das helfen sollte.

ich verstehe nicht warum das nicht geladen werden kann.
kann mir jemand an meinem beispiel erklären wo sich der fehlerteufel eingeschlichen hat?


----------



## L-ectron-X (22. Jul 2004)

Klassen, die in ein und dem selben Package liegen, brauchen ihr Package für den Zugriff nicht importieren.

Kann sein, dass ich jetzt verkehrt liege. Ich vermute, dass es sich bei Deinem Problem um eine anzupassende Compiler-Einstellung oder eine andere Einstellung innerhalb von NetBeans handelt.
Das konnte ich bisher auch noch nicht klären. Bei mir geht das mit NetBeans auch nicht.

Falls Dir der Umgang mit dem Java-Compiler an der Console geläufig ist, kannst Du dort mal probieren, Deine Klassen mit Packages zu kompilieren. Der Befehl dafür:
*javac -d c:\zielverzeichnis MeineKlasse.java*
Die Verzeichnisnamen im Pfad dürfen keine Leerzeichen enthalten.
Der Compiler erzeugt mit diesem Befehl die entsprechenden Verzeichnisse der Packages unterhalb des Zielverzeichnisses mit den entsprechenden Bytecode-Dateien darin.

Ich habe mir mal Deinen Code angesehen. Du verwendest das AbsoluteLayout, das die NetBeans IDE mitliefert. Wenn Du dieses Layout benutzen möchtest, musst Du Deinem fertigen Projekt die Klassen dieses Layouts mit dazu legen, weil dieses Layout nicht zu den Standard Java-Klassen gehört, die im JRE enthalten sind.
Alternativ zu diesem Layout könntest Du das NullLayout oder das GridbagLayout benutzen, mit dem sich die Komponenten ebenfalls beliebig auf der GUI positionieren lassen.


----------



## alex-t (22. Jul 2004)

L-ectron-X hat gesagt.:
			
		

> Klassen, die in ein und dem selben Package liegen, brauchen ihr Package für den Zugriff nicht importieren.


heisst das, dass ich da keine imports oder keine packages setzen muss?



			
				L-ectron-X hat gesagt.:
			
		

> Falls Dir der Umgang mit dem Java-Compiler an der Console geläufig ist, kannst Du dort mal probieren, Deine Klassen mit Packages zu kompilieren. Der Befehl dafür:
> *javac -d c:\zielverzeichnis MeineKlasse.java*


stimmt, das habe ich noch gar nicht probiert. ich glaube ich werde netbeans in zukunft nur als sandkasten benutzen, und den quellcode einfach daraus in den notepad, und anschliessend mit javac compilieren. es nervt unheimlich, dass man den generierten code nicht verändern kann. selbst das austricksen mit dem editor hatte nicht geklappt.



			
				L-ectron-X hat gesagt.:
			
		

> Ich habe mir mal Deinen Code angesehen. Du verwendest das AbsoluteLayout, das die NetBeans IDE mitliefert. Wenn Du dieses Layout benutzen möchtest, musst Du Deinem fertigen Projekt die Klassen dieses Layouts mit dazu legen, weil dieses Layout nicht zu den Standard Java-Klassen gehört, die im JRE enthalten sind.
> Alternativ zu diesem Layout könntest Du das NullLayout oder das GridbagLayout benutzen, mit dem sich die Komponenten ebenfalls beliebig auf der GUI positionieren lassen.


oh, danke dir, das habe ich nicht gewusst. ich werde dann nulllayout benutzen.


----------



## alex-t (22. Jul 2004)

> C:\Programme\j2sdk1.4.2_05\bin>javac -d c:\ "D:\webserver\wms\spielewiese\senden
> \sendenundladen.java"
> D:\webserver\wms\spielewiese\senden\sendenundladen.java:5: cannot resolve symbol
> 
> ...



warum meckert er bei:

package senden;
import senden.(FEHLER)....


----------



## L-ectron-X (22. Jul 2004)

Zu 1. Post Abs. 1 und 2. Post:
Wenn Klassen, die sich gegenseitig aufrufen im gleichen Package (und damit auch Verzeichnis) liegen, brauchen sie das Package welches sie deklarieren nicht zu importieren. Das heißt, dass dann auf die Import-Anweisung verzichtet werden kann.

Zu 1. Post Abs. 2:
Sicher, die Handhabung und Beeinflussung des von NetBeans erzeugten Codes ist vielleicht etwas schwierig, lässt sich aber dennoch durch weg machen. Ich hatte ja dazu schon mal im Tools und IDE-Thread etwas geschrieben.
Wenn Du mal Zeit zum "Spielen" hast, solltest Du mal etwas in diesem Bereich herum probieren und die Ergebnisse im Code ansehen, dann wirst Du merken, dass sich der erzeugte Code sehr wohl beeinflussen lässt.
Man kann auch wunderbar seinen Code von Hand im Code-Editor schreiben, und das recht komfortabel.
NetBeans ist auch eine Frage der Übung, ich brauchte auch einige Zeit, um damit sinnvoll umzugehen.

Wenn Dir das Notepad mal zu lästig wird, kannst Du auch eine etwas komfortablere Möglichkeit des Programmierens in Java ausprobieren. z.B. den _Java Editor_. Download hier Das Programm ist in Deutsch.
Es gibt auch noch andere kostenlose Code-Editoren, z.B. GEL oder JCreator. Dazu gibts auch hier im Forum einen Thread.

Zum Programmieren mit IDEs: Es ist sicher von Vorteil damit schnell mal eine Oberfläche zusammen zusetzen, aber um das Erlernen der Programmierung von GUIs von Hand sollte man sich nicht "drücken".


----------



## L-ectron-X (22. Jul 2004)

Das AbsoluteLayout kannst Du gegen ein Standard-Layout tauschen, oder es einbinden, damit der Compiler es finden kann. NetBeans kennt den ClassPath zum Layout, der Java-Compiler nicht.

Der Aufruf des Compiler für Dein Beispiel müsste so aussehen:
*javac -d D:\webserver\wms\spielewiese sendenundladen.java*
Dann legt der Compiler die Bytecode-Dateien im Verzeichnis
*D:\webserver\wms\spielewiese\senden* ab und zwar unabhängig vom Speicherort der Quelldateien.


----------



## alex-t (23. Jul 2004)

danke dir für die tipps mit dem layout. das benutzte layout war mit sicherheit nur zufällig gewählt, aber trotzdem, dies wird dann wohl noch die eine oder andere schlechte überraschung verhindern - mit sicherheit.


ich habe von einem bekannten einen tipp bekommen, es mal mit dem eclipse zu versuchen. bis jetzt bin ich nur positiv davon angetan und benutze in zukunft beide editoren parallel, wobei ich den gui code von netbeans vorbereite und den dann in mein projekt im eclipse einfüge. ich hoffe meine milchrechnung geht auf.

aber jetzt bin ich mir immer noch nicht sicher, wie ich das problem mit den hilfsklassen lösen kann.
deshalb eine ungewöhliche bitte an euch. kann mir jemand diesen code in zwei compilierbare .java dateien packen:

meinApplet.java

```
/*
 * meinApplet.java
 *
 * Created on 23. Juli 2004, 22:30
 */

package test;

import test.meineHilfsklasse;
/**
 *
 * @author  surfer
 */
public class meinApplet extends javax.swing.JApplet {
    
    /** Initializes the applet meinApplet */
    public void init() {
        initComponents();
    }
    
    /** This method is called from within the init() method to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    private void initComponents() {
        go = new javax.swing.JButton();
        ausgabe = new javax.swing.JTextPane();

        go.setText("GO");
        go.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                goActionPerformed(evt);
            }
        });

        getContentPane().add(go, java.awt.BorderLayout.SOUTH);

        getContentPane().add(ausgabe, java.awt.BorderLayout.CENTER);

    }

    private void goActionPerformed(java.awt.event.ActionEvent evt) {
        meineHilfsklasse h = new meineHilfsklasse();
        this.ausgabe.setText(h.test());
    }
    
    
    // Variables declaration - do not modify
    private javax.swing.JTextPane ausgabe;
    private javax.swing.JButton go;
    // End of variables declaration
    
}
```

meineHilfsklasse.java

```
/*
 * meineHilfsklasse.java
 *
 * Created on 23. Juli 2004, 22:32
 */

package test;

/**
 *
 * @author  surfer
 */
public class meineHilfsklasse {
    
    /** Creates a new instance of meineHilfsklasse */
    public meineHilfsklasse() {
    }
    
    public String test(){
        return "Hallo, dies ist ein kleiner Test!";
    }
    
}
```


----------



## alex-t (26. Jul 2004)

okay, jetzt habe ich den gleichen code in eclipse in einem projekt erstellt und im appletviewer von eclipse gestartet, und siehe da, es läuft.

folgendes problem (seit 2 tagen): 

ES LÄUFT NICHT IM BROWSER!!!

und ich suche schon 10 stunden nach einer lösung. bitte helft mir!

das applet will nicht laufen!


----------



## L-ectron-X (27. Jul 2004)

Hier stehts:
http://www.java-forum.org/de/viewtopic.php?t=4936


----------



## alex-t (27. Jul 2004)

so wie ich das verstanden habe - und so wie es momentan bei mir eigentlich nur läuft - geht es nicht ohne package anweisung. ist das richtig?

ich habe jetzt nochmal eine ganze nach an diesem problem gesessen. und ich werde wahnsinnig. ich komme aus der c++ welt und kenne diese art der problematik nun überhaupt nicht. ein include ist ein include ist ein include...


okay, mein applet läuft, die gui wird dargestellt, die methoden habe ich noch nicht implementiert, aber das dürfte dann auch weiterhin kein problem sein, zumindest nicht zu diesem zeitpunkt.


nun zu der alten geschichte - siehe oben - WIE BINDE ICH EIGENE KLASSEN BEI MEINEM APPLET EIN???
denn ohne package läuft das ja nicht mehr. sowohl netbeans als auch eclipse sind sich in diesem punkt einig. ich denke ich habe so ziemlich jede verfügbare option angeklickt, mehrmals beide programme und auch das jdk neuinstalliert, aber ohne erfolg.

im appletviewer läuft das applet mit den hilfsklassen (wie z.b. einem zusatzdialog oder einem urlconnection wrapper, oä), aber im brower geht es nur ohne die package anweisung. WARUM???


----------



## L-ectron-X (27. Jul 2004)

alex-t hat gesagt.:
			
		

> im appletviewer läuft das applet mit den hilfsklassen (wie z.b. einem zusatzdialog oder einem urlconnection wrapper, oä), aber im brower geht es nur ohne die package anweisung. WARUM???


Uff, das habe ich auch noch nicht heraus bekommen können. Ich konnte auch noch kein Applet mit package-Anweisung im Browser zum Laufen bringen. Ich habe mir auch schon länger den Kopf darüber zerbrochen, bin aber zu keinem schlüssigen Ergebnis gekommen.
Ich bin aber der Meinung, das es irgendwie geht. Ich bleibe da auch weiter dran. Aber so lange ich noch keine Antwort darauf habe, muss ich meine Applets auch ohne Packages schreiben.


----------



## alex-t (27. Jul 2004)

und wie importierst du andere klassen - d.h. selbst geschriebene klassen?


----------



## L-ectron-X (27. Jul 2004)

Im Prinzip repräsentieren Packages ja auch nur eine Verzeichnisstruktur.

de
|
 - mydomain
|   
 - applications
|      |
|  classes -> Calculator.class
|
 - applets
       |
   myapplet -> MyApplet.class
                 -> HelperClass.class

Nehmen wir mal an, das Applet heißt MyApplet.class. Wenn ich nun ein Objekt von HelperClass in meinem Applet benutzen möchte, brauche ich kein Package und keine Klasse importieren, da beide Klassen im gleichen Package liegen und sich somit sehen können.
Wenn ich nun aber ein Objekt der Klasse Calculator in meiner Klasse MyApplet verwenden möchte, muss ich das Package, in dem sich die Klasse Calculator befindet importieren.

Also schreibe ich in der Klasse MyApplet folgende Zeile zum Importieren der Klasse Calculator:

```
import de.mydomain.applications.classes.*;
```
für alle Klassen des Packages
oder

```
import de.mydomain.applications.classes.Calculator;
```
für nur die eine Klasse aus dem Package.


----------



## alex-t (27. Jul 2004)

> grau, mein freund, ist alle theorie, und grün  des lebens goldner zweig.



dem nach habe ich glaube ich nichts falsch gemacht. kann es sein, dass es dann an meiner jdk version liegt?


----------



## L-ectron-X (27. Jul 2004)

Das _was_ an Deiner JDK-Version liegt?
Wir haben inzwischen so viel disskutiert, kannst Du mir noch mal auf die Sprünge helfen? :wink:
Welche Vorrausetzungen hast Du denn inzwischen?

Das Applet läuft also nicht im Browser. Meinst Du das? OK.
Sind noch Package-Anweisungen in Deinen Klassen? Welche VM-Version benutzt Dein Browser?  Hast Du mal die target-Option probiert? Welche Fehlermeldungen gibts in der Java-Console bzw. Statuszeile?


----------



## alex-t (28. Jul 2004)

ICH HABS!!!


<APPLET codebase=.. code="PACKAGE/APPLET.class" width=100% height=100%></APPLET>

so, diesen tag hatte ich in fast der gleichen form schon von irgendeinem editor erhalten. ich meine das wäre jbuilder gewesen. doch damals hatte es auch nicht funktioniert. der unterschied: codebase!
ich hab durch try&error mal .. statt . gesetzt und siehe da 

suuuper!!! es läuft, na dann kann die arbeit weitergehen. und wenn ich probleme mit dem .jar erstellen habe, melde ich mich wieder.

hoffe ich helfe damit jemand anders.


----------



## L-ectron-X (28. Jul 2004)

Zumindest hast Du schon mir geholfen. Danke!
Ich werde das auch gleich ausprobieren. :wink:


----------



## alex-t (28. Jul 2004)

ich habs nochmal getestet, das obere läuft zwar im ie, aber nicht mit opere (nn).

hier die bessere version:

<APPLET codebase=.. code="PACKAGE.APPLET.class" width=100% height=100%></APPLET>


----------



## L-ectron-X (8. Aug 2004)

Ich habe beide Versionen probiert, in zwei verschiedenen Browsern. Es hat nicht funktioniert.


----------



## alex-t (8. Aug 2004)

wie sieht denn der code für dein applet und der html tag aus?


----------



## L-ectron-X (8. Aug 2004)

Dieses Beispiel funktioniert:

```
package test;

import java.awt.*;
import java.applet.*;

public class HelloWorld extends Applet {

  public void paint(Graphics g) {
    g.drawString("Hello World", 0, 10);
    g.drawString(getCodeBase().toString(), 0, 25);
  }
}
```


```
<html>
  <body>
    <applet code="test.HelloWorld.class" width=400 height=50>
    </applet>
  </body>
</html>
```

Anderes Beispiel:
Diese Klasse funktioniert überall tadellos. Sobald ich Packages deklariere kann die Klasse nicht mehr gefunden werden:

```
package de.bytes4fun.applets.jpuzzle;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;

public class JPuzzleApplet extends Applet {
...
...
...
}
```
Der Übersicht halber nur der Rumpf.

```
<html>
  <body>
    <applet code="de.bytes4fun.applets.jpuzzle.JPuzzleApplet.class" width=280 height=320>
    </applet>
  </body>
</html>
```

Deine vorgeschlagene Lösung...

```
...
  <applet codebase=".." code="de.bytes4fun.applets.jpuzzle.JPuzzleApplet.class" width=280 height=320>
...
```
auch ohne Gänsefüßchen beim CodeBase-Attribut funktioniert hier leider nicht.


----------



## L-ectron-X (8. Aug 2004)

Ich habe noch weiter ein wenig herum experiementiert. Ich habe den Fehler gefunden. Die HTML-Datei lag nicht am richtigen Ort zum Applet. Allerdings zeigt es nun keine Grafiken mehr an. Aber das finde ich sicher auch noch heraus.


----------



## alex-t (8. Aug 2004)

so traurig es auch klingen mag, wir haben es einfach nicht gebacken bekommen 

ist wohl doch kein fehler in java gewesen, sondern nur ein html fehler. 
ich habe auch viele stunden gebraucht, bis ich es soweit gebracht habe. nun folgen weitere tage und wochen im kaffee dschungel.

a'pro po kaffee....


----------

