kramann.info
© Guido Kramann

Login: Passwort:










Appletkommunikation

  • Applets eignen sich dazu, aufwändigere Anwendungen über das Internet zu verbreiten.
  • Sie laufen Client seitig, sind also Recourcen sparend für den Server.
  • Um die Komplexität bei der Programmentwicklung zu reduzieren, wäre es interessant die Möglichkeit zu haben, für unterschiedliche Aufgaben unterschiedliche Applets vorzusehen.
  • Diese müßten dann aber miteinander kommunizieren können.
  • Am einfachsten wäre die Programmierung dann, wenn man erst über die übergebenen Parameter angeben könnte, mit welchen Methoden eines Nachbarapplets sie kommunizieren sollen.
  • Einfaches Beispiel: So könnte ein Applet Schieberegler generieren, mit denen dann die Farbmischung des Hintergrundes eines anderen Applets vorgenommen wird.
  • Wenn man schon bei der Programmierung beider Applets angeben müßte, welcher Schieberegler des einen Applets welches Attribut des anderen beeinflussen soll, hätte man die Komplexität bei der Erstellung größerer Anwendungen noch nicht nennenswert reduziert.
  • Wenn es aber möglich ist, den Namen des Schiebereglers, seinen Stellbereich und das Attribut des anderen Applets, auf das er wirkt als Applet-Parameter zu übergeben dann kann man bei der Anwendungserstellung einen großen Teil der Komplexität der Einzelmodule verbergen.
  • Der Aufruf von Methoden per Angabe des Klassennamens und des Methodennamens als String wird in Java über die Reflection-Library ermöglicht.
  • Der vorhergehende Schritt, nämlich das erkennen anderer Applets auf einer Internetseite, kann mit Hilfe der Methode getApplets() der Klasse AppletContext erfolgen.
  • Im folgenden ist eine statische Methode dargestellt, die bei Übergabe einer Referenz auf das aktuelle Applet ein Array mit allen auf der aktuellen Internetseite eingebetteten Applets liefert:
    public static Object[] holeAlleApplets(Applet applet)
    {
        Enumeration enumm = null;
        boolean ok=true;

        ArrayList<Object> merker = new ArrayList<Object>();

        try
        {
                    enumm = applet.getAppletContext().getApplets();
        }
        catch(Exception e)
        {
            ok=false;
        }
        if(enumm!=null && ok==true)
        {
            while(  enumm.hasMoreElements() )
            {
                Object app = enumm.nextElement();
                if(app!=null)//Hier abfangen, wenn es kein weiteres Element mehr gibt!
                    merker.add(  app  );
            }
        }

        if(merker==null || merker.size()==0)
            return null;

        return merker.toArray();
    }

Code 5-1: Statische Methode, um alle Applets auf einer Internetseite als Referenz zu erhalten.

  • Bei Verwendung dieser Methode tritt ein Problem auf:
  • Applets sind erst im Applet-Context registriert, wenn ihre init()-Methode ausgeführt wurde.
  • Angenommen obige statische Methode würde von allen Applets in der start()-Methode aufgerufen werden.
  • Befinden sich mehrere Applets auf einer Internetseite, so kann nicht gewährleistet werden, dass bei allen bereits die init()-Methode durchlaufen wurde, bevor bei dem ersten die start()-Methode aufgerufen wird.
  • Um diesem Problem zu begegnen, wird eine zweite statische Methode entwickelt, die darauf wartet, dass alle erwarteten Applets sichtbar sind.
  • Sie unterbricht den Programmfluß, solange nicht alle Applets aus einer String-Namensliste im Applet-Context gefunden werden:
  • Der Methode muß neben einer Referenz auf das aktuelle Applet ein String-Array mit den Namen aller Applets auf der aktuellen Internetseite übergeben werden.
    public static void warteAufAlleApplets(Applet applet,String[] alleApplets)
    {
        boolean alle_da=false;

        while(alle_da==false)
        {
            String[] names = getAppletNames(applet);
            if(names!=null && names.length>0)
            {
                alle_da = true;
                for(int i=0;i<alleApplets.length;i++)
                {
                    boolean gefunden = false;
                    for(int k=0;k<names.length;k++)
                    {
                        if(names[k].equals(alleApplets[i]))
                        {
                             gefunden = true;
                             break;
                        }
                    }
                    if(gefunden==false)
                    {
                        alle_da = false;
                        break;
                    }
                }
            }

            try
            {
                Thread.sleep(100);
            }
            catch(Exception e)
            {
            }
        }        
    }

Code 5-2: Warten, bis alle erwarteten Applets im Applet-Kontext gefunden werden.

  • Die Methode benutzt eine Hilfsmethode, die die Namen der Applets im Applet-Kontext liefert.
  • Diese Hilfsmethode entspricht der bereits dargestellten, die die Objekte im Applet-Kontext zusammenstellt:
    public static String[] getAppletNames(Applet applet)
    {
        Enumeration enumm = null;
        boolean ok=true;

        ArrayList<String> merker = new ArrayList<String>();

        try
        {
                    enumm = applet.getAppletContext().getApplets();
        }
        catch(Exception e)
        {
            ok=false;
        }
        if(enumm!=null && ok==true)
        {
            while(  enumm.hasMoreElements() )
            {
                Object app = enumm.nextElement();
                if(app!=null)//Hier abfangen, wenn es kein weiteres Element mehr gibt!
                    merker.add(  ((Applet)app).getName()  );
            }
        }

        if(merker==null || merker.size()==0)
            return null;

        String[] names = new String[merker.size()];

        for(int i=0;i<names.length;i++)
            names[i] = (String)merker.get(i);

        return names;
    }

Code 5-3: Namen der Applets im Applet-Kontext zusammenstellen.

  • Nachfolgend sind drei Applets eingebettet, die mittels obiger Methoden aufeinander warten.
  • Obige Methoden wurden ein eine Hilfsklasse mit dem Namen AppletInitialisierung eingefügt.
  • Der Quellcode für untige Applets ist:
package element.Register;

import java.applet.Applet;
import java.awt.Color;
import java.awt.Graphics;
//import javax.swing.JTextArea;
//import javax.swing.JScrollPane;
import java.awt.TextArea;
import java.awt.ScrollPane;
import java.util.ArrayList;

import hilfsklassen.Unicode;
import hilfsklassen.Alert;
import hilfsklassen.Parser2;
import hilfsklassen.AppletInitialisierung;


import java.util.Enumeration ;
import java.lang.reflect.Method ;

public class Register extends Applet
{
    public String uebergabe = "";
    public String[] alleAppletNamen = null;
    public Object[] alleApplets = null;

    public void init()
    {
        uebergabe = Unicode.toText(getParameter("UEBERGABE"));
        setName( Unicode.toText(getParameter("NAME")) );
        setBackground(Color.WHITE);

        //Die Namen aller Applets auf der aktuellen Seite werden hier eingelsen:
        //Grundlage für sicheren Registrierungsvorgang.
        alleAppletNamen =  Parser2.zerlegeZeilenTrimOhneLeer((Unicode.toText(getParameter("APPLETNAMENSLISTE"))));
       
    }

    public void start()
    {
        //Darauf warten, dass alle anderen Applets auch initialisiert sind.
        //Dann erst start-Methode fortsetzen:
        AppletInitialisierung.warteAufAlleApplets(this,alleAppletNamen);

        //Nun alle Applets außer das aktuelle in einem Objekt-Array bereitstellen:
        alleApplets = AppletInitialisierung.holeAlleApplets(this);

        ScrollPane scrollpane = new ScrollPane();
        scrollpane.setBounds(0,0,800,400);
        TextArea textarea = new TextArea();

        String test = "Alle verfügbaren Applets:
";      
 
        for(int i=0;i<alleApplets.length;i++)
        {
            test+=((Applet)alleApplets[i]).getName()+"
";
        }
        
        textarea.setText(uebergabe+"
"+test); 
        scrollpane.add(textarea);
        setLayout(null);
        add(scrollpane);
    }

    public void paint(Graphics g)
    {
        g.drawString("ist da",10,10);
    }
}

Code 5-4: Applets, die auf die Beendigung der init()-Methode aller anderen Applets auf der gleichen Seite warten.

  • Die nächsten Schritte bestehen darin, über Reflection-Methoden die Methoden eines anderen Applets verfügbar und aufrufbar zu machen, um mit diesen zu interagieren.
  • Dazu: Die Methode getClass() liefert ein Objekt, das die Klasse eines Objektes repräsentiert.
  • Die Methode getMethods() liefert alle Methoden eines Klassen-Objektes.
  • Die Methode invoke() erlaubt es, eine Methode, die als Objekt vorliegt aufzurufen.
  • Über getName() kann die Identität eines Applet-Objektes überprüft werden.
Übung
  • Versuchen Sie die Methode eines "fremden" Applets aufzurufen, das sich auf der gleichen Seite befindet, wie das aktuell betrachtete.

Nachfolgend wird ein Element-Befehl interpretiert: