Liebe Besucher, ein aktueller Hinweis in
eigener Sache: 
Es ist beabsichtigt, diese Seiten und die Domain im Januar/Februar 2004 auf
einen anderen Server umzuziehen. Es ist leider nicht auszuschließen,
daß es während des Umzugs zu technischen Problemen mit diesen
Seiten kommen wird. Insbesondere im eMail-Bereich wird es vermutlich Probleme
geben. Wenn Sie fragen haben oder mich sonstwie erreichen wollen empfehle
ich an rebel@snafu.de zu posten. 
Nachdem der Umzug abgeschlossen ist, wird es allerdings auch inhaltliche Änderungen
während des ersten Halbjahrs 2004 geben. Keine Angst. Es werden keine
Inhalte verlorengehen, aber die Struktur der Seiten wird komplett geändert.
Diese Seite hat eben eine andere Entwicklung genommen seit 2000, als das Projekt
gestartet wurde ;-) Ich werde mich bemühen, daß bei ihnen vorhandene
alte Bookmarks wenigstens zu einem Verweis auf die Neustruktur führen,
und die gesuchten Inhalte für sie trotzdem leicht und schnell auffindbar
sein werden. 
Die eigentlich zu dieser Seite gehörenden Domains ag-intra.com, ag-intra.org
und ag-intra.de werden von mir geschlossen bzw. gelöscht und unregistriert. 
             UNDER CONSTRUCTION 
            Vorwort zu diesem Beispiel 
            Ich habe das jetzt nur reingenommen, weil
das zentrale Thema, der Sourcecode zu dem Applet hier bereits herumliegt.
Wer interessiert ist, kann sich das also schon einmal ansehen, und den ominösen
Fehler suchen. Das Beispiel wird ansonsten aber erst weitergeführt, wenn
das zweite Beispiel zum Thema AWT vollständig beendet ist.
            3.1. Warum Bonus-Beispiel
? 
Dieses gesamte Tutorial zielt eigentlich mehr auf den Schwerpunkt Applikationsprogrammierung,
und nicht auf Applets. Dennoch wird häufig nachgefragt, wie man Applets
programmiert. Obwohl die meisten dann ob des Aufwandes zurückschrecken,
scheinen bunte, bewegte Applets auf Web-Seiten immer noch zu faszinieren.
Ich habe tatsächlich auch Ideen, wie man im Productivity-Bereich Applets
sinnvoll einsetzen könnte. Das Sicherheitsmodell von Java wirkt aber
diesen Ideen entgegen. Man kann es im Einzelfall umgehen, aber davon wird
dringend abgeraten. 
            Dieses Beispiel unterscheidet sich auch vom Aufbau her komplett
von den anderen Beispielen im Tutorial. Wir werden hier ganz allgemein etwas
über die Unterschiede zwischen Applikationen und Applets in Java erfahren.
Danach werde ich einen sehr, sehr langen Quellcode vorgeben, den Sie analysieren
sollen. Das interessante ist nämlich, daß das dort gezeigte Applet
eigentlich funktioniert, aber einen mehrfach auftauchenden schwerwiegenden
Fehler aufweist. Wenn Sie das Tutorial bis hier durchgearbeitet haben, sollten
Sie den Fehler eigentlich finden. Danach werden wir einerseits den Fehler
beseitigen, und das Programm ein wenig optimieren. Im großen und ganzen
halte ich nicht viel von Optimierungen, weil die meisten kaum Performance-Gewinn
bringen. Es haben sich schon Leute zu Tode optimiert. In diesem Fall tun
wir es aber doch, weil das ganze Applet viel zu aufwendig (alte Rechtschreibung)
implementiert wurde. Sie können bei der Gelegenheit einige Programmierkniffe
lernen, die sie später dann auch beim normalen Programmieren verwenden
werden. Es gibt in diesem Fall also etwas zu lernen. 
Außerdem zeigen ich zB. noch, wie man bestehende Klassen erweitert,
um ganz spezielle eigene grafische Komponenten zu erzeugen. 
Sie sollten das Wort Bonus also nicht so auffassen, daß Sie dieses Beispiel
einfach überspringen können. :-) 
            3.2. Unterschiede zwischen
Java Applikationen und Applets 
Kommt später (Vielleicht erkennen Sie sie ja auch im Listing) 
            3.2. Der Quellcode
             
Das Applet besteht aus zwei Klassen. Eine eigene Erweiterung der KlasseCanvas
namens MyCanvas mit neuen Funktionalitäten, sowie der Hauptklasse
            ttt(Richtig, hätte ich eigentlich groß schreiben
müssen). Dazu kommt noch der Source Code für die drüber liegende
HTML-Seite. Hier also in Medias-Res: 
            HTML-Sourcecode ttt.html:
             
            <HTML> 
            <HEAD> 
            </HEAD> 
            <BODY> 
            Willkommen beim Tic-Tac-Toe Java Applet. 
            Dies ist ein Applet, welches leider syntaktisch vollkommen
falsch programmiert ist. Finden Sie heraus warum das so ist: 
            <BR> 
            <APPLET 
               CODEBASE="." 
               CODE="ttt.class" 
               WIDTH=300 
               HEIGHT=300 
               ALT="Das Spiel laeuft leider nicht">
             
               Ihr Browser kann dieses Applet nicht .. schade
             
            </APPLET> 
            </BODY> 
            </HTML> 
            Nun die Klasse MyCanvas.java:
             
            import java.awt.*;      
// für graphische Benutzerschnittstellen 
            import java.awt.event.*; // für die Behandlung von
Ereignissen 
            public class MyCanvas extends Canvas { 
              private String Status; 
              public MyCanvas() {  
                super(); 
                Status="Leer"; 
              } 
              public void paint(Graphics g) { 
                int width = getSize().width;
             
                int height = getSize().height;
             
                g.setColor(getForeground());
             
                g.drawRect(2, 2, width - 4, height
- 4); 
              } 
              public void setStatus(String stat) { 
                if (stat=="Leer") { 
                  this.paint(this.getGraphics());
             
                  Status="Leer";
             
                } 
                if (stat=="Kreuz") { 
                  this.paint(this.getGraphics());
             
                  int width = getSize().width;
             
                  int height = getSize().height;
             
                  Graphics g = this.getGraphics();
             
                  g.setColor(getForeground());
             
                  g.drawLine(2, 2, width
- 4, height - 4); 
                  g.drawLine(width - 4, 2,
2, height - 4); 
                  Status="Kreuz";
             
                } 
                if (stat=="Kreis") { 
                  this.paint(this.getGraphics());
             
                  int width = getSize().width;
             
                  int height = getSize().height;
             
                  Graphics g = this.getGraphics();
             
                  g.setColor(getForeground());
             
                  g.drawOval(4, 4, width
- 8, height - 8); 
                  Status="Kreis";
             
                } 
              } 
              public String getStatus() { 
                  return Status;
             
              } 
            } 
            Nun die Hauptklasse ttt.java :
             
            import java.applet.*; 
            import java.awt.*; 
            import java.awt.event.*; 
            public class ttt extends Applet { 
               private String Player = "1"; 
               private String Figur = "Kreis"; 
               private String Sieg = "False"; 
               private MyCanvas f1Cv = new MyCanvas(); 
// Die einzelnen Spielfelder 
               private MyCanvas f2Cv = new MyCanvas();
             
               private MyCanvas f3Cv = new MyCanvas();
             
               private MyCanvas f4Cv = new MyCanvas();
             
               private MyCanvas f5Cv = new MyCanvas();
             
               private MyCanvas f6Cv = new MyCanvas();
             
               private MyCanvas f7Cv = new MyCanvas();
             
               private MyCanvas f8Cv = new MyCanvas();
             
               private MyCanvas f9Cv = new MyCanvas();
             
               public void init() { 
                  Figur="Kreis";
             
                  this.setLayout(new GridLayout(3,3));
             
                  Rectangle Fensta = this.getBounds(); 
//Größe der Fläche des Applets 
                  MouseListener aktion =
new MouseListener() { 
                     public
void mouseClicked(MouseEvent e) { 
                       
reagieren(e.getSource());       //Zur Funktion
wohin geklickt? 
                     }
             
                     public
void mousePressed(MouseEvent e) {} 
                     public
void mouseReleased(MouseEvent e) {} 
                     public
void mouseEntered(MouseEvent e) {} 
                     public
void mouseExited(MouseEvent e) {} 
                  }; 
                  f1Cv.addMouseListener(aktion);       
// Listener an die  
                  f2Cv.addMouseListener(aktion);       
// Einzelfelder binden 
                  f3Cv.addMouseListener(aktion);
             
                  f4Cv.addMouseListener(aktion);
             
                  f5Cv.addMouseListener(aktion);
             
                  f6Cv.addMouseListener(aktion);
             
                  f7Cv.addMouseListener(aktion);
             
                  f8Cv.addMouseListener(aktion);
             
                  f9Cv.addMouseListener(aktion);
             
                  this.add(f1Cv);                       
// Felder auf  
                  this.add(f2Cv);                       
// Graphicsobjekt bringen 
                  this.add(f3Cv);
             
                  this.add(f4Cv);
             
                  this.add(f5Cv);
             
                  this.add(f6Cv);
             
                  this.add(f7Cv);
             
                  this.add(f8Cv);
             
                  this.add(f9Cv);
             
               } // Ende Methode init 
               public void reagieren(Object komponente)
{ 
                  if (Sieg=="False") {
             
                     if (komponente==f1Cv)
{ 
                       
if (f1Cv.getStatus()=="Leer") { 
                          
if (Player=="1") Figur="Kreuz"; 
                          
if (Player=="2") Figur="Kreis"; 
                          
f1Cv.setStatus(Figur); 
                          
showStatus("erstes Feld"); 
                          
tic(); 
                          
if (Player=="1") Player="2"; 
                          
else     Player="1"; 
                      
} 
                     }
             
                     else
if (komponente==f2Cv) { 
                       
if (f2Cv.getStatus()=="Leer") { 
                          
if (Player=="1") Figur="Kreuz"; 
                          
if (Player=="2") Figur="Kreis"; 
                          
f2Cv.setStatus(Figur); 
                          
showStatus("erstes Feld"); 
                          
tic(); 
                          
if (Player=="1") Player="2"; 
                          
else     Player="1"; 
                       
} 
                     }
             
                     else
if (komponente==f3Cv) { 
                       
if (f3Cv.getStatus()=="Leer") { 
                          
if (Player=="1") Figur="Kreuz"; 
                          
if (Player=="2") Figur="Kreis"; 
                          
f3Cv.setStatus(Figur); 
                          
showStatus("erstes Feld"); 
                          
tic(); 
                          
if (Player=="1") Player="2"; 
                          
else     Player="1"; 
                       
} 
                     }
             
                     else
if (komponente==f4Cv) { 
                       
if (f4Cv.getStatus()=="Leer") { 
                          
if (Player=="1") Figur="Kreuz"; 
                          
if (Player=="2") Figur="Kreis"; 
                          
f4Cv.setStatus(Figur); 
                          
showStatus("erstes Feld"); 
                          
tic(); 
                          
if (Player=="1") Player="2"; 
                          
else     Player="1"; 
                       
} 
                     }
             
                     else
if (komponente==f5Cv) { 
                       
if (f5Cv.getStatus()=="Leer") { 
                          
if (Player=="1") Figur="Kreuz"; 
                          
if (Player=="2") Figur="Kreis"; 
                          
f5Cv.setStatus(Figur); 
                          
showStatus("erstes Feld"); 
                          
tic(); 
                          
if (Player=="1") Player="2"; 
                          
else     Player="1"; 
                       
} 
                     }
             
                     else
if (komponente==f6Cv) { 
                       
if (f6Cv.getStatus()=="Leer") { 
                          
if (Player=="1") Figur="Kreuz"; 
                          
if (Player=="2") Figur="Kreis"; 
                          
f6Cv.setStatus(Figur); 
                          
showStatus("erstes Feld"); 
                          
tic(); 
                          
if (Player=="1") Player="2"; 
                          
else     Player="1"; 
                       
} 
                     }
             
                     else
if (komponente==f7Cv) { 
                       
if (f7Cv.getStatus()=="Leer") { 
                          
if (Player=="1") Figur="Kreuz"; 
                          
if (Player=="2") Figur="Kreis"; 
                          
f7Cv.setStatus(Figur); 
                          
showStatus("erstes Feld"); 
                          
tic(); 
                          
if (Player=="1") Player="2"; 
                          
else     Player="1"; 
                       
} 
                     }
             
                     else
if (komponente==f8Cv) { 
                       
if (f8Cv.getStatus()=="Leer") { 
                          
if (Player=="1") Figur="Kreuz"; 
                          
if (Player=="2") Figur="Kreis"; 
                          
f8Cv.setStatus(Figur); 
                          
showStatus("erstes Feld"); 
                          
tic(); 
                          
if (Player=="1") Player="2"; 
                          
else     Player="1"; 
                       
} 
                     }
             
                     else
if (komponente==f9Cv) { 
                       
if (f9Cv.getStatus()=="Leer") { 
                          
if (Player=="1") Figur="Kreuz"; 
                          
if (Player=="2") Figur="Kreis"; 
                          
f9Cv.setStatus(Figur); 
                          
showStatus("erstes Feld"); 
                          
tic(); 
                          
if (Player=="1") Player="2"; 
                          
else     Player="1"; 
                       
} 
                     }
             
                  } 
                  else { 
                     Player="1";
             
                     Figur="Kreis";
             
                     f1Cv.setStatus("Leer");
             
                     f2Cv.setStatus("Leer");
             
                     f3Cv.setStatus("Leer");
             
                     f4Cv.setStatus("Leer");
             
                     f5Cv.setStatus("Leer");
             
                     f6Cv.setStatus("Leer");
             
                     f7Cv.setStatus("Leer");
             
                     f8Cv.setStatus("Leer");
             
                     f9Cv.setStatus("Leer");
             
                     init();
             
                     Sieg="False";
             
                  } 
               } 
               public void tic() { 
                  if ((f1Cv.getStatus()=="Kreuz")
&& (f2Cv.getStatus()=="Kreuz") && (f3Cv.getStatus()=="Kreuz"))
{ 
                     Sieg="Kreuz";
             
                     Graphics
g = f1Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f4Cv.getStatus()=="Kreuz")
&& (f5Cv.getStatus()=="Kreuz") && (f6Cv.getStatus()=="Kreuz"))
{ 
                     Sieg="Kreuz";
             
                     Graphics
g = f4Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f7Cv.getStatus()=="Kreuz")
&& (f8Cv.getStatus()=="Kreuz") && (f9Cv.getStatus()=="Kreuz"))
{ 
                     Sieg="Kreuz";
             
                     Graphics
g = f7Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f1Cv.getStatus()=="Kreuz")
&& (f4Cv.getStatus()=="Kreuz") && (f7Cv.getStatus()=="Kreuz"))
{ 
                     Sieg="Kreuz";
             
                     Graphics
g = f1Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f2Cv.getStatus()=="Kreuz")
&& (f5Cv.getStatus()=="Kreuz") && (f8Cv.getStatus()=="Kreuz"))
{ 
                     Sieg="Kreuz";
             
                     Graphics
g = f2Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f3Cv.getStatus()=="Kreuz")
&& (f6Cv.getStatus()=="Kreuz") && (f9Cv.getStatus()=="Kreuz"))
{ 
                     Sieg="Kreuz";
             
                     Graphics
g = f3Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f1Cv.getStatus()=="Kreuz")
&& (f5Cv.getStatus()=="Kreuz") && (f9Cv.getStatus()=="Kreuz"))
{ 
                     Sieg="Kreuz";
             
                     Graphics
g = f1Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f3Cv.getStatus()=="Kreuz")
&& (f5Cv.getStatus()=="Kreuz") && (f7Cv.getStatus()=="Kreuz"))
{ 
                     Sieg="Kreuz";
             
                     Graphics
g = f3Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
             //Nun die Kreise 
                  if ((f1Cv.getStatus()=="Kreis")
&& (f2Cv.getStatus()=="Kreis") && (f3Cv.getStatus()=="Kreis"))
{ 
                     Sieg="Kreis";
             
                     Graphics
g = f1Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f4Cv.getStatus()=="Kreis")
&& (f5Cv.getStatus()=="Kreis") && (f6Cv.getStatus()=="Kreis"))
{ 
                     Sieg="Kreis";
             
                     Graphics
g = f4Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f7Cv.getStatus()=="Kreis")
&& (f8Cv.getStatus()=="Kreis") && (f9Cv.getStatus()=="Kreis"))
{ 
                     Sieg="Kreis";
             
                     Graphics
g = f7Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f1Cv.getStatus()=="Kreis")
&& (f4Cv.getStatus()=="Kreis") && (f7Cv.getStatus()=="Kreis"))
{ 
                     Sieg="Kreis";
             
                     Graphics
g = f1Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f2Cv.getStatus()=="Kreis")
&& (f5Cv.getStatus()=="Kreis") && (f8Cv.getStatus()=="Kreis"))
{ 
                     Sieg="Kreis";
             
                     Graphics
g = f2Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f3Cv.getStatus()=="Kreis")
&& (f6Cv.getStatus()=="Kreis") && (f9Cv.getStatus()=="Kreis"))
{ 
                     Sieg="Kreis";
             
                     Graphics
g = f3Cv.getGraphics(); 
                     g.drawString("Sieger",10,20);
             
                  } 
                  if ((f1Cv.getStatus()=="Kreis")
&& (f5Cv.getStatus()=="Kreis") && (f9Cv.getStatus()=="Kreis"))
{ 
                     
Sieg="Kreis"; 
                     
Graphics g = f1Cv.getGraphics(); 
                     
g.drawString("Sieger",10,20); 
                  } 
                  if ((f3Cv.getStatus()=="Kreis")
&& (f5Cv.getStatus()=="Kreis") && (f7Cv.getStatus()=="Kreis"))
{ 
                     
Sieg="Kreis"; 
                     
Graphics g = f3Cv.getGraphics(); 
                     
g.drawString("Sieger",10,20); 
                  } 
               } 
               public String[][] getParameterInfo() {
             
                  String[][] info = {{}};
// keine Parameter 
                  return info; 
               } 
               public String getAppletInfo() { 
                  return "TicTacToe Spiel";
             
               } 
            } // Ende der Klasse ttt (Tic Tac Toe) 
            Zum Ausprobieren, können Sie das Applet jetzt auch hier
vom Server nutzen. 
             
             
            
             zurück
zur Hauptseite |