JAVA) 이벤트 구동 프로그래밍
Computer Science/Java

JAVA) 이벤트 구동 프로그래밍

https://coding-factory.tistory.com/262 님 게시글 참고.

인하대학교 임광수 교수님의 수업과 자료 참고.

 

#이벤트의 개념과 처리 과정

     => 윈도우 프로그래밍에서 어떤 특정한 행동이 발생한 그 자체를 의미한다.

       메뉴를 선택했다던가, 마우스를 클릭하거나, 윈도우의 크기를 조절하는 등의 행위를 뜻한다.

   

이벤트 소스는 이벤트가 발생할수 있는 대상을 의미하고, 그 대상으로부터 이벤트가 발생하면 발생된 이벤트를 처리해서 결과를 낼 수 있도록 해주는 것을 이벤트 핸들러라고 한다.

 

#자바에서의 이벤트 처리

 

   1. 프로그램이 실행 중에 os가 해당 프로그램에서 이벤트가 발생하는지를 검사한다.

   2. 이벤트가 발생되면 운영체제가 jvm 에게 이벤트를 전달하고, jvm은 발생된 이벤트를 처리하기 위하여

     이벤트 객체를 생성한다. 

   3. 이벤트를 처리하기 위해서 이벤트 객체를 가지고 핸들러를 호출한다.

 

 

# 자바 이벤트 3대 속성 (이벤트 소스, 이벤트 리스너, 이벤트 핸들러)

   1. 이벤트 소스

: 이벤트가 발생되는 컴포넌트를 말한다. 버튼, 체크박스, 리스트, 프레임, 마우스와 같은 컴포넌트들을 일컫는다.

 

  2, 이벤트 리스너

   이벤트 소스에서 이벤트가 발생하는지를 검사하고 있다가 이벤트가 발생이 되면 실제적으로 이벤트를 처리할 수 있도록 만든 인터페이스이다.

 

  3. 이벤트 핸들러

:  이벤트 리스너에 전달된 이벤트를 실제로 처리할수 있도록 이벤트 리스너에 포함되어있는 메서드로 발생된 이벤트 객체를 받아와서 실제로 처리해주는 기능을 가지고 있다.

 

 

#이벤트 클래스 소개

  : 이벤트 클래스는 이벤트 처리에 필요한 많은 정보를 제공한다. 예를 들어 클릭 여부, 클릭된 컴포넌트, 클릭된

 

 

 

  #이벤트 클래스의 종류

    1) 의미 이벤트

  - 버튼 클릭처럼 사용자가 의도하는 이벤트를 의미한다.

  - 일부 스윙 컴포넌트에서만 발생한다.

 : actionevent, adjustmentevent, itemevent, textevent

   

  2) 저수준 이벤트

  - 의미 이벤트를 가능하게 하는 이벤트를 의미한다.

   ( 의미 이벤터인 버튼 클릭은 마우스 누름, 마우스 놓기, 마우스 움직임 등의 여러가지 세부적인 이벤트로 구성)

  : Componentevent, containerevent, focusevent, mouseevent, keyevent.. etc

 

  #주요 이벤트의 메소드와 상수

     ex) EventObject

    object getSource() : 발생된 이벤트를 반환한다. 반환 타입이 object이므로 사용시 타입 변환이 필요하다.

   

  # 이벤트 리스너의 소개 

      : 이벤트 소스- 이벤트- 이벤트 리스너의 순으로 소개.

   

   1. 버튼, 리스트, 메뉴 아이템, 텍스트 필드

    : ActionEvent- ActionListener

     

    2. 컴포넌트

    : KeyEvent- Keylistener, Mouseevent- MouseListener, MousemotionListener

 

    : 주요 리스너 인터페이스와 추상 메소드

 

 

   #이벤트 리스너의 소개

   : 이벤트 소스에 이벤트 리스너를 등록해야 한다.   

   ex) b.addMouseListener()

 

 : 이벤트 리스너는 매우 빠르게 처리되도록 가능한 짧게 작성될 필요가 있다.

 : 이벤트 리스너가 하나의 스레드로 과다한 작업을 수행한다면 프로그램이 반응하지 않을 수도 있다.

 : 이벤트 처리 시간이 길다면 별도에 스레드에 맡기는 것이 좋다.

 

 

 

    + Itemevent

  : 어떤 아이템이 선택되었는지 아닌지에 대한 이벤트이다.

   아이템을 사용하는 컴포넌트로는 checkbox, list, choice 등이 있다. itemListener 인터페이스로 구현하면된다. 

JCombobox를 구현할때 addItemListener를 사용해보았다.

 

 

#Listener vs Adapter

  1. listener

 : listener 는 자체적으로 메소드의 내용을 가지고 있지 않은 인터페이스이다.

 : 인터페이스를 다른 클래스에 구현하게 되면 listener가 가지고 있는 모든 추상메소드를 완성해야 한다.

 

  2. Adapter

  : 모든 추상메소드를 구현해야 하는 불편한 점을 해결하기 위해 listener를 클래스로 변형한 형태

  : adapter는 클래스이므로 필요한 메소드만 재정의해서 사용하면 된다.

 

 

#메뉴와 구성

   메뉴를 만드는 클래스는 네가지 정도로 이루어져있다.

 : JMenu, JMenuBar, JSeperator, JMenuItem

 

 

   -> 메뉴 구성 순서

  1) 메뉴바를 생성한다  => JMenuBar mb= JMenuBar();

  2) 메뉴바에 메뉴를 추가한다.  => JMenu menu= new JMenu("File"); mb.add(menu);

  3) 메뉴들에 각가의 항목을 추가한다. => JMenuItem item= new JMenuItem("New File"); menu.add(item);

  4) 메뉴바를 프레임에 부착한다. => frame.setJMenuBar(mb);

 

 

#그래픽 요소

    -그래픽 주체: 그림을 그리도록 프로그래밍하는 개발자 혹은 jvm

    -그래픽 도구: 펜 , 붓 , 팔레트, 폰트 드을 의미한다. 자바는 Graphics 클래스로 그리기, 칠하기, 이미지 출력하기, 클리핑등 프로그래밍에 필요한 모든 필드와 메소드를 제공한다.

   - 그래픽 대상: 그림을 그릴수 있는 도화지를 의미한다.=> 자바의 모든 컴포넌트, 이미지 등이 그래픽의 대상이다.

 

 

 # 그래픽 컨텍스트 

: 그래픽 객체를 그리는데 필요한 정보(필요한 도구를 제공하는 객체)

 : graphics 클래스는 자바에서 그리기 작업을 할 때 필요한 도구로, awt 뿐만아니라 스윙에서도 사용한다.

 : 자바에서는 색상 선택, 문자열 그리기, 도형 그리기, 도형 칠하기, 이미지 그리기, 클리핑 등을 지원한다.

 

 

 

1. color 클래스

   :color.(색상명)으로 사용한다.

  ex) b. setbackground(Color.BLACK)=> 뒷배경 색상 변경 , b.setForeground(Color.RED)=> 글자 색 변경

   color.getRED() 등을 사용하면 현재 사용하고 있는 배경의 색상을 가져올 수 있다=> 테트리스에 응용!

 

2. Font 클래스

=> 우선 폰트 객체를 폰트, 글자 형태, 글자 크기로 만들어서 생성한후, 컴포넌트 등에 적용해줄 수 있다.

: Font f1= new Font("Dialog",Font.PLAIN,22);

  g.setFont(f1); 

 

3. 도형 그리기

  : 직선, 사각형, 타원, 호 등등을 각각 그려볼 수 있다.

 

 

4. 이미지 그리기

   1) 주요 클래스

  : java.awt.image 클래스: 그래픽 이미지를 사각형 픽셀 이미지로 표현한다.

  : java.awt.image.BufferedImage 클래스: Image의 자식 클래스로 애플리케이션 BufferedImage 객체를 생성할 수 있고,

 이미지 데이터도 조작 가능하다.

 

  2) 클리핑

 : 실제 이미지의 필요한 부분을 꺼내기 위해 잘라내는 것이다.

 : 클리핑은 graphics 클래스로 그리기를 할 때 지정된 특정 부분만 보이도록 한다.

 : 클리핑을 위한 사각형 영역을 클리핑 영역이라고 부른다.

 : 영역을 따로 설정하지 않으면 컴포넌트의 전체 영역이 클리핑 영역이다.

 

 

 

#스윙의 그리기 과정

 : 스윙 컴포넌트는 모두 JComponent 클래스의 자식 객체로 JComponent 클래스의 paintComponent()

메소드를 호출해서 그린다.

 : paintComponent() 메소드는 직접 호출할 수 없고, jvm이 호출하는 콜백 메소드이다.

 

 

  - Swing에서 painting이 되는 과정

   : 컨테이너는 자신을 그린 후 그 위에 자식 컴포넌트에게 그리기를 지시한다.

  : 모든 스윙 컴포넌트는 자신의 모양을 그리는 paintComponent() 메소드를 보유한다.

 

  #Public void paintComponent(Graphics g)

  => 스윙 컴포넌트가 자신의 모양을 그리는 메소드이며, 모든 스윙 컴포넌트가 이 메소드를 오버라이딩한다..

  : 언제 호출되는가?

   => 컴포넌트가 그려져야 하는 시점마다, 크기, 위치가 변경되거나 컴포넌트가 다시 나타나는 부분.

 

 

#paintcomponent의 오버라이딩

 : jcomponent를 상속받아 새로운 컴포넌트를 설계하거나, 기존 컴포넌트의 모양에 변화를 주고자 할 때 사용한다.

'Computer Science > Java' 카테고리의 다른 글

본격 JVM 해부하기  (0) 2022.11.24
JAVA) 스레드  (0) 2019.12.09
Java -GUI 프로그래밍  (0) 2019.12.05
Java) 입출력 스트림- 11주차 수업  (0) 2019.12.03