Maison > Java > javaDidacticiel > le corps du texte

Explication détaillée du mécanisme de traitement des événements JAVA

零下一度
Libérer: 2017-06-25 10:38:39
original
2151 Les gens l'ont consulté

Nous avons écrit deux sections d'exemples enseignant-élève d'affilée, et nous avons dû nous ennuyer à mort. Même si nous avons joué cet exemple 100 fois, nous ne savons toujours pas comment écrire du vrai code. À partir de cette section, nous commençons à nous rapprocher du vrai code. L'exemple le plus simple à comprendre d'un événement

est un événement de souris : lorsque nous cliquons avec la souris, la souris envoie des instructions pour exécuter le code.

1 : Version de base du modèle de traitement des événements de clic de souris

À ce stade, nous devons vérifier les types associés dans le JDK. En comparant le diagramme UML de la section précédente "Comprendre le mécanisme de traitement des événements JAVA à partir de zéro (2)", nous avons rapidement découvert que correspondant à HomeworkListener, il existe MouseListener dans JDK. En fait, nous pouvons également savoir grâce à l'analyse que MouseListener hérite d'EventListener. Maintenant que nous avons l'interface MouseListener, nous devons avoir une classe d'implémentation. Cette classe est supposée s'appeler : ConcreteMouseListener. Autant l'implémenter en premier :

package com.zuikc.events;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener ;

classe publique ConcreteMouseListener implémente MouseListener {

public ConcreteMouseListener(){

}
@Override
public void mouseClicked(MouseEvent e) {
System.out .printf("J'ai été cliqué par {%s}, MD me démangeait~~", e.getSource().toString());
}

@Override
public void mousePressed(MouseEvent e) {
// TODO Stub de méthode généré automatiquement
}

@Override
public void mouseReleased(MouseEvent e) {
// TODO généré automatiquement stub de méthode
}

@Override
public void mouseEntered(MouseEvent e) {
// TODO Stub de méthode généré automatiquement
}

@Override
Public void mouseexited (moseeEvent E) {
// Todo Auto-Generatd Method Stub
}

}

Nous ajoutons du code métier au processeur d'événements pour cliquer sur le processeur d'événements .

Gestionnaire d'événements : la méthode d'implémentation de la classe d'implémentation spécifique de l'écouteur est appelée gestionnaire d'événements.

Ce qu'il faut regarder ensuite, bien sûr, c'est MouseEvent. MouseEvent, cette classe du JDK est relativement grande et la méthode constructeur a beaucoup de paramètres, mais cela n'a pas d'importance. Jetons-y un coup d'œil. Je vais d'abord parler de la façon d'utiliser cette classe, c'est-à-dire. comment le créer nouveau.

/*

* Le new Component() {} voici la source d'événement obtenue par event.getSource()
*/
MouseEvent event = new MouseEvent(new Component () {}, 1, 1, 1,2,3,4,false);

Dans des circonstances réelles et normales, il n'est pas nécessaire que MouseEvent soit nouveau par lui-même, il le sera capturé lorsque JAVA est en cours d'exécution L'action de clic de la souris matérielle est générée pour nous par la couche inférieure de la machine virtuelle (cela sera analysé pour nous ci-dessous), mais nous la simulons en ce moment, donc cela ne nous empêche pas de en créant un nouveau au hasard. Notez que new n'est pas un problème. La clé du problème est que nous devons connaître la signification de ses paramètres de constructeur, et le paramètre clé principal est le premier paramètre, new Component(). C'est cette source d'événement ! Revenons sur l'endroit où notre version enseignant-élève produit des événements :

public void setHomework(String homework) {

System.out.printf("%s assigné homework %s n" , this. name, homework);
homeworks.add(homework);
HomeworkEventObject event = new HomeworkEventObject(this);
/*
* Dans le modèle d'observateur, nous appelons directement l'Observable notifyObservers pour notifier le observé
* Désormais, nous ne pouvons nous notifier que ~~
*/
pour (écouteur HomeworkListener : homeworkListenerList) {
auditeur.update(event, homework);
}

>

est dans l'ensemble de codes professionnels de l'enseignant, Devoirs. Donc, dans l’exemple actuel que nous allons écrire, où est le nouveau MouseEvent ? Dans le code métier de Button, qui est Button ? Button est similaire à Teacher, mais pas exactement le même que Teacher. Dans Teacher, Teacher lui-même est la source de l'événement. Il est donc transmis à HomeworkEventObject en tant que paramètre et Button ne peut pas être utilisé. en tant que paramètre. Les paramètres sont transmis à MouseEvent. Parce que je ne veux pas que Button hérite du composant, nous créons d'abord un nouveau composant temporaire. OK, après l'analyse, notre propre code Button est probablement sorti, qui ressemble à ceci :

package com.zuikc.events;

import java.awt.AWTEvent
importer java.awt.AWTEventMulticaster;
importer java.awt.Component;
importer java.awt.event.MouseEvent;
importer java.awt.event.MouseListener;
importer java. peer.LightweightPeer;

public class Button {
private MouseListener mouseListener;
public void addMouseListener(MouseListener l) {
mouseListener = l;
}
public void DOCLICK ( ) {
/ *
*Le nouveau composant () {} voici la source d'événement de event.getsource {}, 1, 1, 1,2,3,4,false); //event.getSource();
this.mouseListener.mouseClicked(event);
}
}


À ce stade, nous pouvons dessiner un diagramme de classes clair, Jetons un coup d'oeil :

Au fait, jetons un coup d'œil au code client : Explication détaillée du mécanisme de traitement des événements JAVA

public static void main(String[] args) {

ConcreteMouseListener Listener = new ConcreteMouseListener();
Button Button = new Button();

Button.addMouseListener(listener);
Button.doClick();
}


Exécutez-le, vous devriez obtenir un résultat similaire à celui-ci :

J'ai cliqué sur {com.zuikc.events.Button$1 [,0,0,0x0,invalid]}, MD ça démangeait~~

Deuxièmement, à quoi ressemble un programme de forme normale

Ci-dessus, nous avons fait de notre mieux pour nous concentrer sur les exemples d'enseignants et les étudiants, et a écrit la version de base des événements de la souris, mais qu'en est-il de l'apparence originale du programme ? Allez, écrivons ensuite un programme normal. 99,9% des gens l'écrivent comme ça lorsqu'ils écrivent un programme de formulaire. Je sais que certains d'entre vous viendront me gronder encore, quoi, java, programme de formulaire ? J'ai putain appris JAVA pour le développement EE et le développement d'entreprise. Maintenant, parlons d'abord de la question de savoir si nous devrions nous faire du mal. Vous devez savoir que même NB comme JAVA a d'abord fait fortune grâce aux formulaires. De plus, le cadre de formulaires de JAVA a été renversé et réécrit plus d'une fois. Ainsi, vous comprenez les événements du formulaire, et les événements du cadre dans EE sont comme couper du chou.

Retour aux choses sérieuses, regardons le code :

package com.zuikc.events;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import javax.swing.JButton;

import javax.swing.JFrame;

public class Client {
public static void main(String[] args) {

new DemoFrame();

}
}

class DemoFrame étend JFrame implémente MouseListener {

public DemoFrame() {

super("demo ");

this.setSize(500, 400);

this.setLocationRelativeTo(null);
this.getContentPane().setLayout(null);
this.setVisible(true);

JButton bouton1 = new JButton("ok");
bouton1.setBounds(8, 8, 80, 80);

bouton1.addMouseListener(this);

this.getContentPane() .add(button1) ;
}

@Override
public void mouseClicked(MouseEvent e) {

System.out.printf("J'ai été cliqué par {%s}, MD était démangeaisons~~ ", e.getSource().toString());

}

@Override
public void mousePressed(MouseEvent e) {

}


@ Override
public void mouseReleased(MouseEvent e) {

}

@Override
public void mouseEntered(MouseEvent e) {
}

@Override
public void mouseExited(MouseEvent e) {
}
}

Que signifie ce code ? Le plus simple est de créer un formulaire, de placer un bouton sur le formulaire, et lorsque l'on clique dessus, une ligne de code est exécutée. Ce fichier simple, avec peu de lignes de code, implémente en fait les fonctions implémentées dans un certain nombre de classes ci-dessus. Allez, analysons-le et signalons les auditeurs, les gestionnaires d'événements, les événements et les sources d'événements.

Listener : DemoFrame est l'écouteur, correspondant à ConcreteMouseListener ;

Gestionnaire d'événements : la méthode MouseClicked est l'écouteur, et ConcreteMouseListener a également cette méthode

Event ; : je ne le vois plus, que dois-je faire ?

Source de l'événement : je ne le vois pas, que dois-je faire ?

Notez que le formulaire lui-même a un écouteur, alors comment ajouter un écouteur au bouton dans le code ci-dessus ? button1.addMouseListener(this); Oui, ajoutez-vous simplement.

Ensuite, ni l'événement ni la source de l'événement ne peuvent être vus à ce moment-là ? Si nous regardons le résultat, le résultat du code ci-dessus est :

J'étais {javax.swing.JButton[,8,8,80x80,invalid,alignmentX=0.0,alignmentY=0.5,border=javax .swing .plaf.BorderUIResource$CompoundBorderUIResource@7fda7dfe,flags=296,maximumSize=,minimumSize=,preferredSize=,defaultIcon=,disabledIcon=,disabledSelectedIcon=,margin=javax.swing.plaf.InsetsUIResource[top=2,left=14 ,bottom =2,right=14],paintBorder=true,paintFocus=true,pressedIcon=,rolloverEnabled=true,rolloverIcon=,rolloverSelectedIcon=,selectedIcon=,text=ok,defaultCapable=true]} J'ai cliqué et MD me démangeait~ ~

Il semble que le résultat similaire à la première partie de notre code ci-dessus soit également une variable générée lors de l'exécution du code métier JButton, mais nous ne savons pas où elle est générée ni où elle est générée. Mais ce n'est pas grave, regardons la pile de débogage !

En rattrapant étape par étape, nous sommes enfin arrivés là :

Explication détaillée du mécanisme de traitement des événements JAVA

On voit que MouseEvent est également dans le code métier Lorsque du nouveau sort, vous vous demandez peut-être qu'en est-il de ce premier paramètre important, la cible ? Cible, mais la source de l'événement est également très importante. La raison est très simple. Continuez à monter. En raison du manque d'espace, nous ne l'étendrons pas ici à un endroit où vous souhaitez le voir.

Maintenant, nous complétons la réponse,

Événement : le runtime JAVA capture le déclencheur matériel de la souris, appelant ainsi le processeur d'événements. Le MouseEvent généré à l'intérieur du processeur d'événements est Event ; >

Source de l'événement : JAVA capture le déclencheur matériel de la souris lors de l'exécution, appelant ainsi le processeur d'événements. La cible générée à l'intérieur du processeur d'événements est la source de l'événement

3. : La version normale de la première partie du code ci-dessus

Écrit selon le code de la deuxième partie, à quoi devrait ressembler notre première partie du code ?

En comparant le premier et le second, en fait, tant que deux endroits sont modifiés, le code du premier est complètement cohérent avec le second

1 : Nommez le ConcreteMouseListener. DemoFrame ;

2 : placez l'instance Button du client dans ConcreteMouseListener ;

OK, l'événement est aussi simple que cela.

Les première et deuxième parties de cette série sont respectivement :

1 : Comprendre le mécanisme de traitement des événements JAVA à partir de zéro (1)

2 : Comprendre JAVA à partir de zéro Gestion des événements mécanisme (2)

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!