>  기사  >  Java  >  JAVA 이벤트 처리 메커니즘에 대한 자세한 설명

JAVA 이벤트 처리 메커니즘에 대한 자세한 설명

零下一度
零下一度원래의
2017-06-25 10:38:392144검색

우리는 교사-학생 예제를 두 섹션으로 연속해서 작성했는데, 이 예제를 100번 플레이했지만 우리는 여전히 실제 코드를 작성하는 방법을 모릅니다. 이 섹션부터 실제 코드에 더 가까워지기 시작합니다.

이벤트의 가장 이해하기 쉬운 예는 마우스 이벤트입니다. 마우스를 클릭하면 마우스가 코드 실행 명령을 보냅니다.

1: 마우스 클릭 이벤트 처리 모델의 기본 버전

이때 JDK에서 관련 유형을 확인해야 합니다. 이전 섹션 "처음부터 JAVA 이벤트 처리 메커니즘 이해(2)"의 UML 다이어그램을 비교하면 JDK에 HomeworkListener에 해당하는 MouseListener가 있다는 것을 금방 알 수 있습니다. 실제로 MouseListener가 EventListener에서 상속된다는 것도 분석을 통해 알 수 있습니다. 이제 MouseListener 인터페이스가 있으므로 구현 클래스가 있어야 합니다. 이 클래스는 ConcreteMouseListener라고 가정합니다. 먼저 구현하는 것이 좋습니다:

package com.zuikc.events;

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

public class ConcreteMouseListener는 MouseListener를 구현합니다. {

  public ConcreteMouseListener() {

}
@Override
public void mouseClicked(MouseEvent e) {
        System.out.printf("{%s}님이 클릭했는데 MD가 가렵네요~~", e.getSource().toString ( ); // TODO 자동 생성된 메서드 스텁
                @Override

        public void mouseEntered(MouseEvent e)                                                                                // TODO 자동 생성 메서드 스텁

}

}

클릭 이벤트 핸들러에 대한 비즈니스 코드를 추가합니다.


이벤트 핸들러: 리스너의 특정 구현 클래스의 구현 방법을 이벤트 핸들러라고 합니다.




다음으로 살펴볼 것은 물론 MouseEvent입니다. JDK에서 이 클래스인 MouseEvent는 상대적으로 크고 생성자 메소드에 많은 매개변수가 있지만 먼저 이 클래스를 사용하는 방법에 대해 살펴보겠습니다. 새로 만드는 방법.


/*
* new Component() {}는 event.getSource()에서 얻은 이벤트 소스입니다.
*/

MouseEvent event = new MouseEvent(new Component() {}, 1, 1, 1,2 ,3,4,false);

실제 및 일반적인 상황에서는 MouseEvent 자체가 새로 생성될 필요가 없습니다. JAVA는 실행 시 하드웨어 마우스의 클릭 동작을 캡처하고 기본 가상 머신은 우리를 위한 인스턴스 객체(아래) 우리를 위해 이것을 분석할 것입니다. 그러나 지금은 먼저 시뮬레이션하고 있으므로 무작위로 새로운 객체가 나오는 것을 막지는 않습니다. new는 문제가 되지 않습니다. 문제의 핵심은 생성자 매개변수의 의미를 알아야 하며 핵심 핵심 매개변수는 첫 번째 매개변수인 new Component()입니다. 이것이 그 이벤트 소스입니다! 교사-학생 버전이 이벤트를 생성하는 위치를 다시 살펴보겠습니다.

public void setHomework(String homework) {

System.out.printf("%s 할당된 숙제 %s n", this.name, homework); add(homework); HomeworkEventObject event = new HomeworkEventObject(this); /*

~
*/(for (HomeworkListener Listener: HomeworkListenerList) {

Listener.Update (Event, Homework);

은 Teacher's business code setHomework에 있습니다. 그렇다면 우리가 작성하려는 현재 예제에서는 새 MouseEvent가 어디에 있습니까? Button의 비즈니스 코드에서 Button은 누구입니까? Button은 Teacher와 유사하지만 Teacher와 완전히 동일하지는 않습니다. Teacher에서는 Teacher 자체가 이벤트 소스이므로 HomeworkEventObject에 매개변수로 전달되며 Button을 사용할 수 없습니다. 매개변수는 MouseEvent에 전달됩니다. Button이 Component에서 상속받는 것을 원하지 않기 때문에 먼저 새 임시 Component를 만듭니다. 자, 분석 후 아마도 다음과 같은 자체 Button 코드가 나왔을 것입니다.

package com.zuikc.events;

import java.awt.AWTEvent;
import java.awt.AWTEventMulticaster;
import java. awt.Component;
import java.awt.event.MouseListener;
import java.awt.peer.LightweightPeer; addMouseListener(MouseListener l) {
          mouseListener = l;                                            사용 사용 사용 사용 using using           using using               off off     ‐                             to  MouseEvent 이벤트 = new MouseEvent(new Component() {}, 1, 1, 1,2,3,4,false);

      ~  


이 시점에서 명확한 클래스를 그릴 수 있습니다. 다이어그램을 살펴보겠습니다.




그런데 클라이언트 코드를 살펴보겠습니다.


public static void main(String[] args) {
ConcreteMouseListener Listener = new ConcreteMouseListener ();
Button button = new Button();
button.addMouseListener(listener);
button.doClick();

}

실행하면 다음과 유사한 출력이 표시됩니다.

JAVA 이벤트 처리 메커니즘에 대한 자세한 설명I was { com.zuikc.events. Button$1[,0,0,0x0,invalid]}클릭 MD가 가렵네요~~

둘째, 일반형 프로그램의 모습


위에서는 예제에 집중하려고 최선을 다했습니다 교사와 학생이 기본 버전의 마우스 이벤트를 작성했지만 프로그램의 원래 모습은 어떻습니까? 자, 다음에는 일반적인 프로그램을 작성해 보겠습니다. 99.9%의 사람들이 폼 프로그램을 작성할 때 이렇게 작성합니다. 여러분 중 몇몇이 와서 또 저를 꾸짖을 것이라는 것을 알고 있습니다. 뭐, 자바, 양식 프로그램? EE 개발과 기업 개발을 위해 JAVA를 배웠습니다. 이제 먼저 우리가 서로 상처를 입혀야 하는지에 대해 이야기해 보겠습니다. JAVA와 같은 NB도 처음에는 형식으로 성공을 거두었습니다. 게다가 JAVA의 양식 프레임워크는 여러 번 전복되고 다시 작성되었습니다. 따라서 양식의 이벤트와 EE의 프레임워크 이벤트는 양배추를 자르는 것과 같습니다.

비즈니스로 돌아가서 코드를 살펴보겠습니다.

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은 JFrame을 확장하여 MouseListener를 구현합니다. {

public DemoFrame () {

super ("데모");

this.setSize(500, 400);
this.setLocationRelativeTo(null);
this.getContentPane().setLayout(null);
this.setVisible(true);

JButton 버튼1 = 새 JButton("확인");
   button1.setBounds(8, 8, 80, 80);
  button1.addMouseListener(this);
  this.getContentPane().add(button1);
 }

public void mouseClicked(MouseEvent e) {

            System.out.printf("{%s}님이 클릭했는데 MD가 가려워 죽겠어요~~", e.getSource().toString());

                                                                 사용 사용 사용 사용 사용                                                                mouseClicked( public void mousePressed(MouseEvent e) {
}

  @Override
  public void 마우스 사용 출시됨(MouseEvent e) {
}

@Override
public void mouseEntered(MouseEvent e) {
}

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

이 코드는 무엇을 의미하나요? 가장 간단한 방법은 양식을 만들고 양식에 버튼을 배치한 다음 클릭하면 코드 줄이 실행되는 것입니다. 코드 줄이 많지 않은 이 간단한 파일은 실제로 위의 여러 클래스에서 구현된 기능을 구현합니다. 자, 분석하고 리스너, 이벤트 핸들러, 이벤트 및 이벤트 소스를 지적해 보겠습니다.

Listener: DemoFrame은 ConcreteMouseListener에 해당하는 리스너입니다.

Event 핸들러: MouseClicked 메서드는 리스너이고 ConcreteMouseListener에도 이 메서드가 있습니다.

Event: 볼 수 없습니다. 어떻게 해야 합니까?

이벤트 소스 : 안보이네요 어떡해요?

폼 자체에 리스너가 있다는 점에 유의하세요. 위 코드에서 버튼에 리스너를 추가하는 방법은 무엇인가요? Button1.addMouseListener(this); 예, 자신을 추가하세요.

그렇다면 이벤트도 이벤트 소스도 보이지 않습니다. 이때는 어떻게 해야 하나요? 출력을 보면 위 코드의 출력은 다음과 같습니다.

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]} 클릭했는데 MD가 가렵더라구요~~

찾아보기 , 위 코드의 첫 번째 부분의 출력과 유사하며 JButton 비즈니스 코드를 실행하는 동안 생성된 변수이기도 하지만 생성된 위치나 생성된 위치를 알 수 없습니다. 하지만 괜찮습니다. 디버그 스택을 살펴보겠습니다!

한걸음씩 쫓아가다 드디어 도착했습니다.

JAVA 이벤트 처리 메커니즘에 대한 자세한 설명

MouseEvent도 비즈니스 코드에서 새로운 기능임을 알 수 있습니다. 이 중요한 첫 번째 매개변수 대상이 걱정되시나요? 대상이지만 이벤트 소스도 매우 중요합니다. 이유는 매우 간단합니다. 공간 제한으로 인해 여기서는 새로 확장하지 않습니다.

이제 답을 완성했습니다.

이벤트: JAVA 런타임은 하드웨어 마우스 트리거를 캡처하여 이벤트 프로세서를 호출합니다. 이벤트 프로세서 내부에서 생성된 MouseEvent는 이벤트입니다.

이벤트 소스: JAVA 런타임 하드웨어 마우스 트리거는 다음과 같습니다. 캡처되어 이벤트 프로세서를 호출합니다. 이벤트 프로세서 내부에서 생성된 대상은 이벤트 소스입니다.

3: 위의 첫 번째 부분에 있는 코드의 일반 버전

두 번째 부분의 코드를 작성해 보겠습니다. 코드의 첫 번째 부분은 어떤 모습이어야 할까요?

1개와 2개를 함께 비교하면 한 곳의 코드는 두 번째 곳의 코드와 완전히 동일합니다.

1: ConcreteMouseListener의 이름을 DemoFrame으로 지정합니다. 클라이언트에 대한 버튼 인스턴스를 ConcreteMouseListener 안에 배치하세요.

좋아, 이벤트는 아주 간단합니다.

이 시리즈의 첫 번째 부분과 두 번째 부분은 각각 다음과 같습니다.

1: JAVA 이벤트 처리 메커니즘을 처음부터 이해하기(1)

2: JAVA 이벤트 처리 메커니즘을 처음부터 이해하기(2)

위 내용은 JAVA 이벤트 처리 메커니즘에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.