Heim > Java > JavaBase > Hauptteil

Ausführliche Erklärung von Ereignissen in Java mit Bildern und Texten

Freigeben: 2019-11-28 17:35:00
nach vorne
2309 Leute haben es durchsucht

Ausführliche Erklärung von Ereignissen in Java mit Bildern und Texten

Bevor Sie Java-Ereignisse lernen, müssen Sie über ein gewisses Verständnis der internen Java-Klassen, allgemeiner Java-Komponenten, Container, Layout-Manager und des abstrakten Java-Fenster-Toolkits verfügen. Sie können einige einfache Fensterprogramme ausführen. (Empfohlen: Java-Video-Tutorial)

Die Java-Sprache verwendet das Autorisierungsereignismodell, um Ereignisse zu verarbeiten. Bei diesem Modell verfügt jede Komponente über entsprechende Ereignisse, beispielsweise ein Klickereignis für eine Schaltfläche, ein Inhaltsänderungsereignis für ein Textfeld usw.

Wenn ein Ereignis ausgelöst wird, sendet die Komponente das Ereignis an jeden von der Komponente registrierten Ereignis-Listener. Zu diesem Zeitpunkt definiert der Ereignis-Listener die Verarbeitung von Ereignissen, die verschiedenen Ereignissen entsprechen Rufen Sie verschiedene Ereignishandler basierend auf unterschiedlichen Ereignisinformationen auf, um die Verarbeitung dieses Ereignisses abzuschließen. Die Ereignisinformationen werden erst empfangen, nachdem der Ereignis-Listener ausgelöst wurde.

Das Besondere an diesem Modell ist, dass die Komponente beim Auslösen nicht selbst verarbeitet, sondern den Verarbeitungsvorgang einem Dritten überlässt. Wenn beispielsweise in der GUI auf eine Schaltfläche geklickt wird, ist die Schaltfläche ein Ereignisquellenobjekt. Die Schaltfläche selbst hat kein Recht, auf diesen Klick zu reagieren. Sie sendet lediglich Informationen an ihren registrierten Listener (oder im Wesentlichen). , es ist auch eine Klasse) zu handhaben.

Um die Ereignisverarbeitung in Java zu verstehen, müssen Sie die folgenden drei wichtigen Grundzüge verstehen.

(1), Ereignis – durch Benutzeroperation generiertes Ereignis

(2), Ereignisquelle – Komponente, die Ereignis generiert

(3), Ereignisbehandlungsmethode Ereignishandle – Methode zur Verarbeitung von Ereignissen

1. Grundprinzipien der Ereignisverarbeitung

Wenn ein Ereignis auf einer Schaltfläche ausgelöst wird, generiert die virtuelle Maschine einen Klick. Anschließend wird das Ereignisobjekt durchsucht Für die registrierte zugehörige Verarbeitungsmethode auf der Schaltfläche, dh die Ereignisquelle, wird das Ereignisobjekt an diese Methode übergeben und diese Methode wird ausgeführt.

Beispielprogramm:

Im folgenden Programm ist JButton jb die Ereignisquelle, ClickAction ist der Ereignishandler, jb.addActionListener(a); ordnet die Ereignisquelle und den Ereignishandler zu, wenn When Tritt ein Klickereignis auf der Ereignisquelle auf, wird der in ClickAction definierte Code ausgeführt.

Der Quellcode lautet wie folgt:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;

public class EventTest {

    public static void main(String[] args) {

        JFrame j = new JFrame("示例程序1");
        //1、事件源jb按钮就是事件源,因为要点击它
        JButton jb = new JButton("click");
        //2、事件处理程序ClickAction表示事件处理程序
        ClickAction a = new ClickAction();
        //3、关联,将事件源和事件处理程序a关联起来,意思是发生点击执行a
        jb.addActionListener(a);
        //将jb源事件添加到窗口中。
        j.getContentPane().add(jb);
        j.pack();
        j.setVisible(true);
    }
}

//事件处理程序,点击就是一个Action事件
class ClickAction implements ActionListener{

    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
        System.out.println("hello");
    }
}
Nach dem Login kopieren

2. Ereignisobjekt

In Ihrem Beispiel oben ist ActionEvent ein Ereignisobjekt. Dieses Ereignis wird von JButton generiert, wenn der JButton gedrückt wird. Das Ereignis wird an das durch die Registrierung des Listeners registrierte ActionListener-Objekt übergeben, über das die häufigsten Informationen wie der Zeitpunkt des Auftretens des Ereignisses und die Ereignisquelle beim Auftreten des Ereignisses abgerufen werden können.

Gängige Methoden von ActionEvent sind wie folgt:

(1)String getActionCommand(): Gibt die Befehlszeichenfolge zurück, die sich auf diesen Aktionstyp bezieht. Die Standardkomponente ist title.

(2)int getModifiers(): Gibt die gleichzeitig gedrückten Tastaturtasten zurück, wenn diese Aktion auftritt

(3) long getWhen(): Gibt die Langform des Ereignisses zurück, wenn dieses Ereignis auftritt.

Beispielprogramm:
Der Quellcode lautet wie folgt:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class EventTest2 {

    public static void main(String[] args) {

        JFrame j = new JFrame("示例程序2");
        JPanel jp = new JPanel();
        JLabel j1 = new JLabel("请点击");
        JButton jb = new JButton("click");
        JButton jb1 = new JButton("click");
        ClickAction2 a = new ClickAction2();
        jb1.addActionListener(a);//如果jb1上发生了Action事件就执行a里面的代码
        jb.addActionListener(a);
        jp.add(j1);
        jp.add(jb);
        jp.add(jb1);
        j.add(jp);
        j.setSize(400, 200);
        j.setVisible(true);

    }

}

class ClickAction2 implements ActionListener{

    //事件发生时,actionPerformed方法会被虚拟机调用,事件对象回传给该方法
    @Override
    public void actionPerformed(ActionEvent e) {
        // TODO Auto-generated method stub
         long d = e.getWhen();//事件发生的事件
         Date date = new Date(d);//转化为相应的时间
         System.out.println(date);
         JButton sou = (JButton)e.getSource();//发生的事件源
         sou.setText("点不着");//将点击发生的按钮的按钮设为点不着
         //如果没有设置过ActionCommand,默认得到的是按钮的标题
         String com = e.getActionCommand();
         System.out.println("command is: " +com);
    }

}
Nach dem Login kopieren

3. Ereignistypen

Es gibt viele Ereignisse in der grafischen Schnittstellenentwicklung . Diese Ereignisse Mit EventObject als oberster Ebene und Klasse wird eine Baumstruktur entsprechend der Art des Ereignisses gebildet.

Einzelheiten finden Sie in der folgenden Abbildung:

Ausführliche Erklärung von Ereignissen in Java mit Bildern und Texten

EventObject ist die übergeordnete Klasse aller Ereignisklassen, die zwei Methoden enthält:

(1), Objekt getSource(): Das Objekt, bei dem das Ereignis ursprünglich aufgetreten ist

(2), String toString(): Gibt die String-Darstellung dieses EventObjects zurück.

Über getSource(): Sie können wissen, auf welchem ​​Objekt das Ereignis aufgetreten ist.

Bezüglich der Bedeutung anderer Ereignisklassen werden im Folgenden Erläuterungen zum Quellcode und einfache Übungen für mehrere Klassen gegeben.

MouseEvent-Klasse

Mausereignisse werden ausgelöst, wenn eine Komponente gedrückt, losgelassen, angeklickt, verschoben oder gezogen wird.

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
public class MouseListenerTest {
    public static void main(String[] args) {
        JFrame j = new JFrame("我的窗口");
        MouL w = new MouL();
        j.addMouseListener(w);
        j.setSize(100, 100);
        j.setVisible(true);
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class MouL implements MouseListener{

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("鼠标的位置: " + e.getX() + "," + e.getY());
        System.out.println("点击发生了");
    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("按下");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("松开");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("鼠标进入了窗口");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("鼠标离开了窗口");
    }
}
Nach dem Login kopieren

WindowEvent-Klasse

Fensterereignisse werden ausgelöst, wenn das Fenster geöffnet, geschlossen, maximiert oder minimiert wird

import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.JFrame;

public class WindowsListenerTest {

    public static void main(String[] args) {

        JFrame j = new JFrame("我的窗口");
        WindowL w = new WindowL();
        j.addWindowListener(w);
        j.setSize(100, 100);
        j.setVisible(true);
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class WindowL implements WindowListener{

    @Override
    public void windowOpened(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口打开时我执行windowOpened");
    }

    @Override
    public void windowClosing(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("windowClosing");
    }

    @Override
    public void windowClosed(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口关闭时我执行windowClosed");
    }

    @Override
    public void windowIconified(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口最小化时我执行windowIconified");
    }

    @Override
    public void windowDeiconified(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口回复时我执行windowDeiconified");
    }

    @Override
    public void windowActivated(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口变成活动状态时我执行mouseClicked");
    }

    @Override
    public void windowDeactivated(WindowEvent e) {
        // TODO Auto-generated method stub
        System.out.println("窗口变成不活动状态时我执行windowDeactivated");
    }

}
Nach dem Login kopieren

ContainerEvent-Klasse

Wenn Ereignisse ausgelöst werden wenn eine Komponente einem Container hinzugefügt oder wenn eine Komponente aus einem Container entfernt wird.

import java.awt.event.ContainerListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ContainerEvent {

    public static void main(String[] args) {

        JFrame j = new JFrame("我的窗口");
        ContL w = new ContL();
        JPanel jp = new JPanel();

        jp.addContainerListener(w);

        JButton del = new JButton("删除");
        JButton add = new JButton("add");

        jp.add(add);
        jp.add(del);//触发组件添加了

        jp.remove(del);//触发组件删除了

        j.getContentPane().add(jp);
        j.setSize(100, 100);
        j.setVisible(true);
        j.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    }

}

class ContL implements ContainerListener{

    @Override
    public void componentAdded(java.awt.event.ContainerEvent e) {
        // TODO Auto-generated method stub
        System.out.println("组件添加了");
    }

    @Override
    public void componentRemoved(java.awt.event.ContainerEvent e) {
        // TODO Auto-generated method stub
        System.out.println("组件删除了");
    }

}
Nach dem Login kopieren

FocusEvent

Mausklicks und andere Vorgänge führen dazu, dass eine Komponente den Fokus erhält oder verliert. Wenn eine Komponente den Fokus erhält oder den Fokus verliert, wird das Fokusereignis ausgelöst

import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class FocusTest {

    public static void main(String[] args) {

        JFrame j = new JFrame("key test");
        JPanel jp = new JPanel();
        JButton j1 = new JButton("1");
        JButton j2 = new JButton("2");
        j1.addFocusListener(new FocusL());
        j2.addFocusListener(new FocusL());
        jp.add(j1);
        jp.add(j2);
        j.add(jp);
        j.setSize(600, 500);
        j.setVisible(true);
    }

}

class FocusL implements FocusListener{

    @Override
    public void focusGained(FocusEvent e) {
        //得到FocusEvent发生时的对象,转化为按钮
        // TODO Auto-generated method stub
        JButton j = (JButton)e.getSource();
        //得到按钮的标题
        String title = j.getText();
        System.out.println("focusGained:按钮" + title + "获得焦点");
    }

    @Override
    public void focusLost(FocusEvent e) {
        // TODO Auto-generated method stub
        JButton j = (JButton)e.getSource();
        String title = j.getText();
        System.out.println("focusLost:按钮" + title + "失去焦点");
    }

}
Nach dem Login kopieren

4. Mehrere Listener

Im Allgemeinen kann die Ereignisquelle viele verschiedene Arten von Ereignissen umfassen werden generiert, sodass viele verschiedene Arten von Zuhörern registriert (ausgelöst) werden können.

Mehrere Listener können für eine Ereignisquellenkomponente registriert werden, und ein Listener kann für mehrere verschiedene Ereignisquellen registriert werden.

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

import javax.swing.JFrame;
import javax.swing.JTextField;

public class MultiListenerTest {

    public static void main(String[] args) {

        JFrame a = new JFrame("事件处理");
        JTextField jf = new JTextField();
        a.add(jf, "South");
        MouseM m = new MouseM();

        //同一事件源上注册两个事件监听程序
        //鼠标的监听程序如点击等
        a.addMouseListener(m);

        //鼠标移动的监听程序
        a.addMouseMotionListener(m);

        a.setSize(200, 200);
        a.setVisible(true);
    }

}

class MouseM implements MouseMotionListener, MouseListener{

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("clicked" + "x:" + e.getX() + ",y:" + e.getY());
    }

    @Override
    public void mousePressed(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("mousePressed");
    }

    @Override
    public void mouseReleased(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("mouseRelsased");
    }

    @Override
    public void mouseEntered(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("mouseEntered");
    }

    @Override
    public void mouseExited(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("mouseExited");
    }

    @Override
    public void mouseDragged(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("拖动:" + e.getPoint());
    }

    @Override
    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub
        System.out.println("移动:" + e.getPoint());
    }

}
Nach dem Login kopieren

5. Ereignisadapter

Um die Programmierung zu vereinfachen, definiert JDK entsprechende Implementierungsklassen für die meisten Ereignis-Listener-Schnittstellen – Ereignisadapterklassen, die im Adapter alle Methoden implementieren in der entsprechenden Listener-Schnittstelle, tut aber nichts.

Die definierte Listener-Klasse kann also die Ereignisadapterklasse erben und nur die erforderlichen Methoden überschreiben.

verfügt über die folgenden Adapter:

- ComponentAdapter (Komponentenadapter)

- ContainerAdapter (容器适配器)

- FocusAdapter (焦点适配器)

- KeyAdapter (键盘适配器)

- MouseAdapter (鼠标适配器)

- MouseMotionAdapter (鼠标运动适配器)

- WindowAdapter (窗口适配器)

鼠标适配器示例程序:MouseListener中由多个方法,但在这里只实现了mouseClicked()

package 图形界面设计;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;

public class AdapterTest {

    public static void main(String[] args) {

        JFrame z = new JFrame("事件适配器测试");
        z.setSize(500, 400);

        MouseLS a = new MouseLS();

        //注册z上的鼠标事件处理程序,发生点击等事件执行a里的代码
        z.addMouseListener(a);
        z.setVisible(true);
        z.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class MouseLS extends MouseAdapter{

    public void mouseClicked(MouseEvent e){

        // 打印出鼠标点击时的x点和y点的坐标
        System.out.println("鼠标点击了:" + e.getX() + "," + e.getY());
    }

}
Nach dem Login kopieren

更多java知识请关注java基础教程栏目。

Das obige ist der detaillierte Inhalt vonAusführliche Erklärung von Ereignissen in Java mit Bildern und Texten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:csdn.net
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!