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.
Hallo,
bin neu hier und habe keine Ecke im Forum gefunden, wo meine Frage wirklich hinpasst. Also probiere ich's mal hier:
Habe ein Applet geschrieben, das eine logische Gatter-Schaltung darstellt, für die der Benutzer dann die Input-Signale verändern kann. Das Teil lief zu "Java 6"-Zeiten ohne größere Probleme. Unter Java 7 jedoch gibt's massiven Ärger:
Wenn das Applet auf einer HTML-Seite nur einmal aufgerufen wird, läuft es (manchmal, bei frisch gebootetem Rechner oft) ohne Probleme und erwartungsgemäß.
Wenn die HTML-Seite jedoch 2 Instanzen des Applets initialisieren soll, erscheint meist keinerlei Applet. In seltenen Fällen erscheint eine der beiden Instanzen und läuft erwartungsgemäß, aber nach längerer Zeit friert dann der Browser (IE 11) ein und muss mit dem Taskmanager entsorgt werden.
Ich habe das Applet mit Eclipse erstellt. Dort werden die Probeläufe beim Debuggen offenbar über den AppletViewer von JAVA (1.7) abgewickelt, wobei niemals irgend welchen Probleme zu Tage traten. Wenn ich dem AppletViewer direkt eine HTML-Seite übergebe, die 2(!) APPLET-Tags für 2 Aufrufe meines Applets (mit verschiedenen Schaltungs-Daten) enthält, dann öffnet er brav 2 Fenster, in denen die beiden Instanzen meines Applets munter und erwartungsgemäß vor sich hinwerkeln und korrekt auf User-Eingaben reagieren.
Welche zusätzlichen Anforderungen an Applets wurden mit dem Übergang zu JAVA 7 eingeführt, mal abgesehen von den erhöhten Sicherheitsanforderungen? Gibt es zusätzliche Dinge, die bei der Applet-Programmierung inzwischen zu berücksichtigen sind und unter JAVA 6 noch keine Rolle spielten?
MfG McLing.
vielen Dank für die Hilfe beim Suchen! Es ist in der Tat eine ganze Menge im Netz zu finden zu diesem Thema, aber ich habe trotzdem große Schwierigkeiten, zu erkennen, was mir hier und jetzt wirklich helfen könnte.
Genauere Nachforschungen auf anderen Windows-Versionen und anderen Browsern lassen mich inzwischen vermuten, dass es sich bei meinem Problem gar nicht (mehr) um ein Java-Problem handelt, sondern um ein Microsoft-Problem. Ich habe mein Applet auf meinen GK-Informatik-Seiten eingesetzt, dort auf den "Hardware"-Seiten, die noch in der Entwicklung sind. Unter "Hardware | Wie rechnen Rechner?" wird das Applet (derzeit!) genau einmal eingesetzt, auf der Seite "Hardware |Logische Grundoperationen" werkeln hingegen 5 Instanzen dieses Applets parallel.
Allerdings nur, wenn der jeweilige Computer das zulässt. Mit Hilfe der großen Menge alter Rechner, die sich bei mir angesammelt hat, habe ich die folgenden Beobachtungen gemacht:
Ein XP-Rechner mit IE8 stellt alle Seiten fehlerfrei dar.
Ein Vista-Rechner mit IE9 macht ebenfalls keine Probleme.
Ein Win7-Rechner mit IE11 lässt höchstens 1 Instanz des Applets laufen; der Versuch, auf eine Seite mit mehreren Instanzen zu wechseln, wird mit einem einfrierenden Browser bestraft.
Auf einem anderen Win7-Rechner mit IE11 läuft wiederum alles klaglos.
Auf einem Win8.1-Laptop mit IE11 laufen alle Applets im Prinzip; beim Scrollen zerreißen jedoch die visuellen Darstellungen er einzelnen Applets.
Übrigens war auf allen Rechnern eine aktuelle Java7 JRE installiert, mindestens 7u51.
Ersetzt man unter Win7 den IE11 durch Firefox, dann verbessert sich die Lage. Noch stabiler und fast schon makellos arbeitet Chrome, speziell auf Win8.1. Insgesamt aber werde ich das Gefühl nicht los, dass mein Applet noch ziemlich buggy ist.
Beim Studium der von Ma~ genannten Seiten bin ich über die Forderung gestolpert, dass ein Applet stets alle belegten Ressourcen nach Gebrauch tunlichst wieder freigeben soll. Als alter PASCAL-Anwender war ich ja gewohnt, Destruktoren zu schreiben, die genau das tun; aber zu den ersten Dingen, die mir in Java beigebracht wurden, gehörte, dass gerade das nun nicht mehr nötig sei: die Garbage collection würde das jetzt schon alles automatisch tun!
Also mal eine konkrete Frage: Ist der folgende Code korrekt oder hinterlässt er Ressourcen-Reste? Speziell: Ist die Zeile 10 eigentlich nötig oder nicht?
Java:
private boolean doLoadCircuitFile(URL fname) {
InputStream inpstr;
try {
inpstr = fname.openStream();
DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
factory.setValidating(false);
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(inpstr); // returns DOM
inpstr.close();
NodeList objListNodeList = document.getElementsByTagName("ElementList"); //$NON-NLS-1$
Node objListNode = objListNodeList.item(0);
NodeList objNodes = objListNode.getChildNodes();
cElemList.clear(); // Delete all objects in the list!
// Rebuild all the GeoObj objects from the data file:
int n = objNodes.getLength();
for (int i = 0; i < n; i++) {
Node actNode = objNodes.item(i);
// We have to skip the formatting nodes (line break and tabs).
if (!actNode.getNodeName().equalsIgnoreCase("#text")) { //$NON-NLS-1$
CElem obj = CElemFactory.createObject((Element) actNode);
if (obj != null) {
cElemList.add(obj);
}
}
}
cElemList.adjustNextId();
cElemList.connectAllCElements();
return true;
} catch (ParserConfigurationException e) {
// This should never happen, so we just re-throw it at runtime.
throw new RuntimeException("XML parser exception caught!", e); //$NON-NLS-1$
} catch (MalformedURLException e) {
System.err.println("Malformed URL:\n" + e.getMessage()); //$NON-NLS-1$
} catch (IOException e) {
System.err.println("IO-Exception:\n" + e.getMessage()); //$NON-NLS-1$
} catch (SAXException e) {
System.err.println("SAX-Exception:\n" + e.getMessage()); //$NON-NLS-1$
}
return false;
}
Hi!
Nachdem sich hier niemand zu diesem vertrackten Thema äußern will, möchte ich wenigstens berichten, was sich bei mir inzwischen in dieser Sache getan hat.
Zunächst hat sich herausgestellt, dass manche meiner obigen Diagnosen möglicherweise verkehrt waren, weil ich bei ihrer Erstellung nicht auf die Caches der jeweils verwendeten Browser geachtet habe. So haben die Browser eventuell mit alten Versionen des Applets gearbeitet statt mit der gerade frisch hochgeladenen neuesten.
Sodann habe ich in meinem Applet vorsichtshalber/versuchsweise die JApplet-Schnittstelle vollständig ausprogrammiert, also auch diejenigen Funktionen ergänzt, die eigentlich nichts zu tun haben. Außerdem habe ich das Manifest des Applets um die von Oracle gewünschten Angaben ergänzt, und natürlich habe ich die JAR-Datei unterschrieben. In der aktuell verfügbaren Version scheinen die Seiten (unter Grundkurs Informatik, dort im Bereich "Hardware") erwartungsgemäß zu arbeiten.
Der einzige Rechner, auf dem ich das Problem mit den mehreren parallelen Instanzen (m)eines Applets stabil verifizieren konnte (und kann), ist mein JAVA-Entwicklungsrechner (Win7-PC, mit OCZ-SSD als System-Laufwerk, i5-Prozessor, 8GB Speicher). Nachdem mir dieser aber einige Male dekorativ abgeschmiert ist (mit sofortigen Crash-Protokoll-Meldungen im DOS-Text-Modus), habe ich mich dazu durchgerungen, diese Maschine für krank zu halten. Werde sie von Grund auf neu installieren.