Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Eigene Hilfsklassen im applet verwenden (Netbeans)
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:
Code:
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
Code:
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.
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
Code:
/*
* 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)
at sun.applet.AppletClassLoader.loadClass(AppletClassLoader.java:123)
at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
at sun.applet.AppletClassLoader.loadCode(AppletClassLoader.java:566)
at sun.applet.AppletPanel.createApplet(AppletPanel.java:617)
at sun.applet.AppletPanel.runLoader(AppletPanel.java:546)
at sun.applet.AppletPanel.run(AppletPanel.java:298)
at java.lang.Thread.run(Thread.java:534)
Caused by: java.io.IOException: open HTTP connection failed.
at sun.applet.AppletClassLoader.getBytes(AppletClassLoader.java:265)
at sun.applet.AppletClassLoader.access$100(AppletClassLoader.java:43)
at sun.applet.AppletClassLoader$1.run(AppletClassLoader.java:152)
at java.security.AccessController.doPrivileged(Native Method)
at sun.applet.AppletClassLoader.findClass(AppletClassLoader.java:149)
... 8 more
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.
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.
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
symbol : class SendAndLoad
location: package senden
import senden.SendAndLoad;
^
D:\webserver\wms\spielewiese\senden\sendenundladen.java:40: package org.netbeans
.lib.awtextra does not exist
getContentPane().setLayout(new org.netbeans.lib.awtextra.AbsoluteLayout(
));
^
D:\webserver\wms\spielewiese\senden\sendenundladen.java:46: package org.netbeans
.lib.awtextra does not exist
getContentPane().add(jScrollPane1, new org.netbeans.lib.awtextra.Absolut
eConstraints(0, 20, -1, 190));
^
D:\webserver\wms\spielewiese\senden\sendenundladen.java:55: package org.netbeans
.lib.awtextra does not exist
getContentPane().add(Laden, new org.netbeans.lib.awtextra.AbsoluteConstr
aints(0, 264, 400, 30));
^
D:\webserver\wms\spielewiese\senden\sendenundladen.java:58: package org.netbeans
.lib.awtextra does not exist
getContentPane().add(jLabel1, new org.netbeans.lib.awtextra.AbsoluteCons
traints(0, 0, -1, -1));
^
D:\webserver\wms\spielewiese\senden\sendenundladen.java:61: package org.netbeans
.lib.awtextra does not exist
getContentPane().add(jLabel2, new org.netbeans.lib.awtextra.AbsoluteCons
traints(0, 220, -1, -1));
^
D:\webserver\wms\spielewiese\senden\sendenundladen.java:63: package org.netbeans
.lib.awtextra does not exist
getContentPane().add(Parameter, new org.netbeans.lib.awtextra.AbsoluteCo
nstraints(0, 240, 400, -1));
^
D:\webserver\wms\spielewiese\senden\sendenundladen.java:68: cannot resolve symbo
l
symbol : class SendAndLoad
location: class senden.sendenundladen
SendAndLoad s = new SendAndLoad();
^
D:\webserver\wms\spielewiese\senden\sendenundladen.java:68: cannot resolve symbo
l
symbol : class SendAndLoad
location: class senden.sendenundladen
SendAndLoad s = new SendAndLoad();
^
9 errors
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".
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.
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
Code:
/*
* 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
Code:
/*
* 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!";
}
}
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???
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.
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:
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?
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.
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.
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.