Wir haben zwei Abschnitte mit Lehrer-Schüler-Beispielen hintereinander geschrieben und müssen uns zu Tode gelangweilt haben. Obwohl wir dieses Beispiel 100 Mal durchgespielt haben, wissen wir immer noch nicht, wie man echten Code schreibt. Ab diesem Abschnitt nähern wir uns dem echten Code. Das am einfachsten zu verstehende Beispiel für ein
-Ereignis ist ein Mausereignis: Wenn wir mit der Maus klicken, sendet die Maus Anweisungen zur Ausführung des Codes.
1: Basisversion des Mausklick-Ereignisverarbeitungsmodells
Zu diesem Zeitpunkt müssen wir die zugehörigen Typen im JDK überprüfen. Beim Vergleich des UML-Diagramms im vorherigen Abschnitt „Verstehen des JAVA-Ereignisverarbeitungsmechanismus von Grund auf (2)“ haben wir schnell festgestellt, dass es im JDK einen MouseListener gibt, der dem HomeworkListener entspricht. Tatsächlich können wir durch Analyse auch erkennen, dass MouseListener von EventListener erbt. Da wir nun die Schnittstelle MouseListener haben, müssen wir eine Implementierungsklasse haben. Diese Klasse soll den Namen ConcreteMouseListener haben. Sie können es genauso gut zuerst implementieren:
package com.zuikc.events;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener ;public class ConcreteMouseListener implementiert MouseListener {
public ConcreteMouseListener(){
}
@Override
public void mouseClicked(MouseEvent e) {
System.out .printf("Ich wurde von {%s} angeklickt, MD hat gejuckt~~", e.getSource().toString());
}@Override
public void mousePressed(MouseEvent e) {
// TODO Automatisch generierter Methoden-Stub
}@Override
public void mouseReleased(MouseEvent e) {
// TODO Automatisch generiert Methodenstub
}@Override
public void mouseEntered(MouseEvent e) {
// TODO Automatisch generierter Methodenstub
}@Override
Ereignishandler: Die Implementierungsmethode der spezifischen Implementierungsklasse des Listeners wird als Ereignishandler bezeichnet.
public void mouseExited(MouseEvent e) {
.
Als nächstes sollten wir uns natürlich MouseEvent ansehen. MouseEvent, diese Klasse im JDK ist relativ groß und die Konstruktormethode hat viele Parameter, aber das spielt keine Rolle. Ich werde zunächst darüber sprechen, wie diese Klasse verwendet wird. wie man es neu erstellt.*//*
* Die neue Component() {} hier ist die von event.getSource() erhaltene Ereignisquelle
MouseEvent event = new MouseEvent(new Component () {}, 1, 1, 1,2,3,4,false);
homeworks.add(homework);Unter tatsächlichen und normalen Umständen ist es nicht nötig, dass MouseEvent selbst neu ist, das wird es sein erfasst, wenn JAVA ausgeführt wird. Für die Klickaktion der Hardware-Maus wird das Instanzobjekt für uns von der unteren Ebene der virtuellen Maschine generiert (dies wird unten für uns analysiert), aber wir simulieren es in diesem Moment, also ist es so hindert uns nicht daran, zufällig ein neues zu erstellen. Beachten Sie, dass new kein Problem darstellt. Der Schlüssel zum Problem besteht darin, dass wir die Bedeutung seiner Konstruktorparameter kennen müssen. Der Kernschlüsselparameter ist der erste Parameter, new Component(). Das ist diese Ereignisquelle! Schauen wir uns noch einmal an, wo unsere Lehrer-Schüler-Version Ereignisse erzeugt:
System.out.printf("%s zugewiesene Hausaufgabe %s n" , this. name, homework);
public void setHomework(String homework) {
HomeworkEventObject event = new HomeworkEventObject(this);
/** Im Beobachtermuster rufen wir direkt das Observable notifyObservers auf, um das zu benachrichtigen beobachtet* Jetzt können wir uns nur noch benachrichtigen ~~
*/
für (HomeworkListener listener: homeworkListenerList) {
listener.update(event, homework);
}
}
befindet sich im Geschäftscode-Set des LehrersHausaufgaben. Wo ist also im aktuellen Beispiel, das wir schreiben werden, das neue MouseEvent? Wer ist im Geschäftscode von Button? Button ähnelt Teacher, ist aber nicht genau dasselbe wie Teacher. In Teacher ist Teacher selbst die Ereignisquelle, daher wird dies als Parameter an HomeworkEventObject übergeben und Button kann nicht verwendet werden Als Parameter werden die Parameter an MouseEvent übergeben. Da ich nicht möchte, dass Button von Component erbt, erstellen wir zunächst eine neue temporäre Komponente. OK, nach der Analyse ist wahrscheinlich unser eigener Button-Code herausgekommen, der so aussieht:
package com.zuikc.events;
import java.awt.AWTEvent; >java.awt.AWTEventMulticaster importieren;
public class Button {
java.awt.Component importieren;
java.awt.event.MouseEvent importieren;
java.awt.event.MouseListener importieren;
java importieren. peer.LightweightPeer;private MouseListener mouseListener;
public void addMouseListener(MouseListener l) {
mouseListener = l;
}
public void DOCLICK ( ) {
/ *
*Die neue Komponente () {} ist hier die Ereignisquelle von event.getsource (}, 1, 1, 1,2,3,4,false);
//event.getSource();
this.mouseListener.mouseClicked(event);
}
}
An diesem Punkt können wir ein klares Klassendiagramm zeichnen, Werfen wir einen Blick darauf:
Werfen wir übrigens einen Blick auf den Client-Code:
public static void main(String[] args) {
ConcreteMouseListener listener = new ConcreteMouseListener();Button button = new Button();Ich wurde auf {com.zuikc.events.Button$1 [,0,0,0x0,invalid]} geklickt, MD hat gejuckt~~button.addMouseListener(listener);
button.doClick();
}
Führen Sie es aus, Sie sollten eine Ausgabe ähnlich dieser erhalten:
Zweitens, wie ein Normalformprogramm aussieht
Oben haben wir unser Bestes versucht, uns auf die Beispiele von Lehrern zu konzentrieren und Studenten und schrieb die Basisversion von Mausereignissen, aber wie sieht es mit dem ursprünglichen Erscheinungsbild des Programms aus? Komm schon, lass uns als nächstes ein normales Programm schreiben. 99,9 % der Leute schreiben es so, wenn sie ein Formularprogramm schreiben. Ich weiß, dass einige von euch noch einmal auf mich zukommen und mich ausschimpfen werden: Was, Java, Formularprogramm? Ich habe verdammt noch mal JAVA für EE-Entwicklung und Unternehmensentwicklung gelernt. Lassen Sie uns zunächst darüber sprechen, ob wir uns gegenseitig verletzen sollten. Sie müssen wissen, dass selbst NB wie JAVA sein Vermögen zuerst mit Formularen gemacht hat. Darüber hinaus wurde das Formular-Framework von JAVA mehr als einmal gestürzt. Sie verstehen also die Ereignisse des Formulars, und die Ereignisse des Frameworks in EE sind wie das Hacken von Kohl.
Zurück zum Geschäft, schauen wir uns den Code an:package com.zuikc.events;
import java.awt.event.MouseEvent;import java.awt. event.MouseListener;
import javax.swing.JButton;import javax.swing.JFrame;
new DemoFrame();
public class Client {
public static void main(String[] args) {}
public DemoFrame() {
}
class DemoFrame erweitert JFrame implementiert MouseListener {super("demo ");
this.setSize(500, 400);this.setLocationRelativeTo(null);
button1.addMouseListener(this);
this.getContentPane().setLayout(null);
this.setVisible(true);
JButton button1 = new JButton("ok");
button1.setBounds(8, 8, 80, 80);this.getContentPane() .add(button1) ;
System.out.printf("Ich wurde von {%s} angeklickt, MD war itchy~~ ", e.getSource().toString());
}
@Override
public void mouseClicked(MouseEvent e) {}
}
@Override
public void mousePressed(MouseEvent e) {}
@ Override
public void mouseReleased(MouseEvent e) {@Override
public void mouseEntered(MouseEvent e) {
}@Override
public void mouseExited(MouseEvent e) {
}
}
Was bedeutet dieser Code? Am einfachsten ist es, ein Formular zu erstellen, eine Schaltfläche darauf zu platzieren und beim Klicken darauf eine Codezeile auszuführen. Diese einfache Datei mit nicht vielen Codezeilen implementiert tatsächlich die Funktionen, die in einer Reihe der oben genannten Klassen implementiert sind. Komm schon, lass es uns analysieren und auf die Listener, Event-Handler, Events und Event-Quellen hinweisen.
Listener: DemoFrame ist der Listener, entsprechend ConcreteMouseListener; Ereignishandler: Die MouseClicked-Methode ist der Listener, und ConcreteMouseListener verfügt auch über diese Methode; : Ich kann es nicht mehr sehen, was soll ich tun?
Ereignisquelle: Ich kann es nicht sehen, was soll ich tun?
Beachten Sie, dass das Formular selbst einen Listener hat. Wie fügt man der Schaltfläche im obigen Code einen Listener hinzu? button1.addMouseListener(this); Ja, fügen Sie sich einfach selbst hinzu. Dann sind weder das Ereignis noch die Ereignisquelle sichtbar. Was soll ich zu diesem Zeitpunkt tun? Wenn wir uns die Ausgabe ansehen, lautet die Ausgabe des obigen Codes:
I was {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]} Geklickt und MD juckte ~ ~
Es scheint, dass die Ausgabe, die dem ersten Teil unseres obigen Codes ähnelt, ebenfalls eine Variable ist, die während der Ausführung des JButton-Geschäftscodes generiert wird, aber wir wissen nicht, wo sie generiert wird oder wo sie generiert wird. Aber das ist in Ordnung, schauen wir uns den Debug-Stack an!
Nachdem wir Schritt für Schritt aufgeholt haben, sind wir endlich da:
Es ist ersichtlich, dass MouseEvent auch im Geschäftscode enthalten ist Wenn etwas Neues herauskommt, fragen Sie sich vielleicht: Was ist mit diesem wichtigen ersten Parameter, dem Ziel? Ziel, aber auch die Quelle des Ereignisses ist sehr einfach. Aus Platzgründen werden wir es nicht an einer Stelle erweitern, an der Sie es sehen möchten.
Jetzt vervollständigen wir die Antwort:
Ereignis: Die JAVA-Laufzeit erfasst den Hardware-Mausauslöser und ruft so den im Ereignisprozessor generierten Ereignisprozessor auf >Ereignisquelle: JAVA erfasst beim Ausführen den Hardware-Mausauslöser und ruft so den Ereignisprozessor auf. Das im Ereignisprozessor generierte Ziel ist die Ereignisquelle : Die normale Version des ersten Teils des obigen Codes
Wie sollte unser erster Teil des Codes aussehen, geschrieben gemäß dem Code im zweiten Teil? Vergleicht man den ersten und den zweiten, stimmt der Code im ersten tatsächlich vollständig mit dem zweiten überein, solange zwei Stellen geändert werden.1: Benennen Sie den ConcreteMouseListener DemoFrame; 2: Platzieren Sie die Button-Instanz vom Client im ConcreteMouseListener.
OK, so einfach ist das Ereignis.
Der erste und zweite Teil dieser Serie sind jeweils:
1: Den JAVA-Ereignisverarbeitungsmechanismus von Grund auf verstehen (1) 2: JAVA von Grund auf verstehen Ereignisbehandlung Mechanismus (2)
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des JAVA-Ereignisverarbeitungsmechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!