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

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

Jun 25, 2017 am 10:38 AM
java 事件 处理 commencer 理解

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!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Racine carrée en Java Racine carrée en Java Aug 30, 2024 pm 04:26 PM

Guide de la racine carrée en Java. Nous discutons ici du fonctionnement de Square Root en Java avec un exemple et son implémentation de code respectivement.

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro Armstrong en Java Numéro Armstrong en Java Aug 30, 2024 pm 04:26 PM

Guide du numéro Armstrong en Java. Nous discutons ici d'une introduction au numéro d'Armstrong en Java ainsi que d'une partie du code.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

See all articles