# allgemeine (Anfänger-)Fragen zu Applet, Threads und Bildern



## strope (25. Jul 2005)

Hallo!

Da ich in der Java-Welt noch ziemlich neu bin und trotzdem ein tolles Applet/Internetseite erstellen soll, hab ich mal ein paar grundsätzliche Fragen:

Im Großen und Ganzen ist alles ganz einfach: ich hab ein Hintergrundbild, auf dem Werte angezeigt werden und Werte eingebbar sein sollen. 

Ein paar Sachen dazu hab ich im Forum schon gefunden. Aber auf eine gute Struktur bin ich noch nicht gekommen.
Vielleicht kann mir dazu jemand einen Tipp geben?

Ich habe Folgendes überlegt:

Die Klasse JApplet, der ich über getContentPane().add(Bild) eine Instanz Bild einer Klasse zufüge, die das Hintergrundbild enthält. Welche Klasse soll ich für's Bild nehmen? Canvas? JPanel...?

Alles andere muss ja leider durchsichtig sein, damit man im Hintergrund immer das Bild hat, deshalb muss ich swing benutzen (ist das richtig?) 

Hab z.B. ein kleines Thermometer-Bild (JPanel), welches eingefügt wird und wenn das nicht swing ist, hab ich immer ein undurchsichtiges Hintergrund-Rechteck.

Und diesem Hintergrundbild füge ich die einzelnen jButtons, jLabels usw. zu (über: Bild.add(...)   )

Ein Problem bisher: im Applet-Viewer ist das Hintergrundbild sichtbar, im IE nicht. :cry: 

Empfielt es sich einen Layout-Manager zu nehmen oder ist das in dem speziellen Fall zu umständlich? (die Beschriftungen/Eingabefelder sollen an bestimmten Stellen des Hintergrundbildes sichtbar sein)

Benutze NetBeans IDE 4.1, IE 6.0,  JRE 1.5.0_04 im IE

Ach ja und das ganze soll so gestaltet sein, dass es möglichst auf jedem PC mit IE oder einem anderen Browser läuft, ohne dass zusätzliche Komponenten installiert werden müssen. Ist das überhaupt möglich?

Ein Problem scheint dabei schon das JRE zu sein. Richtig?

Wäre toll, wenn mir jemand helfen könnte!

Vielen Dank!


----------



## Sky (25. Jul 2005)

Also, werd mal ein bißchen konkreter... ansonsten hier mal, versuchsweise die Antworten auf deine Fragen:

- Dein Bild ist im IE nicht sichtbar... wo sieht denn die Datei-Struktur aus? Unterscheidet sie sich von der in NetBeans?? Gibt es u.U. eine SecurityException!?

- Zu LayoutManager: Hierzu gibt es keine pauschale Antowort. Mir ist überhaupt nicht klar, wie dein Layout aussehen soll......

- Wenn das ganze auf jedem Rechner laufen soll, so solltest Du entweder auf eine "alte"-Java-Version zurückgreifen (sowas wie 1.1 oder 1.2 und nicht 1.5) oder es eher mit Serverseitigem Java versuchen und eine reine HTML-Ausgabe erzeugen.


----------



## strope (25. Jul 2005)

Also ich habe ein Hintergrundbild, welches den Aufbau einer Anlage darstellt (als jpg, gif o.ä.)
Und auf dieses Bild will ich jetzt Textfelder, Labels usw. so positionieren, dass sie bei dem zugehörigen Bauteil, das auf dem Bild dargestellt wird, erscheinen. Über diese Textfelder sollen dann Werte veränderbar sein und über einen Webserver an die tatsächliche Anlage weitergeleitet werden. Aber das ist ja ein anderes Thema 

Sobald ich den Layout-Manager ändere mit setLayout() sehe ich gar nix mehr.

Alle Klassen sind in einem Archiv. Eine HTML Seite und dieses Jar-Archiv werden übersetzt und dem C++ Programm zur Verfügung gestellt. Wenn dieses läuft, kann ich die Webseite anzeigen... 

Bei NetBeans liegen alle Klassen im selben Ordner und das jpg liegt auch dort... ist das das Problem? Das Bild fehlt schlicht und einfach, weil ich nur die Klassen ins jar packe... Und wie mach ich das dann? Einfach auch ins jar dazunehmen? Ich probier's gleich mal...

Eine Exception kommt auch manchmal, nur grade bekomm ich sie nicht. Irgendwas mit NullPointerException. Sie kommt nicht immer, aber wenn sie kommt, dann beim schließen des Applet-Fensters von NetBeans.

Wenn ich ne alte Java-Version nutzen will, dann muss ich mir die alte Version von JDK installieren, nehm ich an?

Verstehe "Serverseitiges Java" nicht... wie geht das?

Also danke für deine Hilfe auf alle Fälle

LG 
strope


----------



## strope (25. Jul 2005)

Ist es vielleicht besser, wenn ich das Hintergrundbild separat ins C++ - Projekt einbinde? Dann kann ich mehrere Applets darauf verteilen und so die Datenmenge beim Ändern von Werten auf der Seite verringern, weil immer nur ein kleiner Teil, also ein kleines Applet Wertänderungen erfährt, welche es dem Server mitteilt... Außerdem müsste das Bild nur einmal geladen werden. Oder seh ich das falsch?
Dafür muss das Applet bzw. müssen die Applets aber durchsichtig sein. Das hab ich schon versucht aber nicht geschafft. Innerhalb des Applets kann ich swing-Komponenten durchsichtig machen, aber das gesamte Applet hab ich nie durchsichtig gekriegt.
Oder gibt es noch bessere Alternativen?

Das Bild als Hintergrund bild richtig einbinden hab ich bisher nicht geschafft. Wie muss die Struktur aussehen?


----------



## L-ectron-X (25. Jul 2005)

Wenn du mit Java programmieren möchtest, sollte auch dein Hintergrundbild bereits in der Java-Anwendung liegen.
Da man sehr wahrscheinlich mit einem LayoutManager Schwierigkeiten bei der Ausrichtung der GUI-Komponenten auf einem "unregelmäßigen" Bild haben dürfte, wäre vielleicht das NullLayout am besten geeignet.


			
				strope hat gesagt.:
			
		

> Ein Problem bisher: im Applet-Viewer ist das Hintergrundbild sichtbar, im IE nicht.


Das kann mit der benutzten VM zusammenhängen.
Wenn du auf den Clients die Sun JRE installiert hast, der IE aber kein Applet anzeigen will, musst du in den IE-Einstellungen sicher stellen, dass er nicht die veraltete Microsoft-VM benutzt.
Lies dazu auch mal Folgendes: http://www.java-forum.org/de/viewtopic.php?t=4936

Als nächstes solltest du klären, für welche VM du programmieren willst. Für die Java 1.1-konforme Version (damit kann der IE mit MS-VM auch umgehen) oder für das Sun JRE.

...und dann sehen wir weiter. :wink:


----------



## strope (26. Jul 2005)

Netbeans erstellt ja beim Kompilieren auch eine HTML-Seite. Wenn ich diese aufrufe, dann seh ich das Hintergrundbild. 
Diese Seite will ich aber nicht nehmen, da sie ja nicht auf ein relatives Verzeichnis zugreift sondern auf das Dateiverzeichnis direkt.

Ich vermute also, dass das Hintergrundbild der Klasse nicht zugänglich ist. 
Deshalb meine Frage: wie mach ich das? Ins Jar File lässt sich ein jpg bzw. gif nicht mit aufnehmen...
Das Bild hole ich über:


```
URL codebase;
codebase = getCodeBase();  
Img = getImage (codebase, "backg01.gif");
```

Wo muss ich das gif dann platzieren?

Das mit der VM kann ich noch nicht klären. 
Welche Empfehlung bekomm ich denn? 
Vorteile - Nachteile?
Alte Version ist kompatibel aber dafür fehleranfälliger, oder?
Neue Version braucht u.U. ein Plug-In, welches der User erst installieren muss, wofür er im dümmsten Fall keine Rechte hat.
Da ich die 1.5.0_04 Version habe, kann ich nur mit einer älteren Version entwickeln bzw. kompilieren, wenn ich diese installiere. Geht das gut oder gibt es da Komplikationen, wenn man zwei Versionen gleichzeitig laufen hat?


----------



## MPW (26. Jul 2005)

ähm, hab' ich da oben was von swing in Appletts gelesen??

Hinweis: Geht nur mit PlugIn, haben aber sehr wenige Leute!


----------



## strope (26. Jul 2005)

Und geht durchsichtig OHNE swing? Soweit ich weiß, nicht, oder?


----------



## L-ectron-X (26. Jul 2005)

strope hat gesagt.:
			
		

> Welche Empfehlung bekomm ich denn?
> Vorteile - Nachteile?
> Alte Version ist kompatibel aber dafür fehleranfälliger, oder?
> Neue Version braucht u.U. ein Plug-In, welches der User erst installieren muss, wofür er im dümmsten Fall keine Rechte hat.
> Da ich die 1.5.0_04 Version habe, kann ich nur mit einer älteren Version entwickeln bzw. kompilieren, wenn ich diese installiere. Geht das gut oder gibt es da Komplikationen, wenn man zwei Versionen gleichzeitig laufen hat?


Wenn dein Applet etwas bestimmtes leisten muss, was aber auf Grund fehlender Implementierungen in einer älteren Java-Version nicht möglich ist, solltest du auf jeden Fall ein JDK ab 1.2 zur Programmierung benutzen.
Kommt es dir in erster Linie auf Kompatibilität an, solltest du auf jeden Fall den kleinsten gemeinsamen Nenner zum Programmieren nehmen - das JDK 1.1
Eigentlich alle Browser unterstützen Java 1.1. Aber nur wenige Benutzer haben ein aktuelles Java-PlugIn.
Und wenn es nicht ein wirklich tolles Applet ist, lassen sich die Benutzer meist auch schwer dazu übereden, sich die akteulle Version einer JRE herunterzuladen und zu installieren.
Es ist absolut kein Problem, mehrere Java-Versionen nebeneinander installiert zu haben und diese zu benutzen.
Entweder sagst du deiner IDE, welches JDK sie zum Kompilieren benutzen soll, oder du schreibst dir bspw. eine kleine Batch-Datei, in der du das explizit festlegst.


----------



## MPW (26. Jul 2005)

Ähm, ich hab' mal 'ne ganz andere Frage:

Ich hab' mal irgendwo gelesen, dass es einen Befehl gäbe mit einer aktuellen JVM-Version+JDK beim Compilieren auf eine ältere herunterzugehen. Was hat es damit auf sich, bei mir hat's nie funktioniert?

Ich dachte, der packt dann einfach die neuen Packages dazu, aber dem war nicht so...


----------



## strope (27. Jul 2005)

Kann mir niemand sagen, ob es an der Dateistruktur liegen kann, dass ich das Hintergrundbild net im IE sehe?
Wie kann ich das Bild mit ins Jar-Archiv einbinden, bzw. wie hinterlege ich die Bilddaten richtig?


----------



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

1. Bitte lies doch mal meine Postings.
2. Ohne Fehlermeldung kann man wirklich gar nichts sagen.
Also guck mal in die Java-Console vom IE und auf die Statusleiste. Und was da steht, postest du mal hier.


----------



## strope (27. Jul 2005)

@L-ectron-X
Lese doch deine Postings immer aufmerksam.   

Kann nur keine Fehlermeldungen finden.
nach dem Aufmachen des IE  Extras -> Sun Java Konsole
Alles wird (fast richtig...) dargestellt, nur der Hintergrund fehlt eben.

Die Sun Java Konsole gibt Folgendes aus: 

Java Plug-in 1.5.0_04
Verwendung der JRE-Version 1.5.0_04 Java HotSpot(TM) Client VM
Home-Verzeichnis des Benutzers = C:\Dokumente und Einstellungen ...


----------------------------------------------------
c:   Konsolenfenster schließen
f:   Objekte in Finalisierungswarteschlange finalisieren
g:   Speicherbereinigung
h:   Diese Hilfemeldung anzeigen
l:   ClassLoader-Liste ausgeben
m:   Speicherbelegung anzeigen
o:   Protokollierung auslösen
p:   Proxy-Konfiguration neu laden
q:   Konsole ausblenden
r:   Richtlinien-Konfiguration neu laden
s:   System- und Bereitstellungseigenschaften ausgeben
t:   Threadliste ausgeben
v:   Thread-Stack ausgeben
x:   ClassLoader-Cache löschen
0-5: Trace-Stufe auf <n> setzen
----------------------------------------------------



In der Statusleist steht:

Applet meinApplet started

das wars.

Und weil ich mir das net erklären konnte, dachte ich, dass der Fehler wo anders liegt. Naja, das hätte ich vielleicht in meinen Postings erwähnen sollen...sorry

Mit der Kompatibilität, dass kann ich grad leider nicht abklären (Urlaubszeit...), deshalb versuch ich solange das Layout einigermaßen vorzubereiten und Kommunikation mit dem Webserver aufzubauen.

Mit dem NullLayout komme ich jetzt einigermaßen zurecht, ich hatte setSize nicht verwendet und damit war wohl die Größe aller Elemente immer null, was sie in den anderen Layouts net unbedingt ist.

Fehlt nur der Hintergrund
 :cry: 


Ab und zu kommt NACH Schließen des Appletfensters in NetBeans 

```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: component argument pData
        at sun.awt.windows.Win32SurfaceData.initOps(Native Method)
        at sun.awt.windows.Win32SurfaceData.<init>(Win32SurfaceData.java:448)
        at sun.awt.windows.Win32SurfaceData.createData(Win32SurfaceData.java:316)
        at sun.awt.Win32GraphicsConfig.createSurfaceData(Win32GraphicsConfig.java:357)
        at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:332)
        at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:313)
        at sun.awt.windows.WComponentPeer$2.run(WComponentPeer.java:353)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
```
aber eben auch nur ab und zu.

LG
strope


----------



## MPW (27. Jul 2005)

Warum packst du das *jpg oder was auch immer nicht ins Jar rein?

Das geht auf jeden Fall...weiß bloß gerade nicht wie:
Ich habe soetwas bisher erst einmal gemacht, allerdings mit einem TextFile, vielleicht kannst du das Ummodeln, auf einen "Picture"-Reader. Du musst einfach mal in der  API schauen, welchen dieser Klassen man einen Input-Strem in den Rachen stopfen kann(als Argument übergeben):


```
import java.io.InputStream;
import java.io.InputStreamReader;

			in = new BufferedReader(new InputStreamReader(getClass().getResourceAsStream( "words.ini" )));
```

Das für dich interessante hier, der teil in der hinteren Klammer: getClass().getRessourceAsStream() ist der eigentlich Aufruf, der Rest dienst dazu das in einen Reader zu stopfen.
Musst mal ein bisschen API schmöckern, geht bestimmt....

Info: Vorsicht biem Testen: Das funktioniert NUR aus einem jar heraus, wenn man beim Testen kein jar erstellt fliegen die Exceptions.


----------



## MPW (27. Jul 2005)

ach ja und zu den NullPointerExceptions:

Da es nach schließen auftritt muss es irgendwo in der dispose()-Methode stehen, guck mal wo du da einen Arraay/Vektor-Zugriff hast der eventuell zu Fehlern führen könnte oder einen Thread der noch versucht darauf zuzugreifen oder sowas.....

Das mit den Null-Layout halte ich übrigens für eine extrem schlechte Idee, da einem bei anderen Bildschirmauflösungen schnell mal das Layout um die Ohren fliegt...Warum setzt du die TextFields usw. nicht mit einem Layoutmanger, den du auf das durchsichtige Swing-Panel(JPanel) draufsetzt?


----------



## strope (27. Jul 2005)

Hallo!

@MPW
Du hast Recht. Ich hab's jetzt einfach nochmal neu probiert. Ein gif lässt sich natürlich doch in ein jar Archiv packen. Ganz normal, wie die anderen Dateien auch. Ich weiß nicht, warum das am Anfang nicht geklappt hat, jetzt geht's jedenfalls.

Und das Hintergrundbild erscheint jetzt auch.

Nach den Exceptions muss ich wohl aber trotzdem noch schauen.
Ich frag mal ganz vorsichtig: sollte ich eine Methode dispose() haben? :bahnhof: 

In der Appletklasse oder wo? Da hab ich außer ein paar Hilfsfunktionen nur 

-init()
-start()
-run()
-stop()

Ich hab das aus 'nem Beispielprogramm übernommen und damit mal angefangen.

Zum Layout:
So wie ich Euch vestehe, ist es unerlässlich für maximale Kompatibilität mit dem JDK 1.1 zu programmieren. Und dieses JDK 1.1 erzeugt dann Java 1.1 Code? Hm, vielleicht muss ich das doch machen. 

Kann ich (z.B. über den Alpha-Wert in Color) beim AWT denn überhaupt transparente Komponenten erreichen?


----------



## MPW (27. Jul 2005)

ops...jaja von AppletProgrammierung hab' ich einfach keine Ahnung:

natürlich muss dass in der stop()-Methoder suchen.
(dispose() ist wenn Fenster zerstört werde oder so....)

Mit dem JDK 1.1 tut man sich ziemlich schwer, da viele von den Sachen die man heute als Standart ansieht erst in 1.2 oder 1.3 kamen. 
Daher auch der Name Java 2, dieser kam nämlich erst ab 1.2
1.1 könnte man fast als 'Beta'-Version der Sprache bezeichnen


----------



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

Sorry, ist heut' spät geworden...
Schön, dass das Hintergrundbild nun angezeigt wird.  

Die Methoden
init()
start()
stop() und
destroy()
sind die Methoden aus dem Lebenszyklus eines Applets. Du solltest wenigstens die init()-Methode überschreiben.
dispose() brauchst du bei einem Applet nicht- ich wüsste nicht dass man ein Panel disposen kann. :wink: 

getCodeBase() gibt den relativen Pfad zu deinem Applet zurück.
getDocumentBase() gibt den relativen Pfad zu dem HTML-File zurück, welches das Applet einbindet.

Noch was zum NullLayout: Meiner Meinung nach wäre es die beste Wahl, für ein unregelmäßiges unveränderliches Hintergrundbild. Die Komponenten lassen sich perfekt an das Hintergrundbild anpassen und positionieren, was bei Verwendung eines LayoutManagers schwierig werden dürfte.
Außerdem, legst du die Größe der Applet-Fläche im Browser innerhalb des Applets-Tags fest. Da ist die Auflösung später absolut egal. Auf jedem Monitor wird dein Applet richtig dargestellt werden.


----------



## MPW (28. Jul 2005)

Moment mal...der muss doch bei der Excepton die Zeile anzeigen, guck doch einfach mal in welcher das passiert und poste den umliegenden Code...


----------



## strope (1. Aug 2005)

Guten Morgen.

Wo soll die Zeilenangabe sein?
(Exception sieht noch genauso aus, wie am 27.7. gepostet...WENN sie auftritt

Hab im Wesentlichen die Methoden 

init()
start()
stop()
run()

In stop() steht praktisch nur eine Zeile:

```
updater.interrupt();
```
wobei updater ein Thread ist, zu dem in init() 

```
updater = new Thread(this);
```
und in start()

```
updater = new Thread(this);
updater.start();
```
steht.

Beim Debuggen passiert es beim Rausspringen aus stop(). Der Cursor ist bei der einen oben geposteten Zeile, führt diese aus, steht dann bei der geschwungenen Klammer und wenn ich dann noch einmal auf ausführen gehe, dann kommt die Exception. Muss man das Programm noch irgendwie beenden oder so?

Gruß strope

Zugegebenermaßen versteh ich das mit dem Thread nicht ganz, das hab ich übernommen...


----------



## MPWalGastWeilZuFaulZuLogi (1. Aug 2005)

Dann poste halt mal die gesammte Exception..wir zeigen dir dann schon, dass da eine Zeilenangabe steht...


----------



## strope (1. Aug 2005)

```
init:
deps-jar:
compile-single:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException: component argument pData
        at sun.awt.windows.Win32SurfaceData.initOps(Native Method)
        at sun.awt.windows.Win32SurfaceData.<init>(Win32SurfaceData.java:448)
        at sun.awt.windows.Win32SurfaceData.createData(Win32SurfaceData.java:316)
        at sun.awt.Win32GraphicsConfig.createSurfaceData(Win32GraphicsConfig.java:357)
        at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:332)
        at sun.awt.windows.WComponentPeer.replaceSurfaceData(WComponentPeer.java:313)
        at sun.awt.windows.WComponentPeer$2.run(WComponentPeer.java:353)
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:461)
        at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
debug-applet:
BUILD SUCCESSFUL (total time: 10 seconds)
```

Das kommt im "Output"-Fenster von NetBeans. Oder kann man die Exceptions auch noch wo anders sehen?


----------



## L-ectron-X (1. Aug 2005)

> component argument pData


Das solltest du dir mal näher ansehen. pData ist scheinbar an irgendeiner Stelle null.


----------



## strope (1. Aug 2005)

Ja, ich weiß nur nicht was pData ist! Es ist keine Varialbe o.ä. von mir. Dieses "Wort" gibt es in meinem Code nicht.
Ich habe diese Exception mal vollständig in google eingegeben und gesucht. Sie führt zu genau einem Link, welcher in ein Forum bei sun führt. Dort beschreibt jemand die selbe Beobachtung und ein anderer hat das gleiche Problem. Allerdings gab es bisher keine Antworten bzw. Erklärungen. Heißt das jetzt, dass die Frage zu banal ist oder dass es keine Antwort gibt  ???:L 
Bei 
" die Suche unter Einbeziehung der übersprungenen Ergebnisse wiederholen "
kommen noch ein paar andere Seiten aber praktisch keine Antworten zu diesem Problem...


----------



## L-ectron-X (1. Aug 2005)

Benutzt du auch noch fremde Bibliotheken? Ansonsten wüsste ich erst mal auch nicht, wo die Exception geworfen wird, außer hier: _sun.awt.windows.Win32SurfaceData.initOps(Native Method)_

Edit:
Und das wäre dann möglicherweise im Zusammenhang mit einer C/C++-Methode (native).
Kannst du nachvollziehen, seit wann diese Exception auftritt? Vielleicht kannst du dann diesen hinzugekommenen Code isolieren, um den Fehler einzugrenzen.


----------



## strope (1. Aug 2005)

Meinst Du mit "fremde Bibliotheken" selbst angelegte Bibliotheken? Also Bibliotheken, die nicht von sun kommen?
Solche benutze ich nicht.

Was sagt mir:


> sun.awt.windows.Win32SurfaceData.initOps(Native Method)



Das ist die erste Zeile der Exception, ok, aber sagt sie Dir was?


----------



## L-ectron-X (1. Aug 2005)

Sorry, ich hatte meine Nachricht nochmal edititiert. Ich mache das häufig, um die Threads nicht sinnlos vollzuballern.
Du hattest sie wahrscheinlich noch nicht gelesen.


----------



## strope (1. Aug 2005)

Eigentlich soll mein Java-Programm ja mal mit einem Webserver kommunizieren. Da ich grad aber zwischendurch eine andere Seite gestalte, die sich im Prinzip mit der gleichen Thematik befasst, hab ich momentan eine ziemlich abgespeckte Version des Programms. Und hier tritt der Fehler auch auf.
Ich hab ein jpg, darauf ein paar JPanels und diese JPanels bestehen aus einem JTextfeld und einen JLabel. Hinzu kommt noch ein Button.
Es wird noch nichts gemacht (also kein Zugriff auf Daten von extern oder so)

```
public void run() 
  {
    while (running) 
    {
      try 
      {
        Thread.sleep(updateInteval);
      }
      catch (InterruptedException ex) 
      {
      } 
    }
    
  }
```
Bisher ist noch nicht mal ein ActionListener oder Ähnliches integriert. Momentan bin ich nur am Gestalten der Seite, schau mir ab und zu die Position der Labels auf dem Hintergrundbild an und schließe anschließend das Fenster wieder. Und dabei wird diese Exception HIN UND WIEDER geworfen.
Beim Debuggen kommt sie weiterhin beim Rausspringen aus der stop()-Methode und das bisher JEDESMAL beim Debuggen.


----------



## L-ectron-X (1. Aug 2005)

Hab noch mal weiter oben im Code geguckt. Keine Ahnung, ob das was damit zu tun hat. Aber warum schreibst du in der init()-Methode und in der start()-Methode

```
updater = new Thread(this);
```
In der start()-Methode reichts völlig.
Was soll der Thread machen? Greifst du damit auf Swing-GUI-Komponenten zu? Swing ist nicht threadsicher.


----------



## strope (1. Aug 2005)

> Aber warum schreibst du in der init()-Methode und in der start()-Methode


Wie gesagt, diesen Teil hab ich übernommen. Aber das war genau die Frage, die ich mir auch gestellt habe. Start() wird ja eh nach init() aufgerufen, also wird dieser Befehl zweimal ausgeführt...

In der run()-Methode rufe ich eine Funktion auf, in der ich inputStreams auslese und damit Daten übernehme und auf JLabels usw. darstelle.  Beantwortet das Deine Frage?
Wie soll ich's alternativ machen, wenn das nicht erlaubt ist? Das ganze ist übrigens ein JApplet... Ist das schon nicht zulässig?

Ich muss jetz nach Hause, sonst werd ich noch eingesperrt...  :wink: 
Aber morgen bin ich wieder voll dabei.
Danke für Deine/Eure Hilfe heute!


----------



## Beni (1. Aug 2005)

Du kannst mal ausprobieren, alle Aufrufe von deinem Thread zur GUI (also praktisch der gesammte Schleifeninhalt ohne das "Thread.sleep") in ein eigenes Runnable zu packen, und der EventQueue zu übergeben. Dann läuft das synchronisiert zur Oberfläche ab (und falls es ein Problem wegen der Swing-Threadunsicherheit war, sollte das Problem weg sein).

Siehe: hier.

Alternativ kannst du anstelle eines Threads auch ein "javax.swing.Timer" verwenden, der ist sowieso einfacher zu bedienen als ein Thread :wink:

[Edit]

```
public void run(){
  while( running ){
     EventQueue.invokeAndWait( new Runable(){
        public void run(){
           // hier alles rein, was mit der GUI zu tun hat.
        }
     });

     Thread.sleep( ... );
  }
}
```


----------



## strope (2. Aug 2005)

Guten Morgen!

Hab's mal so probiert

```
public void run()
  {
    while( running )
    {
      try
      {
        EventQueue.invokeAndWait( new Runnable()
        {
        
          public void run()
          {
             // hier alles rein, was mit der GUI zu tun hat. Steht aber noch nix drin!
          }
        });
        Thread.sleep(updateInterval);
      }
      
      catch (InterruptedException ex)
      {
      }
      catch (java.lang.reflect.InvocationTargetException ITex)
      {
      }
   }
```

War's so gedacht?
Aber die Exception kommt immernoch.

Hab das jetzt schon öfters gesehen, dass eine Klasse angewendet wird, ohne sie so normal zu instanzieren, sondern mit dem Aufruf einer Funktion innerhalb der Übergabewerte und am Schluss ein Semikolon. Was genau bedeutet das eigentlich? Ist das nur ne Kurzform?  ???:L 

Werde mich dann jetzt mal mit dem javax.swing.Timer beschäftigen, wenn der so einfach ist...


----------



## Beni (2. Aug 2005)

> Hab das jetzt schon öfters gesehen, dass eine Klasse angewendet wird, ohne sie so normal zu instanzieren, sondern mit dem Aufruf einer Funktion innerhalb der Übergabewerte und am Schluss ein Semikolon. Was genau bedeutet das eigentlich? Ist das nur ne Kurzform?



Das sind anonyme Klassen.

Normalerweise hast du diesen Aufbau:

```
doSemething( new X() );
```
Du kannst aber beim X gleich ein paar Methoden überschreiben:

```
doSemething( new X()  //<- vorne keine Veränderungen
{ methode( String y ){...} }  // <- Diese Linie kam neu hinzu
 );  // <- hinten keine Veränderungen
```


----------



## strope (2. Aug 2005)

Aha, sowas hab ich ungefähr vermutet. Wenn man allerdings nicht weiß, dass das "anonyme Klasse" heißt, findet man auch nix dazu... Danke   
Hab übrigens das 

```
updater = new Thread(this);
```
in der init-Methode mal weggelassen. Ändert aber auch nichts. Wenn's die Zeit erlaubt, probier ich's morgen mal mit 'nem Timer.


----------



## strope (5. Aug 2005)

Da ich mich vom eigentlich Thema des Titels immer weiter entferne und das ursprüngliche Problem ja gelöst ist, mach ich wohl für eventuell anstehende neue Fragen lieber einen neuen Thread auf...
Vielen lieben Dank an alle Helfer soweit und 
viele Grüße
strope


----------

