> Java > Java베이스 > 본문

그림과 텍스트로 자바의 이벤트에 대한 자세한 설명

풀어 주다: 2019-11-28 17:35:00
앞으로
2310명이 탐색했습니다.

그림과 텍스트로 자바의 이벤트에 대한 자세한 설명

Java 이벤트를 배우기 전에 Java 내부 클래스, 일반적인 Java 구성 요소, 컨테이너, 레이아웃 관리자 및 Java 추상 창 툴킷에 대해 어느 정도 이해해야 합니다. 다음 지식 포인트를 결합하면 간단한 창 프로그램을 만들 수 있습니다. (권장: java 비디오 튜토리얼)

Java 언어는 인증 이벤트 모델을 사용하여 이벤트를 처리합니다. 이 모델에서 각 구성 요소에는 버튼의 클릭 이벤트, 텍스트 필드의 콘텐츠 변경 이벤트 등과 같은 해당 이벤트가 있습니다.

이벤트가 트리거되면 구성 요소는 구성 요소에 등록된 각 이벤트 리스너로 이벤트를 보냅니다. 이벤트 리스너는 다양한 이벤트에 해당하는 이벤트 처리를 정의합니다. 이벤트 정보는 이 이벤트 처리를 완료하기 위해 다양한 이벤트 핸들러를 호출합니다. 이벤트 정보는 이벤트 리스너가 트리거된 후에만 수신됩니다.

이 모델의 주목할만한 특징은 구성 요소가 트리거되면 자체적으로 처리하지 않고 처리 작업을 제3자에게 맡긴다는 것입니다. 예를 들어, GUI에서 버튼을 클릭하면 버튼 자체는 이 클릭에 반응할 권한이 없습니다. 버튼이 하는 일은 등록된 리스너(이벤트 처리(또는 본질적으로))에게 정보를 보내는 것입니다. , 클래스)도 처리합니다.

Java의 이벤트 처리를 이해하려면 다음 세 가지 중요한 개요를 이해해야 합니다.

(1), 이벤트 - 사용자 조작에 의해 생성된 이벤트

(2), 이벤트 소스 - 이벤트를 생성하는 구성 요소

(3), 이벤트 처리 방법 이벤트 처리 - 이벤트 처리 방법

1. of eventprocessing

버튼에서 이벤트가 발생하면 가상 머신은 클릭 이벤트 객체를 생성한 후, 이벤트 소스인 버튼에 등록된 관련 처리 메소드를 검색하여 이 메소드에 이벤트 객체를 전달합니다. , 이 메소드가 실행됩니다.

샘플 프로그램:

다음 프로그램에서 JButton jb는 이벤트 소스이고 ClickAction은 이벤트 핸들러이며 jb.addActionListener(a)는 이벤트 소스에서 클릭 이벤트가 발생할 때 이벤트 소스와 이벤트 핸들러를 연결합니다. ClickAction에 정의된 코드를 실행합니다.

소스 코드는 다음과 같습니다.

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");
    }
}
로그인 후 복사

2. 이벤트 객체

위의 예에서 ActionEvent는 JButton을 누르면 이 이벤트가 생성됩니다. 리스너를 등록하여 등록한 ActionListener 객체에 이벤트가 전달되며, 이를 통해 이벤트가 발생한 시간, 이벤트 소스 등 가장 일반적인 정보를 얻을 수 있다.

ActionEvent의 일반적인 메소드는 다음과 같습니다.

(1)String getActionCommand(): 이 유형의 액션과 관련된 명령 문자열을 반환합니다. 기본 구성 요소는 title입니다.

(2)int getModifiers(): 이 작업이 발생할 때 동시에 누른 키보드 버튼을 반환합니다.

(3)long getWhen(): 이 이벤트가 발생할 때 이벤트의 긴 형식을 반환합니다.

샘플 프로그램:
소스 코드는 다음과 같습니다.

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);
    }

}
로그인 후 복사

3. 이벤트 유형

그래픽 인터페이스 개발에는 EventObject를 최상위 레이어 및 클래스로 사용하는 이벤트가 많으며 이에 따라 트리 구조를 형성합니다. 이벤트 유형에.

자세한 내용은 아래 그림을 참조하세요.

그림과 텍스트로 자바의 이벤트에 대한 자세한 설명

EventObject는 모든 이벤트 클래스의 상위 클래스입니다. 여기에는 두 가지 메서드가 포함되어 있습니다:

(1), Object getSource(): 이벤트가 원래 발생한 개체

(2) , String toString(): 이 EventObject의 문자열 표현을 반환합니다.

getSource()를 통해: 어떤 객체에서 이벤트가 발생했는지 알 수 있습니다.

다른 이벤트 클래스의 의미와 관련하여 여러 클래스에 대한 소스 코드 설명과 간단한 훈련이 아래에 제공됩니다.

MouseEvent 클래스

마우스 이벤트는 구성 요소를 누르거나, 놓거나, 클릭하거나, 이동하거나 드래그할 때 트리거됩니다.

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("鼠标离开了窗口");
    }
}
로그인 후 복사

WindowEvent 클래스

창이 열리거나, 닫히거나, 최대화되거나 최소화될 때 창 이벤트가 트리거됩니다.

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");
    }

}
로그인 후 복사

ContainerEvent 클래스

구성 요소가 컨테이너에 추가되거나 구성 요소가 컨테이너에서 제거되면 이벤트가 발생합니다. 트리거됩니다.

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("组件删除了");
    }

}
로그인 후 복사

FocusEvent

마우스 클릭 및 기타 작업으로 인해 구성 요소가 포커스를 얻거나 잃을 수 있습니다. 구성 요소가 포커스를 얻거나 포커스를 잃으면 포커스 이벤트가 트리거됩니다

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 + "失去焦点");
    }

}
로그인 후 복사

4. 다중 리스너

일반적으로 이벤트 소스는 다양한 유형의 이벤트를 생성할 수 있으므로 다양한 유형을 등록(트리거)할 수 있습니다. 청취자의.

이벤트 소스 구성 요소에 여러 리스너를 등록할 수 있으며, 여러 다른 이벤트 소스에 리스너를 등록할 수 있습니다.

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());
    }

}
로그인 후 복사

5. 이벤트 어댑터

JDK는 대부분의 이벤트 리스너 인터페이스에 해당하는 구현 클래스(이벤트 어댑터 클래스)를 정의합니다. 어댑터에서는 해당 리스너 인터페이스가 모든 메서드에 대해 구현되지만 아무 작업도 수행하지 않습니다.

따라서 정의된 리스너 클래스는 이벤트 어댑터 클래스를 상속할 수 있으며 필요한 메서드만 재정의할 수 있습니다.

다음과 같은 어댑터가 있습니다:

- ComponentAdapter(구성 요소 어댑터)

- 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());
    }

}
로그인 후 복사

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

위 내용은 그림과 텍스트로 자바의 이벤트에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!