12 분 소요

👨‍💻🏫KNU 2021-2 SW & media 자바실무 필기노트 3

1. 이벤트 기반 프로그래밍

이벤트의 종류

  • 사용자의 입력,네트위크데이터 송수신
  • 응용프로그램으로부터의 피드백

이벤트의 사용방식

  • 실행 타이밍이 이벤트의 발생으로 인해 트리거됨
  • 이벤트 발생시 이벤트 처리 루틴 실행

이벤트 기반 프로그램의 구조

  • 이벤트 처리루틴인 이벤트리스너의 집합이다.

이벤트 처리순서

  • 이벤트발생 -> 이벤트객체생성 -> 이벤트리스너호출 -> 이벤트리스너실행
이벤트기반 응용프로그램의 계층도  
이벤트 리스너  
이벤트분배스레드 응용프로그램↑
JVM  
OS  
하드웨어  
실제 발생한 행위 —————↑
  • 소스: 이벤트를 발생시키는 컴포넌트로 AWTEvent로부터 상속된다
  • 객체: 발생 이벤트에 대한 정보(종류,소스,좌표,입력횟수,체크상태…등)
  • 리스너: 클래스형의 이벤트 처리코드로 컴포넌트로부터 상속됨
  • 분배스레드: JVM으로부터 소스와 종류를 결정하여 객체생성 및 호출

2.이벤트 리스너 작성 과정

  1. 이벤트와 이벤트 리스너 선택
  2. 이벤트 리스너 클래스 작성
  3. 이벤트 리스너 등록

3.이벤트 리스너 작성 방법

  1. 독립 클래스로 작성
    완전한 클래스로 작성. 여러 곳에서 사용할 때 적합.
  2. 내부 클래스로 작성
    클래스 내에 멤버처럼 클래스를 작성하는 방식이다. 특정 클래스내에서만 구동될때 적합
  3. 익명 클래스로 작성
    클래스명없이 작성되며 간단한 코드에 적합. C++에서 함수 인자로 함수가 있다고 보면된다.(클래스 작성과 인스턴스 생성을 동시에)

예제 1. 독립 클래스로 Action 이벤트의 리스너 작성

// 독립된 클래스로 이벤트 리스너를 작성한다.(추상 애드온)
class MyActionListener implements ActionListener {
	public void actionPerformed(ActionEvent e) {
		JButton b = (JButton)e.getSource(); // 이벤트 소스 버튼 알아내기
		if(b.getText().equals("Action")) // 버튼의 문자열이 "Action"인지 비교
			b.setText("액션"); // 버튼의 문자열을 "액션"으로 변경
		else
			b.setText("Action"); // 버튼의 문자열을 "Action"으로 변경
	}
}

예제 2. 내부 클래스로 Action 이벤트의 리스너 작성

private class MyActionListener// 내부 클래스로 Action 리스너를 작성한다. 
implements ActionListener 
{
	public void actionPerformed(ActionEvent e) {
		JButton b = (JButton)e.getSource();
		if(b.getText().equals("Action")) 
			b.setText("액션");
		else 
			b.setText("Action");
		
		// InnerClassListener의 멤버나 JFrame의 멤버를 호출할 수 있음
		InnerClassListener.this.setTitle(b.getText()); // 프레임의 타이틀에 버튼 문자열을 출력한다. 
	}
}

예제 3. 익명 클래스로 Action 이벤트의 리스너 작성

btn.addActionListener(new ActionListener() {//버튼의 인자부분에 작성
	public void actionPerformed(ActionEvent e) {
		JButton b = (JButton)e.getSource();
		if(b.getText().equals("Action")) 
			b.setText("액션");
		else 
			b.setText("Action");
		// AnonymousClassListener의 멤버나 JFrame의 멤버를 호출할 수 있음
		setTitle(b.getText());
	}
});

4. 리스너인터페이스 사용법

4.1 키 이벤트 리스너 등록과 키 리스너 사용

이벤트리스너 등록

component.addKeyListener(new myKeyListener())

키 리스너의 메소드 유형

void keyPressed(KeyEvent e){//}
void keyTyped(KeyEvent e){//유니코드에서만 적용되며 ctrl과 같은 제어키는 패스}
void keyRelesed(KeyEvent e){//}

이벤트 객체

int getKeyCode() //문자코드(유니코드) 리턴
char getKeyChar() //모든키에대해 작동하며 가상키 값을 리턴
string getKeyText(int keycode) //stctic메소드로 키코드에 해당되는 키 이름 문자열 리턴

가상키(VirtualKey;VK):

유니코드를 포함해 모든키에는 가상키가 적용된다. 이 값으로 어떤키가 입력되었는지를 알 수 있다.

예제 4. 좌,우측버튼 입력받기

/*생략*/
label.addKeyListener(new KeyAdapter() {
	@Override
	public void keyPressed(KeyEvent e) {//좌,우측버튼 눌릴때 현재 텍스트를 거꾸로 표시한다
		if(e.getKeyCode() == KeyEvent.VK_LEFT) {
			JLabel la = (JLabel)e.getSource();
			StringBuffer text  = new StringBuffer(la.getText());
			la.setText(text.reverse().toString());
		}
		if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
			JLabel la = (JLabel)e.getSource();
			StringBuffer text  = new StringBuffer(la.getText());
			la.setText(text.reverse().toString());
		}
	}
	@Override
	public void keyReleased(KeyEvent e) {//좌,우측버튼의 입력 끝날때 텍스트를 바꾼다.
		if(d.getKeyCode() == KeyEvent.VK_LEFT) {
			JLabel la = (JLabel)e.getSource();
			StringBuffer text  = new StringBuffer(la.getText());
			la.setText("LEFT KEY PRESSED");
		}
		if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
			JLabel la = (JLabel)e.getSource();
			StringBuffer text  = new StringBuffer(la.getText());
			la.setText("RIGHT KEY PRESSED");
		}
	}
});
/*생략*/

4.2 마우스 이벤트 리스너 등록과 마우스 리스너 사용

이벤트리스너 등록

MouseListener listener= new MyMouseListener();
component.addMouseListener(listener);
component.addMotionListener(listener);

위치 관련 메소드(마우스리스너)

void mouseEntered(KeyEvent e){//컴포넌트위에 올라갈때}
void mouseExited(KeyEvent e){//컴포넌트에서 내려올때}

클릭 관련 메소드(마우스리스너)

void mousePressed(KeyEvent e){//버튼이 눌렸을때}
void mouseRelesed(KeyEvent e){//눌린 버튼이 떼어질때}
void mouseClicked(KeyEvent e){//클릭하였을떄}

드래그 관련 메소드(마우스모션리스너)

void mousePressed(KeyEvent e){//}
void mouseMoved(KeyEvent e){//마우스 이동하는 동안}
void mouseDragged(KeyEvent e){//드래그되는 동안}
void mouseRelesed(KeyEvent e){//}

이벤트 객체

int getX(), int getY(), point getPoint() //x,y,위치(x,y)
int getButtion() //입력된 마우스버튼 MouseEvent.BUTTONn(좌:1,중:2,우:3)
int getClickCount() //클릭횟수

예제 5. 마우스 (모션) 리스너 사용해보기

/*생략*/
MyMouseListener ml = new MyMouseListener();
c.addMouseMotionListener(ml);
c.addMouseListener(ml);
label.addMouseListener(new MouseAdapter(){
	@Override public void mouseEntered(MouseEvent e){
	 JLabel la = (JLabel)e.getSource();
	 label.setForeground(Color.RED);
	 la.setText("Entered"); //마우스가 라벨을 가르키면 "Entered"
	}
	@Override public void mouseExited(MouseEvent e){
	 JLabel la = (JLabel)e.getSource();
	 label.setForeground(Color.RED);
	 la.setText("Exited"); //마우스가 라벨을 안 가르키면 "Exited"
	}
});
/*생략*/
class MyMouseListener extends MouseAdapter{
	@Override public void mouseDragged(MouseEvent e){
		JComponent c = (JComponent)e.getSource();
		c.setBackground(Color.YELLOW); //마우스 드래깅시 배경색 노랑색
	}
	@Override public void mouseReleased(MouseEvent e){
		JComponent c = (JComponent)e.getSource();
		c.setBackground(Color.GREEN); //마우스 드래깅 아닐시 배경색 초록색
	}
}

5. 어댑터 클래스

이벤트 리스너 작성시 모든 추상 메소드를 구현해야하는 부담이있기에 모든 메소드가 단순 리턴하도록 구현된 클래스인 어댑터 클래스를 사용할수있다. 추상 메소드가 하나뿐인 리스너에는 어댑터클래스가 없다.

리스너사용

contentPane.addMouseListener(new MyMouseListner());
/**/
class MyMouseListner implements MouseListner{//모든 메소드}

어댑터사용


contentPane.addMouseListener(new MyMouseAdapter());
/**/
class MyMouseListner extends MouseAdapter{//메소드 생략가능}

6. 키 이벤트와 포커스

포커스란 컴포넌트나 응용프로그램이 키 이벤트를 독점하는 권한으로 키 이벤트를 받을수있는 조건이다. 포커스를 위해서는 다음의 코드가 필요하다.

스윙프레임이 만들어질때 포커싱

component.setFoucusable(true);//컴포넌트가 포커스를 받을수있도록 변경
component.requestFocus();//컴포넌트에 강제 포커스 지정

컴포넌트를 클릭할때 포커싱

component.addMouseListener(new MouseAdapter() { 
	public void mouseClicked(MouseEvent e) {
		Component component = (Component)e.getSource(); //컴포넌트가 클릭될때
		component.setFocusable(true);
		component.requestFocus(); //컴포넌트에 강제 포커스 지정
	}
});

태그:

카테고리:

업데이트:

댓글남기기