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 |