Newsgroup: it.comp.java
Titolo: comunicazione tra applet (scambio di variabili?)

Se due applet sono aperte in successione da una pagina html:
<APPLET code="prima.class" width=400 height=100></APPLET
<APPLET code="seconda.class" archive="seconda.jar" width=1 
height=1></APPLET>
come posso, da prima.class, capire quando seconda è stata caricata? Dovrei 
fare una delle seguenti cose:
1) settare, da seconda.class, a true il valore di un boolean di prima.class.
2) capire, da prima.class, quando esiste un frame creato da seconda.class di 
nome dato [con setName(String)] (o qualunque altra informazione mi permetta 
di regolarmi di conseguenza).
Il tutto, che funzioni persino con JVM di Microsoft (1.4)...
Chiedo troppo?

Io al posto tuo farei settare una variabile javascript alla seconda,
sul metodo init.
Alla prima fai controllare periodicamente quando questo ha un certo
valore.
Oppure, alla seconda fai lanciare un funzione js che comunica alla
prima di essere pronta.

 valore.
Questo già lo faccio, ma nessuno, ovviamente, gliela setta al valore 
corretto quando occorre.
Ho provato anche ad usare le istruzioni di 
http://www.mokabyte.it/1999/05/AppletNoFrame.htm
 come segue:
1) codice html
<APPLET code="first.class" name="first" width=400 height=100></APPLET
<APPLET code="second.class" archive="second.jar" name="second" width=1
height=1></APPLET>
2) nella prima classe:
public void finish()
 {this.finish=true;}
3) nella seconda classe:
try
 {
  AppletContext ac = getAppletContext();
  first f=(first)ac.getApplet("first");
  f.finish();
 }
catch (Exception e)
 {System.out.println("Error "+e);}
Ma il risultato è stato il seguente:
Error java.lang.ClassCastException: first
(JVM Microsoft 1.1.4)
Error java.security.AccessControlException: access denied 
(java.util.PropertyPermission java.home read)
(JVM SUN 1.5.0_02)
Non capisco come posso accedere a metodi pubblici di una classe di un'altra 
applet della stessa pagina html senza firmare l'applet. 

Ho trovato queste due possibilità, ma funzionano SOLO tra due files class, 
mentre io ho un class e un jar.
Il risultato è sempre lo stesso: dall'init della main class del jar trovo 
una classe di nome primo, ma non viene riconosciuta come di tipo primo (e 
quindi, non riesco ad apprlicarne i metodi).
AIUTO!
1)
//**************************************************
Enumeration appletList=getAppletContext().getApplets();
while (appletList.hasMoreElements())
 {
  Applet applet=(Applet)appletList.nextElement();
  if (applet instanceof primo)
   {
    System.out.println("Ho trovato la classe primo");
    ((primo)applet).fatto();
   }
  else
   {
    if (applet instanceof secondo)
     {
      System.out.println("Ho trovato la classe secondo");
     }
    else
     {
      System.out.println("Questa non è la classe primo nè secondo");
     }
   }
 }
//**************************************************
2)
//**************************************************
Applet a=null;
String nome="primo";
a=getAppletContext().getApplet(nome);
if (a!=null)
 {
  if (!(a instanceof primo))
   {
    System.out.println("Ho trovato un'applet chiamata "+nome+", ma non è un 
oggetto di tipo 'primo'.\n");
   }
  else
   {
    System.out.println("Ho trovato un'applet chiamata "+nome+"; è lei.\n");
    ((primo)a).fatto();
   }
 }
else
 {
  System.out.println("Non trovo nessuna applet chiamata "+nome+".\n");
 }
//************************************************** 

Eccoti il codice x l'applet :
<applet width="1000" height="750"
archive="AuleClient.jar,JavaLibrary1.jar,AppletJS.jar"
code="auleclient.Main.class" MAYSCRIPT></applet>
Questa è una classe dalla quale chiamo le funzioni js
import netscape.javascript.*;
import javax.swing.*;
/**
 *
 * @author andrea
 */
public abstract class ComandiJS {
    public static void eseguiJS( JApplet myJA, String fz, String[]
parametri ){
        JSObject window = JSObject.getWindow( myJA );
        window.call( fz, parametri);
    }
    public static String ritornavalori( JApplet myJA, String fz,
String[] parametri ){
        JSObject window = JSObject.getWindow( myJA );
        return (String) window.call( fz, parametri);
    }
}
Per la classe netscape... basta far puntare a :
/opt/jre1.5.0_04/lib/plugin.jar . Quando sei nel browser invece lo
trovo da solo.
Ciao

 AIUTO!
Porca miseria, era l'uovo di Colombo...una terza applet (unico file class), 
che interagisca con la seconda... sembra che funzioni. 

 class), che interagisca con la seconda... sembra che funzioni.
Manco per niente... la terza classe viene eseguita molto prima che la 
seconda sia effettivamente tutta caricata... come non detto... 

 Ciao
Ti ringrazio infinitamente per l'aiuto, ma il mio problema è che se l'utente 
ha java 1.5 la mia applet è più piccola di 200K (direi che vada bene), ma se 
trovo nel browser quella cosa preistorica di Microsoft (1.1.4!) mi devo 
portare appresso un'infinità di librerie da allegare al jar, e arrivo a 
quasi 2 mega. Se ci devo inserire anche nescape (non parliamo di swing)... 
non vorrei sfiorare i 3 mega solo per fare una sorta di barra di avanzamento 
(che non dà neppure la percentuale del download del jar, perchè come faccio 
a saperla???)...
Dovrei solo trovare il modo di "segnalare" alla prima applet che la seconda 
è pronta, e che può anche smettere di aggiungere punti nella propria area, 
oltre che di occupare risorse della macchina... ma speravo di farlo senza 
dover aggiungere troppi K, è in un modo che funzionasse persino per chi ha 
la JVM di Microsoft!
Lo so, che cerco la Luna... per ora, buona notte; spero che a qualcuno venga 
in mente qualche suggerimento, o che mi venga un'idea.
Marco

INserire netscape e swing ???? Swing lo usi se vuoi, altrimenti puoi
usare awt!! Netscape lo metto nel classpath in fase di sviluppo, dopo
nel browser lo trova lui senza problemi.
Anzi la comunicazione tra applet e js, è implementata fin dal 1.1.
Prova a guardarti un manuale di javascript, è più semplice di quello
che pensi

 che pensi
Il javascript lo conosco, ma avevo letto da qualche parte che la libreria
netscape non č proprio compatibile con tutti i browser; poi ho paura che la
solita JVM di Microsoft (l'unica che ha almeno l'80% ei navigatori, secondo
me), mi faccia casini. Sei sicuro che non serva allegarlo al jar per
importarlo anche nelle versioni piů vecchie? Avevo provato qualche tempo fa,
ma non mi sembrava che funzionasse.
Tra l'altro, il classpath varia a seconda del sistema operativo usato, della 
versione di java e persino della scelta dell'utente in fase di 
installazione. Inserirlo nel class-path (a proposito, il java 1.1.4 di 
Microsoft del class-path indicato nel MANIFEST.MF se ne frega, carica solo 
il primo jar) non mi sembra una buona idea per un'applet destinata al web. Č 
vero, esiste la variabile di sistema java.home, ma mi sembra che non sia 
accessibile alle applet; firmare un'applet che deve solo mostrare qualche 
punto sullo schermo mi sembrerebbe troppo.
In ogni caso, ieri sera, quando stavo per staccare, ho avuto un'idea, e ho 
risolto completamente.
Se il jar della seconda classe non riesce ad accedere ai metodi della prima, 
ne creo una terza (altro file class, come il primo; quindi la pagina html 
contiene 3 applet, di cui la seconda č un jar) con il seguente codice:
import java.applet.*;
public class terza extends Applet
 {
  public void init()
   {
    Applet a;
    do
     {
      try
       {Thread.sleep(500);}
      catch (InterruptedException e) {}
//controllo solo 2 volte al secondo,
//per non consumare inutilmente risorse del PC
      a=getAppletContext().getApplet("seconda");
     }
    while (a==null);
//aspetto che esista un'applet di nome seconda,
//ovvero che sia stato completamente caricato il jar:
//non sono riuscito a fare il casting, tra jar e class,
//ma a trovare una classe di nome dato ['seconda'] sě.
    a=getAppletContext().getApplet("primo");
//del la classe primo, essendo un class come la presente,
//riesco a vedere non solo il nome, ma anche il tipo
    if ((a!=null)&&(a instanceof prima))
     {((prima)a).fatto();}
//richiamo il metodo che pone a vero il boolean true,
//in modo che il paint smetta di aggiungere punti al messaggio di attesa,
//e di consumare risorse del PC
   }
 }

Io ho usato la classe netscape..  e se supportano java e awt funzoina
quasi dappertutto!
Non complicarti la vita, prova con un applet semplicissima che vedrai
funziona.
Il problema del classhpath è relativo all'ambiente di sviluppo, NON a
chi poi utilizza il tutto.
Se vuoi complicare le cose, prova a guardarti come far comunicare tra
loro "direttamente" due applet, anche se credo ti possa dare seri
problemi di compatibilità.
Se stai su AWT e compili con il jdk 1.1 non hai problemi.