# drawImage Problem und Applet not inited



## Chris_76 (16. Jan 2007)

Hi,

habe ein Applet und lade dort zwei Images. Code siehe unten. Dies funktioniert aber nicht immer.
Manchmal lädt er sie und zeigt Sie an dann aber erfolgt auch mal garkeine Anzeige der Images, aber warum?
Oder anderes, lädt und zeigt man so in einem Applet Images an?


```
/* Läd die Top-Logos in die Variabeln */
 private void loadLogos() 
 {
  pictureSchool = getImage(getCodeBase(),"Logo_schule.jpg");
  pictureLogo   = getImage(getCodeBase(),"Logo_agricola.jpg");
 }

 /* erstellt das oberste Panel mit den Logos */ 
 private void createLogoPanel()
 {
  loadLogos();
  logoPanel = new Panel(null) 
  {
   public void paint(Graphics g)
   {
    g.drawImage(pictureLogo, 875, 0, this);
    g.drawImage(pictureSchool,10, 0, this);
   }
  };
  logoPanel.setBounds(0, 0, 1000, 112);
  Label label = new Label("Mein Test");
  label.setBackground(Color.white);
  label.setForeground(new Color(3,106,185));
  label.setFont(new Font("Arial",Font.BOLD,30));
  label.setBounds(520, 30, 280, 40);       
  logoPanel.add(label);
  logoPanel.setBackground(Color.white);
  add(logoPanel);
 }
```

Problem Nummer zwei :
Applet not inted. Wenn ich es über den Reloadbutton des Browsers versuche funktioniert es, wieso?
Fehlerbeschreibung von Java :
java.lang.NoClassDefFoundError: GUI$1
	at uControl.init(uControl.java:502)
	at sun.applet.AppletPanel.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Dort steht doch das die Classe GUI$1 nicht gefunden wird, aber diese existiert definitiv.
Warum funktioniert es beim RELOAD einwandfrei?

Gruß Chris


----------



## L-ectron-X (17. Jan 2007)

Möglicherweise gibts Probleme, weil die Bilder im Programm noch nicht zur Verfügung stehen, weil sie gerade noch geladen werden. Probiers mal mit java.awt.MediaTracker.


----------



## Chris_76 (17. Jan 2007)

Danke für den Tip.
Hatte inzwischen das Forum durchsucht und den MT eingebunden aber das hilft komischerweise nicht.
Eingebunden hab ich den so :


```
/* erstellt das oberste Panel mit den Logos */ 
 private void createLogoPanel()
 {
  loadLogos();                                                       // Methode siehe erster Post von mir
  MediaTracker mt = new MediaTracker(this);
      mt.addImage(pictureSchool,0);
      mt.addImage(pictureLogo,1);
      try {
         //Warten, bis das Image vollständig geladen ist,
         mt.waitForAll();
      } catch (InterruptedException e) {
         //nothing
      }

  logoPanel = new Panel(null) 
  {
   public void paint(Graphics g)
   {
    g.drawImage(pictureLogo, 875, 0, this);
    g.drawImage(pictureSchool,10, 0, this);
    if (logopaint==true) 
    {
     repaint();
     logopaint=false;
    }
    
   }
  };
 ........
 .......
 add(logoPanel);
 }
```

So bindet man ihn doch ein, wenn ich das richtig verstehe. Der MT müsste doch das komplette Programm bei waitForAll() anhalten und wenn dann das ok geht es weiter, oder sehe ich das falsch?

Chris


----------



## Chris_76 (17. Jan 2007)

Habe eine Lösung, hier nochmal die Zusammenfassung.

Problem :
Applet enthält 2 Bilder, welche in einem Appletviewer oder bei einem Aufruf des Applets lokal auf einem PC korrekt angezeigt werden. Sobald dieses Applet aber auf einem Webserver lag, zeigte es die Bilder nur sporadisch an, manchmal beide, manchmal eins und manchmal keines.
Desweiteren gab es beim starten des Applets immerwieder diese Fehlerbeschreibung in der Java-Konsole :
_java.lang.NoClassDefFoundError: GUI$1 
at uControl.init(uControl.java:502) 
at sun.applet.AppletPanel.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) _
Diese war verschwunden und das Applet wurde ausgeführt wenn man den Reloadbutton des Browsers drückte.

Ursache:
Wie ich ermittelt habe ist der Webserver mit seinen Übertraguns- und Zugriffszeiten auf Dateien gaaaanz langsam, sodaß das Applet startet aber noch nicht alle Klassen oder Bilder zur Verfügung stehen.

Lösung:
Den Mediatracker einsetzen (siehe angehängten Code). Damit wartet das Applet bis die Bilder vollständig geladen sind, und da dies ganz zu anfang des Applets geschieht, hat der Webserver auch Zeit die restlichen Klassen zu übertragen.


```
public Image LadeBild(String BildName)
		{
			Image bild;
			MediaTracker tracker;

			bild=getImage(getDocumentBase(),BildName);

			tracker = new MediaTracker(this);
			tracker.addImage(bild,0);
			try
			{
				tracker.waitForID(0);
			} catch (InterruptedException e) {}
			return bild;
		}
 

 /* erstellt das oberste Panel mit den Logos */ 
 private void createLogoPanel()
 {
  //loadLogos();
  pictureLogo=LadeBild("logoagricola.jpg");
  pictureSchool=LadeBild("logoschule.jpg");
  
  logoPanel = new Panel(null) 
  {
   public void paint(Graphics g)
   {    
    g.drawImage(pictureLogo, 875, 0, this);
    g.drawImage(pictureSchool,10, 0, this);
   }
  };
 ......
 ......
}
```

Was mich jetzt noch wundert, warum der Fehler mit dem im vorigen Post gezeigten Mediatrackeransatz scheiterte?
However....

Chris


----------



## L-ectron-X (17. Jan 2007)

Eine mögliche Lösung für das ganze Problem könnte sein, alle Klassen und Bilder in eine Jar-Datei zu legen, dann wird dem Start des Applets schon alles auf das Zielsystem geladen.


----------



## Chris_76 (17. Jan 2007)

Vielleicht nur interessant :
Das habe ich ausgeschlossen, weil mein Webserver leider nur 5x64k zur Verfügung hat.  
Und eine Datei maximal 64k haben darf, leider komme ich mit meinem Applet und den
2 Bildern in ein JAR-File gepackt über 64k.
Deshalb bleibt mir nur die Lösung die einzelnen class-Dateien über die 5 Speicherbereiche zu verteilen.

Aber da ich neugierig bin und erst seit 3Monaten mich mit Java beschäftigt habe,
hab ich mal ein JAR-File gebaut das nur ein Bild enthielt und angezeigt hat, es funktionierte wunderbar.

Trotzdem danke für Deine Hilfe und Tips

Chris


----------



## L-ectron-X (18. Jan 2007)

Das Einzige, was mir da jetzt noch einfällt, wäre, irgendwo auf einem Webserver die Webseite mit dem Applet bereitzustellen und auf dem begrenzten Speicher eine einzige Webseite mit einer automatischen Weiterleitung zum Webserver abzulegen.

Oder auch möglich: Die Bilder auf einen anderen Rechner auszulagern.
Das bringt aber den Nachteil mit sich, dass das Applet signiert werden muss und der Benutzer das Zertifikat akzeptieren muss, bevor er es benutzen kann.


----------



## Chris_76 (20. Jan 2007)

Heyho,

leider beides aus organisatorischen Gründen nicht machbar  :cry: .
Aber bis jetzt funktioniert meine Bilderladroutine von oben ohne Fehler   ich hoffe das
dies auch so bleibt, weil sonst hab ich auch keine Ideen mehr und das Internet und die Java-Seiten
schreiben zu dem Thema immerwieder dasselbe.

Chris


----------

