Gerer les evenements (souris) sur son propre composant [JAVA] - Programmation
Marsh Posté le 15-01-2002 à 11:52:17
ça fait longtemps que g pas touché au Java, mais je crois qu'il faut que t'ajoutes ton objet au message handler de souris.
Marsh Posté le 15-01-2002 à 11:56:39
radeontof a écrit a écrit : Salut, (cette applet est juste un p'tit exercice pour m'entrainer au JAVA) Mon applet s'appelle Menu et incorpore plusieurs composants Lien que j'ai créé. Je veux que chaque Lien change de texte au passage de la souris. Ca parait simple et ca marche si je définis les evenements dans mon applet . Par ex : lien1_mousemove.... Mais vu que chaque lien réagira pareil je veux définir l'événement dans Lien et non dans l'applet. Mais la ca ne marche pas, g essayé plusieurs tentatives sans succés. J'ai l'impression qu'il ne prend pas en compte les evenements de mes Liens. Voici mes sources : Pour lien : public class Lien extends Component{ String afftexte; String texte; String texte2; Color couleur; public Lien(){ try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } public Dimension getPreferredSize() { return new Dimension(30, 30); } public Lien(String stexte,String stexte2,Color c){ texte=stexte; texte2=stexte2; afftexte=texte; couleur=c; } public void update(Graphics g){ paint(g); } public void paint(Graphics g){ g.setColor(couleur) ; g.drawString(afftexte,0,10) ; super.paint(g); } private void jbInit() throws Exception { } //gestion de MOUSEMOVE QUI NE FONCTIONNE PAS public boolean mouseMove(Event e,int x,int y) { afftexte=texte2; repaint(); return true; } } ---------------- Voici Menu: public class Menu extends JApplet implements Runnable { boolean isStandalone = false; Thread lanceur; Graphics ecran,ong; Image temp; Lien lien2 = new Lien("Gnou","GNOU2",new Color(0,255,0)); Lien lien1 = new Lien("salut","Bonjour",new Color(255,0,0)); XYLayout xYLayout1 = new XYLayout(); public void run(){ while (true) { repaint(); try {Thread.sleep(50);} catch (InterruptedException e) {showStatus("Error " + e);} } } //Construire l'applet public Menu() { try { jbInit(); } catch(Exception e) { e.printStackTrace(); } } //Initialiser l'applet public void init() { try { this.getContentPane().add(lien1,new XYConstraints(1,1,-1,-1)); this.getContentPane().add(lien2,new XYConstraints(10,10,-1,-1)); } catch(Exception e) { e.printStackTrace(); } } private void jbInit() throws Exception { this.getContentPane().setLayout(xYLayout1); } //Démarrer l'applet public void start() { if (lanceur == null); { lanceur = new Thread(this); lanceur.start(); } } //Arrêter l'applet public void stop() { if (lanceur !=null){ lanceur.stop(); lanceur = null; } } } Si quelqu'un a une idée... Merci d'avance! |
Lorsque tu as un MouseEvent qui est génére tu entres dans la méthode MouseEvent machin chose (je me souviens plus du nom). Une fois dans cette méthode tu peux récupérer la source, i.e. l'objet qui a généré l'event (ici c'est un composant). Donc en récupérant l'objet source, tu peux savoir quel composant est lié à l'évenement et changer l'aspect de ton applet.
N'oublie pas d'ajouter chaque composant au listener avant ...
A+
Marsh Posté le 15-01-2002 à 12:05:03
C ce que j'ai fait dans Lien j'ai ajouté ceci à l'initialisation:
this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() {
public void mouseMoved(MouseEvent e) {
this_mouseMoved(e);
}
});
Puis ceci:
void this_mouseMoved(MouseEvent e) {
afftexte=texte2;
repaint();
}
Mais toujours rien.
[edtdd]--Message édité par radeontof--[/edtdd]
Marsh Posté le 15-01-2002 à 13:15:05
radeontof a écrit a écrit : C ce que j'ai fait dans Lien j'ai ajouté ceci à l'initialisation: this.addMouseMotionListener(new java.awt.event.MouseMotionAdapter() { public void mouseMoved(MouseEvent e) { this_mouseMoved(e); } }); Puis ceci: void this_mouseMoved(MouseEvent e) { afftexte=texte2; repaint(); } Mais toujours rien. |
C'est normal tu ajoutes ton listener à ton Applet. Je ne suis pas persuadé que c'est ce composant qui va générer des MouseEvent. Il y a tout un tas de composants visuels au dessus (content pane et compagnie) ... donc regarde peut etre la doc pour savoir ou tu dois la placer.
Sinon tu fais un system.out dans ta méthode de callback pour savoir si l'éveneemnt est génére ou pas ...
Est-ce clair?
Marsh Posté le 15-01-2002 à 19:05:56
Ok c bon.
G ajouté ceci dans MouseMove de l'applet:
Component comp=this.getContentPane().getComponentAt(e.getPoint());
if (comp.getClass()==lien1.getClass()){
Lien complien=(Lien)comp;
....
Par contre, je n'arrive pas à ajouter un composant dans un composant? est-ce possible?
Exemple: Polylien : dessine un polygone et incorpore Lien qui est un lien internet.
Mais dans PolyLien Jbuilder ne veut pas faire de add(Lien)...
Marsh Posté le 15-01-2002 à 19:14:03
c'est quoi l'erreur de compilation?
Marsh Posté le 15-01-2002 à 20:45:10
C bon: en fait Component ne gere pas l'ajout d'autres Components.
Par contre Container (qui dérive de Component) le gere.
Ca fonctionne maintenant.
Reste que je voudrais bien savoir si la souris est sur Lien qui se trouve dans Polylien qui se trouve dans l'applet.
Je n'arrive pas à associer les evenements de la souris à mon composant Polylien pour savoir si Lien est sous la souris.
Je sais c pas tres clair...
Merci de ton aide (encore une fois)
Marsh Posté le 15-01-2002 à 21:00:08
radeontof a écrit a écrit : Je sais c pas tres clair... Merci de ton aide (encore une fois) |
désolé je comprends pas. Je relirai demain à tête reposée
Marsh Posté le 15-01-2002 à 21:26:03
J'ai trouvé :
Dans mes Composants:
enableEvents(AWTEvent.MOUSE_EVENT_MASK);
enableEvents(AWTEvent.MOUSE_MOTION_EVENT_MASK);
Puis je définis ceci:
public void processMouseEvent(MouseEvent e){
switch(e.getID()) {
case MouseEvent.MOUSE_EXITED:
....
}
break;....
}
Pas besoin de tester le composant par rapport à l'applet.
Celui-ci réagit tout seul maintenant.
Marsh Posté le 15-01-2002 à 11:36:34
Salut,
(cette applet est juste un p'tit exercice pour m'entrainer au JAVA)
Mon applet s'appelle Menu et incorpore plusieurs composants Lien que j'ai créé.
Je veux que chaque Lien change de texte au passage de la souris.
Ca parait simple et ca marche si je définis les evenements dans mon applet . Par ex : lien1_mousemove....
Mais vu que chaque lien réagira pareil je veux définir l'événement dans Lien et non dans l'applet.
Mais la ca ne marche pas, g essayé plusieurs tentatives sans succés.
J'ai l'impression qu'il ne prend pas en compte les evenements de mes Liens.
Voici mes sources :
Pour lien :
public class Lien extends Component{
String afftexte;
String texte;
String texte2;
Color couleur;
public Lien(){
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
public Dimension getPreferredSize() {
return new Dimension(30, 30);
}
public Lien(String stexte,String stexte2,Color c){
texte=stexte;
texte2=stexte2;
afftexte=texte;
couleur=c;
}
public void update(Graphics g){
paint(g);
}
public void paint(Graphics g){
g.setColor(couleur) ;
g.drawString(afftexte,0,10) ;
super.paint(g);
}
private void jbInit() throws Exception {
}
//gestion de MOUSEMOVE QUI NE FONCTIONNE PAS
public boolean mouseMove(Event e,int x,int y)
{
afftexte=texte2;
repaint();
return true;
}
}
----------------
Voici Menu:
public class Menu extends JApplet implements Runnable {
boolean isStandalone = false;
Thread lanceur;
Graphics ecran,ong;
Image temp;
Lien lien2 = new Lien("Gnou","GNOU2",new Color(0,255,0));
Lien lien1 = new Lien("salut","Bonjour",new Color(255,0,0));
XYLayout xYLayout1 = new XYLayout();
public void run(){
while (true)
{
repaint();
try {Thread.sleep(50);}
catch (InterruptedException e) {showStatus("Error " + e);}
}
}
//Construire l'applet
public Menu() {
try {
jbInit();
}
catch(Exception e) {
e.printStackTrace();
}
}
//Initialiser l'applet
public void init() {
try {
this.getContentPane().add(lien1,new XYConstraints(1,1,-1,-1));
this.getContentPane().add(lien2,new XYConstraints(10,10,-1,-1));
}
catch(Exception e) {
e.printStackTrace();
}
}
private void jbInit() throws Exception {
this.getContentPane().setLayout(xYLayout1);
}
//Démarrer l'applet
public void start() {
if (lanceur == null); {
lanceur = new Thread(this);
lanceur.start();
}
}
//Arrêter l'applet
public void stop() {
if (lanceur !=null){
lanceur.stop();
lanceur = null;
}
}
}
Si quelqu'un a une idée...
Merci d'avance!
---------------