[Java] Window Programing - <Event>

● Event


1) 이벤트 소스(컴퍼넌트) : 이벤트가 발생한 위치


2) 이벤트 클래스(종류) : 이벤트 종류

java.util.EventObject    ->  자바 도큐먼스에서 확인

java.awt.AWTEvent


ActionEvent

- 컴퍼넌트가 활성화 될 때 발생하는 이벤트


AdjustmentEvent

- 스크롤바와 같이 조정 가능한 컴퍼넌트에서 조정이 일어날때 발생하는 이벤트


ComponentEvent

ContainerEvent

- 컨테이너에 컴퍼넌트가 추가/삭제되는 경우 발생하는 이벤트

FocusEvent

-컴퍼넌트에 포커스가 들어왔을 때 발생하는 이벤트

InputEvent

- KeyEvent

- MouseEvent

PaintEvent

- 컴퍼넌트가 다시 그려질 때 발생하는 이벤트

WindowEvent

- 윈도우가 활성화 또는 닫힐 때 발생하는 이벤트


ItemEvent

- 리스트, 초이스와 같이 선택항목이 존재하는 컴퍼넌트에서 선택항목이 선택될 때 발생하는 이벤트

TextEvent

- 텍스트 컴퍼넌트와 내용이 변화될 때 발생하는 이벤트


3) 이벤트 핸들러(처리, 리스너(listener) 인터페이스) : 이벤트 처리 

java.awt.event    -> 자바 도큐먼트에서 확인


4) 이벤트 소스와 핸들러의 연결

- 이벤트 소스.add이벤트클래스Listener(핸들러의 주소);


5) 이벤트 코드 처리 방식

- 이벤트 소스와 이벤트 핸들러가 같은 클래스인 경우

- 이벤트 소스와 이벤트 핸들러가 다른 클래스인 경우

- 이벤트 핸들러가 내부 클래스인 경우

- 이벤트 핸들러가 무명 클래스인 경우


무명클래스 : 인터페이스를 상속받는 별도의 구현체인(클래스= EventHandler)를 

만들지 않고 축약해서 만드는 방식


6) Adapter Class

- 인터페이스를 직접 상속받지 않고 중간에 미리 상속을 받아 오버라이딩된 클래스


자바 도큐먼트 ↓

https://docs.oracle.com/javase/9/docs/api/index.html?overview-summary.html



이벤트 소스와 이벤트 핸들러가 같은 클래스인 경우 예제


package event;


import java.awt.Button;

import java.awt.Color;

import java.awt.Frame;

import java.awt.TextArea;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


public class EventTest1 extends Frame implements ActionListener{

private Button btn1, btn2;

private TextArea ta;

EventTest1(){

btn1 = new Button("눌러주세요");

btn2 = new Button("종료");

ta = new TextArea();

add("North", btn1);

add("Center", ta);

add("South", btn2);

btn1.addActionListener(this);

btn2.addActionListener(this);

}

@Override

public void actionPerformed(ActionEvent arg0) {

//String cmd = arg0.getActionCommand(); //현재 이벤트 소스의 라벨값만 가져온다. 한정적 기능

Button btn = (Button)arg0.getSource(); // 버튼 객체의 모든 정보를 받아와서 버튼이 가지고있는 기능을 모두 사용가능

String cmd = btn.getLabel();

if(cmd.equals("눌러주세요")) {

btn.setBackground(Color.BLUE);

ta.setText(ta.getText()+"버튼이 눌렸어요\n");

}else {

dispose();

}

}



public static void main(String[] args) {

//이벤트 소스와 핸들러가 같은 클래스인 경우

EventTest1 test = new EventTest1();

test.setSize(300,400);

test.setVisible(true);

}

}


실행결과 ↓




이벤트 소스와 이벤트 핸들러가 다른 클래스인 경우 예제


 package event;


import java.awt.Button;

import java.awt.Color;

import java.awt.Frame;

import java.awt.TextArea;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;


class EventHandler implements ActionListener{

private TextArea ta; 

private Frame f;

//EventTest2에 있는 TextArea, Frame 값을 받기위해 변수생성과 

          생성자 생성으로 값을 받아온다.

EventHandler(TextArea ta, Frame f){

this.ta = ta;

this.f = f;

}

@Override

public void actionPerformed(ActionEvent arg0) {

String cmd = arg0.getActionCommand(); 

                //현재 이벤트 소스의 라벨값만 가져온다. 한정적 기능

if(cmd.equals("눌러주세요")) {

ta.setText(ta.getText()+"버튼이 눌렸어요\n");

}else {

f.dispose();

}

}

}


public class EventTest2 extends Frame {

private Button btn1, btn2;

private TextArea ta;

EventTest2(){

btn1 = new Button("눌러주세요");

btn2 = new Button("종료");

ta = new TextArea();

add("North", btn1);

add("Center", ta);

add("South", btn2);

EventHandler handler = new EventHandler(ta, this);

/* 다른 클래스에 있는 actionPerformed 메소드를 실행시키기위해

       인스턴스 생성해서 주소값을 넣어줘야 한다.

*/

btn1.addActionListener(handler);

btn2.addActionListener(handler);

}

public static void main(String[] args) {

//이벤트 소스와 핸들러가 다른 클래스인 경우

EventTest2 test = new EventTest2();

test.setSize(300,400);

test.setVisible(true);

}

}


실행결과 ↓





이벤트 핸들러가 내부 클래스인 경우 예제


package event;


import java.awt.Button;

import java.awt.Color;

import java.awt.Frame;

import java.awt.TextArea;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;



public class EventTest3 extends Frame {

private Button btn1, btn2;

private TextArea ta;

EventTest3(){

btn1 = new Button("눌러주세요");

btn2 = new Button("종료");

ta = new TextArea();

add("North", btn1);

add("Center", ta);

add("South", btn2);

EventHandler handler = new EventHandler();

btn1.addActionListener(handler);

btn2.addActionListener(handler);

}

class EventHandler implements ActionListener{

@Override

public void actionPerformed(ActionEvent arg0) {

String cmd = arg0.getActionCommand(); 

if(cmd.equals("눌러주세요")) {

ta.setText(ta.getText()+"버튼이 눌렸어요\n");

}else {

dispose();

}

}

}


public static void main(String[] args) {

/*

* 이벤트 소스와 핸들러가 내부 클래스인 경우

* 내부 클래스는 외부클래스에 있는 자원을 사용할 수 있다  

* 외부클래스 자원사용가능으로 인해 생성자, 변수 등을 따로 만들지 않아서                    코드가 간단해진다.

*/

EventTest3 test = new EventTest3();

test.setSize(300,400);

test.setVisible(true);

}

}



실행결과 ↓






이벤트 핸들러가 무명 클래스인 경우 예제


 package event;


import java.awt.Button;

import java.awt.Frame;

import java.awt.TextArea;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;



public class EventTest4 extends Frame {

private Button btn1, btn2;

private TextArea ta;

EventTest4(){

btn1 = new Button("눌러주세요");

btn2 = new Button("종료");

ta = new TextArea();

add("North", btn1);

add("Center", ta);

add("South", btn2);

ActionListener listen = new ActionListener() {

//class EventHandler implements ActionListener를 축약한 내용이다.


@Override

public void actionPerformed(ActionEvent arg0) {

String cmd = arg0.getActionCommand(); 

if(cmd.equals("눌러주세요")) {

ta.setText(ta.getText()+"버튼이 눌렸어요\n");

}else {

dispose();

}

}; 

btn1.addActionListener(listen);

btn2.addActionListener(listen);

}


public static void main(String[] args) {

/*

* 이벤트 소스와 핸들러가 무명 클래스인 경우

* 무명클래스 -> 클래스를 만들고 인스턴스까지 축약해서 만들어버린다.

                * 즉석으로 한번만 필요할 경우 사용한다.

                * 무명클래스 제약 : 이름이 없기에 생성자를 만들수가 없어서 인자값을

                *                         받아올수가 없다. 

*/

EventTest4 test = new EventTest4();

test.setSize(300,400);

test.setVisible(true);

}

}



실행결과 ↓





Adapter Class 예제


package event;


import java.awt.Button;

import java.awt.Frame;

import java.awt.TextField;

import java.awt.event.WindowAdapter;

import java.awt.event.WindowEvent;

import java.awt.event.WindowListener;


class WindowExit extends WindowAdapter{

//Adapter 클래스는 쓸데없는 오버라이딩을 받지 않기 위해 사용

private Frame f;

WindowExit(Frame f){

this.f = f;

}


@Override

public void windowClosing(WindowEvent arg0) {

f.dispose(); 

//dispose는 frame에서 상속받아서 사용하기 때문에 주소값 받아와야한다.

}

}


public class AdapterTest2 extends Frame {

private TextField tf;

private Button btnExit;

public AdapterTest2() {

tf = new TextField("x버튼을 누르면 종료합니다."); 

btnExit = new Button("종료");

add("North", tf);

add("Center", btnExit);

addWindowListener(new WindowExit(this));

}

public static void main(String[] args) {

AdapterTest2 test = new AdapterTest2();

test.setSize(300,400);

test.setVisible(true);

}

}



실행결과 ↓



오른쪽 상단의 X를 누르면 종료된다.


'BACKEND > Java' 카테고리의 다른 글

[Java] Window Programming - <Menu>  (0) 2017.11.07
[Java] ItemEvent/TextEvent 예제  (0) 2017.11.07
[Java] Window Programming - <Layout>  (0) 2017.11.06
[Java] Window Programming  (0) 2017.11.06
[Java] IO 예제  (0) 2017.11.02

댓글

Designed by JB FACTORY