Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5 (Tiger-Release)
Buch: Java ist auch eine Insel
gp Kapitel 19 Applets, Midlets und Sound
  gp 19.1 Applets und Applikationen – wer darf was?
  gp 19.2 Das erste Hallo-Applet
  gp 19.3 Die Zyklen eines Applets
  gp 19.4 Parameter an das Applet übergeben
    gp 19.4.1 Wie das Applet den Browser-Inhalt ändern kann
    gp 19.4.2 Den Ursprung des Applets erfragen
    gp 19.4.3 Was ein Applet alles darf
  gp 19.5 Fehler in Applets finden
  gp 19.6 Browserabhängiges Verhalten
    gp 19.6.1 Java im Browser aktiviert?
    gp 19.6.2 Läuft das Applet unter Netscape oder Microsoft Explorer?
    gp 19.6.3 Datenaustausch zwischen Applets und Java-Skripten
  gp 19.7 Datenaustausch zwischen Applets
  gp 19.8 Musik in einem Applet und in Applikationen
    gp 19.8.1 Fest verdrahtete Musikdatei in einem Applet
    gp 19.8.2 WAV- und MIDI-Dateien abspielen
  gp 19.9 Webstart
  gp 19.10 Java 2 Micro Edition
    gp 19.10.1 Konfigurationen
    gp 19.10.2 Profile


Galileo Computing

19.7 Datenaustausch zwischen Applettoptop

Sind mehrere Applets auf einer Web-Seite untergebracht, so gibt es Fälle, in denen die Applets Daten austauschen wollen. Zwei Lösungen bieten sich an. Da alle Applets in einer einzigen JVM laufen, lässt sich über statische Attribute auf die anderen Elemente zugreifen. Dies spricht jedoch gegen die Datenkapselung und ist sehr unfein. Aber diese Technik hat noch einen weiteren Schwachpunkt. Statische Variablen hängen eng mit dem Klassenlader zusammen. Hier gab es in der Vergangenheit beim Netscape einige Probleme (die aber nun behoben sein sollten). Eleganter ist da schon die Möglichkeit über die Schnittstelle AppletContext.



class java.applet.  Applet  
extends Panel

gp  AppletContext getAppletContext()
Bestimmt die Umgebung eines Applets.


interface java.applet.  AppletContext  

gp  Applet getApplet( String name )
Sucht das Applet mit dem Namen name in dem Dokument, das durch den AppletContext gegeben ist. Der Name kann durch das HTML-Tag gesetzt sein. Falls kein Applet des Namens existiert, liefert die Methode null.
gp  Enumeration getApplets()
Findet alle Applets, die durch AppletContext gegeben sind.

Zwei Lösungen bieten sich nun an. Die ältere Variante erwartet, dass das Applet einen Namen besitzt. Dieser wird mit dem NAME-Attribut im APPLET-Tag zugewiesen, etwa <APPLET ... NAME=Name ...>.

Eine Verbindung der Methode aus Applet und AppletContext führt zu der Zeile


Applet anotherApplet = getAppletContext.getApplet( "Name" );

Wie wir oben gesehen haben, lässt sich auch eine Enumeration aller Applets einer Seite mit getApplets() besorgen.


Applet otherApplet = null;

Enumeration applets = getAppletContext.getApplets();

while ( applets.hasMoreElements() )
{
  otherApplet = (Applet)applets.nextElement();
  if ( otherApplet != this)
    break;
  // Jetzt können wir etwas mit dem anderen Applet machen, etwa


  // if ( otherApplet instanceof MeinApplet )
  //  ...
}

Ein Applet kann sich, falls bekannt, in eine Unterklasse casten. Dann lassen sich alle Methoden aufrufen und die Variablen auslesen. Leider funktionieren beide vorgestellten Methoden nur, wenn die Applets in einem gleichen Frame liegen. Liegen sie in verschiedenen Frames, findet zumindest die Netscape-Methode getApplet() das Applet leider nicht. Hier bleibt aber noch die Variante über statische Variablen übrig. Eine weitere Möglichkeit, Applets über verschiedene Frames kommunizieren zu lassen, geht über eine JavaScript-Funktion. Sie fungiert als Brücke. Dies wird hier allerdings nicht beschrieben.

Das folgende Beispiel zeigt zwei Applets Applet1 und Applet2 auf einer Web-Seite. Zunächst der HTML-Code:

Listing 19.7   TwoApplets.html


<html><body>
<applet code="Applet1.class" name="applet1"
        heigth=200 width=200>
</applet>
<applet CODE="Applet2.class" name="applet2"
        height=200 width=400>
</applet>
</body></html>

Es folgen die Implementierungen für die beiden Applets:

Listing 19.8   Applet1.java


import java.applet.Applet;
import java.awt.*;

public class Applet1 extends Applet
{
  private TextField inputText = new TextField( "", 10 );

  public void init()
  {
    add( inputText );
    add( new Button( "Sende an Applet2" ) );
  }

  public boolean action( Event ev, Object arg )   // Ganz alt. Java 1.0!
  {
    if ( ev.target instanceof Button )
    {
      String textMsg = inputText.getText().trim();

        Applet2 applet2 = (Applet2) getAppletContext().getApplet("applet2");  

      if ( applet2 != null ) {
        applet2.appendTheText( textMsg );
        return true;
      }
    }
    return false;
  }
}

Listing 19.9   Applet2.java


import java.applet.Applet;
import java.awt.TextArea;

public class Applet2 extends Applet
{
  private TextArea textBox = new TextArea( 5, 40 );

  public void init()
  {
    add( textBox );
  }

  public void appendTheText( String s )
  {
    textBox.append( s + "\n" );
  }
}




Copyright © Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de