Forum Clubic

Applets Java - Question technique

J’ai 2 question assez pointues a propos de java et des applets en particulier.

Est-il possible de disposer d’un applet java qui en encapsulerait un autre? Par exemple, l’applet encapsule serait execute par l’utilisateur, sans que celui-ci ne voit qu’il y ai un applet autour, en “background”.

Deuxieme question, l’applet en “background” pourrait-il etre capable de connaitre les evennements survenus dans l’applet encapsule?

Ces questions viennent du fait que je reflechi a concevoir un systeme permettant de “monitorer” l’utilisation d’applets par un utilisateur sans avoir a reecrire les applets en questions qui existent deja. Car ci tout ceci n’est pas possible il me faut reecrire toutes les gestions d’evennement des applets pour envoyer des requetes http a chaque fois, ensuite les traiter pour en faire quelquechose. :paf:

Hesitez pas a demander plus de renseignements si mon explication ne parait pas clair !!!

Merci :jap:

Tu doit pouvoir les encapsuler graphiquement, les applets étant des pannel, il doit y avoir moyen de les disposer dans une applet plus grande avec un layout.

Pour les évènements, ça doit être un peu plus hard: chaque panel va intercepter ses évènements, si tu applique un panel transparent devant, il pourrat tout intercepter, mais alors c’est les panel en dessous qui risquent de ne pas marcher, j’ai touours galéré avec ces trucs.
:slight_smile:

doit y avoir le meme systeme qu’avec les Jframes et les JInternalFrames pour les applets.

Pour les evenements normalement c’est pas trop compliqué, le tout étant de tout faire dans la fenetre parente

Merci pour vos reponses, j’ai effectivement trouvé un moyen d’afficher un applet dans un autre mais seulement en utilisant la méthode:


// on est dans l'applet background
AppletContent a1 = new AppletContent();
a1.init();

this.setContentPane(a1.getContentPane());

Mais avec une telle technique je ne peux pas recupérer les “events” qui se passent dans l’applet “content” a partir de l’applet “background”. Enfin disons plutot que je sais pas faire :lol:

Comment peut ton s’enregistrer aux evenements d’un panel ?

merci de votre précieuse aide :jap:

Je risque de ne pas beaucoup t’aider car, comme je disais, j’ai déjà galéré avec les évènement (clavier). :confused:

Cependant, je pense que si tu nous disais quels évènement tu voudrais pouvoir maitriser, on pourrait t’aider un peu plus. Su tu veux ajouter des listener, quels type: key,mous ou focusListener, ou autre?
il faut peut-être ajouter tes listener sur les applets incluse, pas sur l’applet contenante.
:slight_smile:

Pareil pour moi, les evennements sont pas toujours simples a utiliser. La par exemple je cherche a capter tous les evennements qui apparaissent dans l’applet (click, drag, key, mouse move).
Ces evennements sont deja geres ds les applets incluses mais je desirerais les capter ds l’applet contenante de facon a les utiliser autrement. Je pourrais biensur modifier les gestions d’evennements ds l’applet incluse mais ca veut dire que je modifie 50 applets… C’est pour ca que je me demandais si on pouvais pas s’enregistrer a des evennements ds un applet sans en faire partie… :heink:

Oui, c’est bien les listener, tu fait ta classe MouseListener pour les evt souris, KeyListener pour le clavier, et tu le passe à ton applet par la méthode add…Listener
http://java.sun.com/j2se/1.5.0/docs/api/ja…MouseListener)

Effectivement, je peux “monitorer” les mouvements et tout de la souris. Mais ca se complique lorsque je veux les autres evennements ActionListener, genre les clicks sur bouton, les deplacement de slider. Tout ca je peux pas le capter dans l’applet “background”…

une idee ?

:jap:

D’accord, en gos, tu veux savoir sur quels boutons, champs l’utilisteur a cliqué etc…

si tu veux pas ajouter tes listener à la main sur chaque bouton ou autre, ce qui implique de connaître le fonctionnement de chaque applet, il faut tenter de parcourir les structure de données des containers, descendre dans toutes les sous-structures (récursivement) pour obtenir les boutons, puis finalement ajouter tes listeners sur tout ça. Il faudra éventuellement faire un peu d’introspection (tout ce qui est reflect, Class, Method…)
C’est un bon petit algo à coder en perspective :wink:

Ok, je vois comment faire, je te remercie pour les idees :jap:

Par contre j’ai souleve un autre probleme lorsque je faisais des tests :


public class Monitor extends JApplet {
	
	public void init() {
  
  Object c1 = null;
  try {
  	Class simulator = this.getClass().getClassLoader().loadClass("MonApplet");
  	c1 = simulator.newInstance();
  	
  } catch (ClassNotFoundException e1) {
  	...
  }
  
  ((JApplet) c1).init();
  ((JApplet) c1).start();
  
  this.setContentPane(((JApplet) c1).getContentPane());
	}
}

En fait mon applet s’affiche parfaitement dans la page web, mais il n’a pas l’air d’etre “demarre” et si je clique sur un bouton j’ai l’exception

Exception in thread "Thread-5" java.lang.NullPointerException
at DiscDC.drawCircle(DiscDC.java:266)
at DiscDC.continuous_flow(DiscDC.java:183)
at DiscDC.run(DiscDC.java:367)
at java.lang.Thread.run(Unknown Source)

Ce qui voudrait dire que le thread n’a pas ete demarre. Or je ne vois pas pourquoi, je fait bien un .init() et un .start() … :neutre:

Note: l’applet encapsule a la definition suivante :

public class MonApplet extends javax.swing.JApplet implements Runnable

Bojnour,
je ne vois pas pourquoi ton applet implémente Runnable, ce n’est pas censé être vraiment un Thread.
Quoiqu’il en soit, c’est peut-être le start qui ne rend pas la main, de coup, les lignes suivantes ne sont pas appellées.
Il faudrait je pense appeler le start des applet incluses dans le start de ton applet contenante, et pas dans le init(). car tu démarre peut-être l’applet trop tôt, alors que tu en encore en phase d’init().

sinon, il faudrait voir les sources pour savoir comment démarrent les applet, mais je n’ai pas encore installé ecilps sur mon nouveau poste, alors je ne peux pas les voir.

a deltree: (a ba … en fait ya que toi :lol: )

En fait c’est bon, j’ai cherche le probleme et je pense que je ne chargeait pas l’applet convenablement. Voila ce que ca donne maintenant :


// Loads the simulator applet in the monitor
  try {
  	Class simulatorClass = Class.forName(simulatorClassName);
  	simulator = (Applet)simulatorClass.newInstance();
   }
  catch (Exception e) {
  	System.out.println(e);
  }
  
  
  // init the monitor graphics
  this.add(simulator);
  this.resize(simulator.getSize());
  simulator.init();
  simulator.start();	
  this.validate();

Et ca tourne. Par contre la methode resize ne fonctionne pas et j’ai pas encore trouve comment charger un applet qui ne serait pas dans le meme repertoire que le monitor sur le server.

Alala…

PS: non je ne suis pas un codeur qui code exclusivement la nuit (au cas ou mes horaires de post vous intrigueraient), juste que pour moi la il fait jour… oui je vis pas au meme endroit sur notre ptite planete !!

Oui, sur Java apparement il n’y a pas gran monde, ils doivent être occupés :wink:
Pour le resize, je ne sais pas, pour les problèmes de répertoire, le ClassLoader de ton applet ne doit pas y avoir accès, tu peux tenter de jouer avec un ClassLoader, mais il peut y avoir un niveau de sécurité qui t’empêche de faire ce que tu veux avec l’applet.

Je comprend mieux maintenant, pourquoi nos posts sont décalés comme ça :smiley: C’et de quel côté de la planète que tu es?

Ah oui effectivement mais ca peut etre un probleme ce truc de classLoader…
Parce que avec ce code :

URLClassLoader loader = new URLClassLoader(new URL[] { new URL("http://localhost/appletFolder/") });
       
        // Load class from class loader
        Class c = loader.loadClass ("Applet");

        // Create an instance of the class just loaded
        simulator = (Applet)c.newInstance();

ca ne fonctionne pas, java me dit:
java.security.AccessControlException: access denied (java.lang.RuntimePermission createClassLoader)

Par contre lorsque je le lance depuis eclipse et son emulateur d’applet, ca fait une autre erreur mais pas de probleme de permission. (ca fait une erreur a cause du fait qu’il y ai plusieurs classes dans un meme fichier, oui je sais c’est sale mais c’est pas moi qui ai fait les applet !!)

Y-a-t’il une solution pour ce probleme de repertoire ou devrais-je tout avoir dans le meme repertoire tout le temps ?

PS: je suis au pays du soleil levant, j’ai 7h d’avance sur vous :jap: