• 검색 결과가 없습니다.

1. 이벤트 처리 개요

N/A
N/A
Protected

Academic year: 2022

Share "1. 이벤트 처리 개요"

Copied!
65
0
0

로드 중.... (전체 텍스트 보기)

전체 글

(1)

이벤트 처리와 


그래픽 프로그래밍

(2)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 처리 개념을 이해하고 관련 클래스와 리스너를 활용할 수 있다.

• 이벤트 처리 개요와 관련 클래스

• 이벤트 객체와 이벤트 리스너

• 스윙의 주요 클래스와 계층구조

이벤트 처리를 위한 다양한 프로그래밍을 할 수 있다.

• 버튼의 이벤트 프로그래밍, • 마우스의 이벤트 프로그래밍

• 이벤트 리스너의 구현

이벤트 처리에서 어댑터 클래스의 필요성을 이해하고 프로그래밍에 활용할 수 있다.

• 어댑터 클래스의 필요성과 주요 어댑터 클래스

다양한 콤포넌트에서 이벤트 처리 프로그래밍을 할 수 있다.

• 콤포넌트, 아이템 이벤트 처리, • 콘테이너, 포커스 이벤트 처리

그래픽 프로그래밍 개요를 이해하고 글자와 이미지 처리 프로그래밍을 할 수 있다.

• 그래픽 프로그래밍을 이해하고 색상과 문자열, 직선과 사각형 그리기

• 글자를 위한 폰트 처리와 이미지 처리

2

(3)

단원 10 이벤트 처리와 그래픽 프로그래밍 3

1. 이벤트 처리 개요

(4)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 개요와 이벤트 처리

❖ 이벤트

컴포넌트는 적절한 이벤트(event)를 통하여 사용자 또는 시스템과 대화

예를 들어 하나의 컴포넌트 위에서 마우스를 클릭

이에 대한 반응으로 이 컴포넌트는 마우스 클릭에 대한 이벤트가 발생

❖ 이벤트 소스

사용자나 시스템 이벤트를 발생시킨 진원지

❖ 이벤트 리스너

이벤트를 수용(listen)하는 개체

특정한 이벤트 정보는 인터페이스인 이벤트 리스너(event listener)의 메소드로 전달

4

(5)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 처리 구현 개념

❖ 자바의 이벤트를 처리

[절차 1: 이벤트 리스너 구현]

이벤트 리스너를 상속받아 필요한 메소드의 구현

[절차 2: 이벤트 리스너 등록]

이벤트를 받는 컴포넌트에서 이벤트 리스너를 등록

5

(6)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 클래스

❖ 다양한 이벤트 종류

액션이벤트(ActionEvent)와 마우스이벤트(MouseEvent) 등

사용자의 특정한 행동에 대응하는 다양한 이벤트를 제공

6

(7)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 계층 구조

❖ 이벤트 관련 최상위 클래스인 EventObject

이벤트를 발생한 객체를 반환하는 getSource() 메소드를 제공

7

(8)

단원 10 이벤트 처리와 그래픽 프로그래밍

컴포넌트와 발생 가능한 이벤트 객체

❖ 다양한 이벤트 종류 중에서 어느 이벤트를 인지하여 처리할 수 있는지 정리한 표

8

(9)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 리스너 개요

❖ 이벤트 리스너

발생한 이벤트를 받아 호출되는 추상 메소드가 있는 인터페이스

MouseListener 소스

9

(10)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 리스너 계층 구조

❖ 이벤트 리스너

패키지 java.awt.event에 소속된 최상위 인터페이스인 EventListener를 상속

10

(11)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 리스너의 추상 메소드

❖ 인터페이스인 이벤트 리스너

특정한 이벤트에 따라 구현해야 할 메소드가 추상 메소드로 정의

11

(12)

단원 10 이벤트 처리와 그래픽 프로그래밍 12

2. 이벤트 처리 프로그래밍 기초

(13)

단원 10 이벤트 처리와 그래픽 프로그래밍

첫 이벤트 프로그래밍

❖ 이벤트 처리를 위해서는 다음 두 단계의 처리가 반드시 필요

[절차 1: 이벤트 리스너 구현]

이벤트 리스너를 상속받아 필요한 메소드의 구현

버튼에 대한 액션이벤트 처리를 위하여 ActionListener를 구현

[절차 2: 이벤트 리스너 등록]

이벤트를 받는 컴포넌트에서 이벤트 리스너를 등록

버튼 객체는 버튼객체.addActionListener(리스너구현객체) 메소드 호출

13

(14)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 리스너의 구현과 이벤트 리스너 등록

❖ 이벤트 리스너 구현

주 윈도우 클래스 ButtonActionWin

인터페이스 ActionListener를 상속받아 추상 메소드인 actionPerformed(…)를 구 현해야

❖ 이벤트 리스너 등록

이벤트를 받는 버튼 btnOk, btnCancel 객체

메소드 addActionListener(리스너가구현된객체)를 이용

14

(15)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-1

15 import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

  import javax.swing.JFrame;

import javax.swing.JPanel;

import javax.swing.JButton;

import javax.swing.JLabel;

  import java.awt.BorderLayout;

import java.awt.GridLayout;

 

public class ButtonActionWin extends JFrame implements ActionListener {

private static final long serialVersionUID = 1L;

JButton btnOk = new JButton("OK");

JButton btnCancel = new JButton("Cancel");

JLabel dLb = new JLabel("클릭한 버튼의 제목이 보입니다.");

 

public ButtonActionWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(300, 130);

//윈도 구성과 버튼의 이벤트 리스너 추가 makeButtonAndEventHandle();

setVisible(true);

}  

public void makeButtonAndEventHandle() {

JPanel p = new JPanel(new GridLayout(0, 2));

p.add(btnOk);

p.add(btnCancel);

add(p, BorderLayout.CENTER);

add(dLb, BorderLayout.SOUTH);

//2개 버튼의 이벤트 처리를 위해 리스너를 추가 btnOk.addActionListener(this);

btnCancel.addActionListener(this);

}  

public void actionPerformed(ActionEvent evt) { //클릭된 버튼의 이름을 저장

String strCmd = evt.getActionCommand();

// 레이블에 클릭된 버튼의 이름을 지정 if (strCmd.equals("OK")) {

dLb.setText(" OK Button");

} else if (strCmd.equals("Cancel")) { dLb.setText(" Cancel Button");

} }  

public static void main(String[] args) { ButtonActionWin myWin = new

ButtonActionWin();

myWin.setTitle("버튼 액션 이벤트 처리");

} }

(16)

단원 10 이벤트 처리와 그래픽 프로그래밍

마우스의 누름과 놓음 처리

❖ 프레임 내부에서 마우스를 누른(press)후 다시 놓는(release) 이벤트 처리를 구현

16

(17)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-2

17

import java.awt.*;

import java.awt.event.*;

 

import javax.swing.JFrame;

 

public class MouseEventWin extends JFrame {

private static final long serialVersionUID = 1L;

MouseEventWin childWin = null;

static int countChild;

public MouseEventWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(400, 150);

setVisible(true);

//register mouse event handler, motion event handler

addMouseListener(new MyMouseListener());

}

class MyMouseListener implements MouseListener {

public void mousePressed(MouseEvent e) { Rectangle bounds = getBounds();

int x = e.getX() + bounds.x;

int y = e.getY() + bounds.y;

if (childWin == null)

(18)

단원 10 이벤트 처리와 그래픽 프로그래밍

MouseListenr 와 MouseEvent

❖ MouseListenr 의 메소드

❖ MouseEvent 의 변수와 메소드

18

(19)

단원 10 이벤트 처리와 그래픽 프로그래밍

MouseMotionListener

마우스 이동(move)과 드래그(drag)에 대한 이벤트를 처리하는 리스너

마우스의 클릭과 이동에 대한 이벤트 처리

▪ MouseListener, MouseMotionListener를 상속받아 7개의 메소드를 모두 구현

▪ 또는 간단히 리스너 MouseInputListener 하나를 상속받아 구현

19

(20)

단원 10 이벤트 처리와 그래픽 프로그래밍

마우스 이벤트 예제를 위한 화면 구성

❖ 레이블인 s1, s2, s3

각각 Pressed/Released 와 Entered/Exited/

Clicked 그리고

Dragged/Moved 정보 를 출력

20

(21)

단원 10 이벤트 처리와 그래픽 프로그래밍

마우스 이벤트를 위한 7가지 메소드 구현

❖ 이벤트 구현을 위한 내부 클래스 MyMouseListener

MouseListener의 5가지 메소드와 MouseMotionListener의 2가지 메소드를 구 현

21

(22)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 리스너 4가지 구현 방법

이벤트 리스너를 구현하는 4가지 방법

▪ [방법 1: 일반 구현]

원도우 구현 클래스에서 인터페이스 이벤트 리스 너를 상속받아 구현

▪ [ 방법 2: 내부 구현]

원도우 내부에서 내부 클 래스로 인터페이스 이벤 트 리스너를 구현

▪ [ 방법 3: 익명 구현]

이벤트 리스너 등록 시 익명의 클래스로 리스너 를 직접 구현

▪ [ 방법 4: 외부 구현]

외부의 새로운 클래스로 인터페이스 이벤트 리스 너를 구현

22

(23)

단원 10 이벤트 처리와 그래픽 프로그래밍

버튼 클릭 이벤트 처리

❖ 4 가지 방식으로 모두 구현

버튼의 ActionEvent에 대한 이벤트 처리

❖ 기능

윈도 전체에 버튼을 하나 구성

버튼을 누르면 윈도우 캡션에 버튼이름과 버튼을 클릭한 횟수 표시

23

(24)

단원 10 이벤트 처리와 그래픽 프로그래밍

일반 구현과 내부 구현

24

(25)

단원 10 이벤트 처리와 그래픽 프로그래밍

익명 구현과 외부 구현

25

(26)

단원 10 이벤트 처리와 그래픽 프로그래밍 26

3. 어댑터 클래스

(27)

단원 10 이벤트 처리와 그래픽 프로그래밍

어댑터 클래스 개요

어댑터 클래스 필요성

▪ MouseListener와 MouseMotionListener의 메소드는 각각 5개와 2개

▪ 7개의 메소드 중에서 처리할 메소드가 총 3개라도

나머지 필요 없는 메소드도 아무 문장 없이 구현해야 하는 번거로움이 발생

▪ 이러한 불편을 제거하기 위해

어댑터 클래스는 리스너의 메소드를 구현 선언한 후 아무 문장이 없는 메소드를 미리 구현해 놓은 클 래스

27

(28)

단원 10 이벤트 처리와 그래픽 프로그래밍

주요 어댑터 클래스

28

(29)

단원 10 이벤트 처리와 그래픽 프로그래밍

어댑터 클래스를 사용한 마우스 이동 구현

❖ 마우스 이동에 대한 이벤트만을 처리

MouseAdapter 또는 MouseMotionAdapter로부터의 상속을 선언

필요한 메소드인 mouseMoved()만을 구현

29

(30)

단원 10 이벤트 처리와 그래픽 프로그래밍 30

4. 다양한 이벤트 처리

(31)

단원 10 이벤트 처리와 그래픽 프로그래밍

컴포넌트의 다양한 변화에 따른 이벤트

컴포넌트 이벤트

컴포넌트의 컴포넌트의 보임, 사라짐, 이동, 크기의 변화에 따라 발생

▪ JMenuItem과 JCheckBoxMenuItem을 제외한 대부분의 컴포넌트에서 발생

클래스 ComponentEvent

▪ ComponentEvent의 메소드 getComponent()

이벤트를 발생시킨 컴포넌트를 반환

31

(32)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-5

❖ 윈도우를 구성하는 텍스트 영역의 크기가 변하면

컴포넌트 이벤트 발생 결과를 텍스트 영역에 표시

32 import java.awt.event.ComponentAdapter;

import java.awt.event.ComponentEvent;

 

import javax.swing.JFrame;

import javax.swing.JTextArea;

 

public class ComponentEventWin extends JFrame {

private static final long serialVersionUID = 1L;

JTextArea txtArea = new JTextArea();

class MyComponentAdapter extends ComponentAdapter { public void componentResized(ComponentEvent evt) {

String str = evt.getSource().getClass() + " 콤 포넌트 크기 재조정: ";

str += evt.getComponent().getBounds() + "\n";

txtArea.append(str);

} }

public ComponentEventWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(600, 150);

add(txtArea, "Center");

txtArea.addComponentListener(new MyComponentAdapter());

setVisible(true);

}  

public static void main(String[] args) {

ComponentEventWin myWin = new ComponentEventWin();

myWin.setTitle("콤포넌트 이벤트 처리");

} }

(33)

단원 10 이벤트 처리와 그래픽 프로그래밍

ItemEvent

ItemEvent를 발생시키는 컴포넌트

JCheckBox, JList, JComboBox, JCheckBox, MenuItem 등

▪ ItemEvent를 처리하려면 인터페이스 ItemSelectable을 상속받아 구현

▪ 컴포넌트 자체나 또는 컴포넌트를 구성하는 항목이 on/off 또는 selected/deselected 등의 이원화된 상태를 갖는 특성

ItemListener 메소드

ItemEvent의 상수와 메소드

33

(34)

단원 10 이벤트 처리와 그래픽 프로그래밍

JCheckBoxMenuItem 에서 이벤트 처리

❖ 메뉴 구성을 위한 컴포넌트는 JMenu와 JCheckBoxMenuItem

메뉴 하부에 다른 메뉴를 하부로 배치하려면

mainMenu.add(submenu)

❖ JCheckBoxMenuItem

선택/비선택을 선택하는 메뉴항목을 위한 컴포넌트

메소드 addItemListener(리스너구현객체)

메소드 itemStateChanged()를 구현한 객체를 등록하여 이벤트를 처리

34

(35)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-6

❖ JCheckBox 와 JCheckBoxMenuItem에서 ItemEvent 처리 예제

메뉴 JCheckBoxMenuItem과 JCheckBox에서 체크박스 선택에 따라 이벤트를 처리

윈도우 중앙 JList와 하단 JLable에 ItemEvent 현황을 표시하는 프로그램

35

(36)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-6

36

import java.awt.event.ItemEvent;

import java.awt.event.ItemListener;

 

import javax.swing.AbstractButton;

import javax.swing.JCheckBox;

import javax.swing.JCheckBoxMenuItem;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JMenu;

import javax.swing.JMenuBar;

import javax.swing.JPanel;

import javax.swing.JTextArea;

 

public class ItemEventWin extends JFrame implements ItemListener {

private static final long serialVersionUID = 1L;

 

JPanel pCheck = new JPanel(); //체크박스가 배치될 패널 JTextArea txtArea = new JTextArea();

JLabel status = new JLabel("메뉴 상태");

public ItemEventWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(300, 200);

makeCheckBox();

makeMenuAndEventHandle();

add(pCheck, "North");

add(txtArea, "Center");

add(status, "South");

setVisible(true);

}  

public void makeCheckBox() {

JCheckBox box1 = new JCheckBox("수영");

JCheckBox box2 = new JCheckBox("골프");

JCheckBox box3 = new JCheckBox("축구");

JCheckBox box4 = new JCheckBox("야구");

box1.addItemListener(this);

box2.addItemListener(this);

box3.addItemListener(this);

box4.addItemListener(this);

pCheck.add(box1); pCheck.add(box2); pCheck.add(box3);

pCheck.add(box4);

}

public void makeMenuAndEventHandle() { JMenuBar mBar = new JMenuBar();

JMenu mainMenu = new JMenu("파일");

JMenu subMenu = new JMenu("멀티미디어");

JCheckBoxMenuItem subCheck1 = new JCheckBoxMenuItem("비 디오");

JCheckBoxMenuItem subCheck2 = new JCheckBoxMenuItem("이 미지");

subMenu.add(subCheck1);

subMenu.add(subCheck2);

subCheck1.addItemListener(this);

subCheck2.addItemListener(this);

mainMenu.add(subMenu);

mBar.add(mainMenu);

setJMenuBar(mBar);

}

public void itemStateChanged(ItemEvent evt) { String str = ((AbstractButton)

evt.getItem()).getText();

if (evt.getStateChange() == ItemEvent.DESELECTED) str += " 비선택\n";

else

str += " 선택\n";

status.setText(str);

txtArea.append(str);

}

public static void main(String[] args) { ItemEventWin myWin = new ItemEventWin();

myWin.setTitle("아이템이벤트 처리");

} }

(37)

단원 10 이벤트 처리와 그래픽 프로그래밍

컨테이너 이벤트

❖ 컨테이너 이벤트

컨테이너 컴포넌트에서 발생하는 이벤트

Container, JDialog, JFrame, JPanel, Jwindow

컨테이너 이벤트를 처리하는 리스너

ContainerListener

ContainerListener 메소드

ContainerEvent 소속

37

(38)

단원 10 이벤트 처리와 그래픽 프로그래밍

컨테이너 이벤트 처리 예제

레이블, 패널, 버튼으로 구성

▪ 추가되는 여러 버튼을 배열로 처리

클래스 Vector를 이용

▪ 윈도 상단에 레이블, 중간에 패널

▪ 하단에 [Add button]과 [Remove button] 버튼을 배치

[Add button] 버튼을 누르면 새 로운 버튼이 하나 생성

[Remove button] 버튼을 누르 면 마지막에 생긴 버튼부터 하나 씩 제거

버튼이 새로이 추가되거나 삭제되 면 레이블에 그 상태를 기록

38

(39)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-7

39 import java.awt.BorderLayout;

import java.awt.GridLayout;

  import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.ContainerEvent;

import java.awt.event.ContainerListener;

  import javax.swing.*;

import java.util.Vector;

 

public class ContainerEventWin extends JFrame implements ContainerListener, ActionListener {

private static final long serialVersionUID = 1L;

 

JButton btnAdd = new JButton("Add button");

JButton btnRemove = new JButton("Remove button");

JLabel lbl = new JLabel();

JPanel p1 = new JPanel();

JButton recentBtn; //가장 최근에 삽입 또는 삭제되는 버튼 int btnCount = 0;

Vector<JButton> aryBtn = new Vector<JButton>();

public ContainerEventWin() {

JPanel p2 = new JPanel(new GridLayout(0, 2));

p2.add(btnAdd);

p2.add(btnRemove);

add(lbl, BorderLayout.NORTH);

add(p1, BorderLayout.CENTER);

add(p2, BorderLayout.SOUTH);

// 버튼이 추가되는 패널은 콘테이너 리스너 등록 p1.addContainerListener(this);

// 버튼은 액션 리스너 등록

btnAdd.addActionListener(this);

btnRemove.addActionListener(this);

 

setSize(300, 200);

setVisible(true);

}

//ActionListener's method implementation public void actionPerformed(ActionEvent evt) {

(40)

단원 10 이벤트 처리와 그래픽 프로그래밍

이벤트 포커스

❖ 클래스 Component로부터 상속받는 모든 컴포넌트에서 처리할 수 있는 이벤 트

❖ FocusListener

포커스 이벤트를 처리하는 리스너

❖ FocusAdapter

FocusListener의 어댑터 클래스

40

(41)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-8

❖ 버튼과 텍스트 영역의 포커스 이벤트 표시

41 import java.awt.event.FocusEvent;

import java.awt.event.FocusListener;

 

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JTextArea;

 

public class FocusEventWin extends JFrame implements FocusListener {

private static final long serialVersionUID = 1L;

 

JTextArea txtArea = new JTextArea();

public FocusEventWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(350, 150);

//윈도 구성과 포커스 리스너 추가

makeWindowAndEventHandle();

setVisible(true);

}  

public void makeWindowAndEventHandle() { JButton btn = new JButton("버튼");

add(txtArea, "Center");

add(btn, "South");

//버튼과 텍스트영역의 이벤트 처리를 위해 리스너 추가 btn.addFocusListener(this);

(42)

단원 10 이벤트 처리와 그래픽 프로그래밍 42

5. 그래픽 프로그래밍 개요

(43)

단원 10 이벤트 처리와 그래픽 프로그래밍

그래픽 배경

❖ 그래픽 배경(Graphics Context)

그림이 그려지는 논리적인 화면

여기에 그려진 화면은 다시 화면이나 프린터로 출력

43

(44)

단원 10 이벤트 처리와 그래픽 프로그래밍

클래스 Graphics

Graphics

▪ 그림을 그리는데 필요한 각종 기능을 제공하는 추상 클래스

즉 사각형, 타원, 원호와 같이 다양한 형태를 그리는 메소드

글자체인 폰트와 문자열, 색상

이미지에 관련된 다양한 메소드를 제공

▪ 개념적으로 여러 종류의 그림을 그리기 위한 붓이나 팔레트

그래픽 객체를 사용하는 메소드

▪ 그림을 그리는 모듈은 대부분 paint()나 update() 또는 paintComponent() 메소드에서 구현

그래픽 배경에서의 좌표

44

(45)

단원 10 이벤트 처리와 그래픽 프로그래밍

❖ 각종 색상을 생성하여 활용

그래픽 배경(graphics context)의 전경화면(foreground) 색상을 지정

Graphics의 메소드 setColor()를 이용

Component

메소드 setBackground()와 setForeground()

각각 구성 요소의 배경화면(background)과 전경화면의 색상 지정

❖ 클래스 Color의 생성자

❖ 색상 상수와 RGB

클래스 Color

45

(46)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-9

❖ 문자열 그리기

메소드 paint()

Graphics 객체 g를 사용하여 메소드 setColor()로 색상을 지정

drawString(“문자열”, x, y)으로 문자열을 그림

46

package graphics;

 

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

import javax.swing.JFrame;

 

public class DrawStringWin extends JFrame {

private static final long serialVersionUID = 1L;

 

public DrawStringWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(300, 150);

setVisible(true);

}  

public void paint(Graphics g) {

// 윈도를 구성하는 콘텐트페인의 크기를 반환

(47)

단원 10 이벤트 처리와 그래픽 프로그래밍

사각형 그리기

❖ 사각형 그리기

drawRoundRect()

모서리가 둥근 사각형을 그리는

인자 arcWidth와 argHeight

모서리 부분에 해당하는 타원을
 위한 너비와 높이

drawRect(), fillRoundRect()

다양한 메소드

47

(48)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-10

❖ 직선 그리기 예제

적당한 간격을 유지하여 13개의 직선을 여러 색상으로 그리고

청색으로 4개의 연결된 직선을 그리는 프로그램

13개의 직선에 색상을 다르게 지정하기 위해 switch-case 문을 이용

윈도우의 콘텐트 패인의 크기를 알아 내, 크기 내부에 알맞게 수평선과 직선을 그림

48

(49)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-10

❖ 직선 그리기 예제

49 package graphics;

 

import java.awt.Color;

import java.awt.Container;

import java.awt.Dimension;

import java.awt.Graphics;

 

import javax.swing.JFrame;

 

public class DrawLineWin extends JFrame {

private static final long serialVersionUID = 1L;

 

public DrawLineWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

setSize(400, 200);

setVisible(true);

}  

public void paint(Graphics g) { //get ContentPane

Container win = getContentPane();

//윈도를 구성하는 콘텐트페인의 크기를 반환 Dimension d = win.getSize();

int clientWidth = d.width; //가로 크기 int clientHeight = d.height;//세로 크기 int incHeight = (clientHeight-10) / 12;

for (int i = 0; i < 13; i++) { switch (i) {

case 0: g.setColor(Color.black); break;

case 1: g.setColor(Color.blue); break;

case 2: g.setColor(Color.cyan); break;

case 3: g.setColor(Color.darkGray);

break;

(50)

단원 10 이벤트 처리와 그래픽 프로그래밍

타원과 원호, 다각형 그리기

❖ 타원과 원호 그리기

메소드 drawOval()과 drawArc()를 이용

❖ 다각형 그리기

메소드 drawPolygon()과 fillPolygon()을 이용

50

(51)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-11

❖ 타원 그리기 예제

메소드

fillOval()

과 클래스

Color

를 이용

다양한 색상으로 임의 크기의 타원을 그리는 예제

스레드를 이용하여 여러 색상의 타원이 계속 그려짐

Runnable을 상속받아 run()을 재정의하고 클래스 JFrame을 상속받아 구현

51

(52)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-11

❖ 타원 그리기 예제

52 package graphics;

 

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Graphics;

 

import javax.swing.JFrame;

 

public class DrawOvalWin extends JFrame implements Runnable {

private static final long serialVersionUID = 1L;

 

public DrawOvalWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

new Thread(this).start();

setSize(400, 200);

setVisible(true);

}

public void run() { while(true) {

repaint();

try {

Thread.sleep(200);

} catch(Exception e) { System.out.println(e);

} } }

private int random(int r) {

(53)

단원 10 이벤트 처리와 그래픽 프로그래밍 53

6. 글자와 이미지 처리

(54)

단원 10 이벤트 처리와 그래픽 프로그래밍

글자 쓰기

❖ 그래픽 객체로 글씨를 쓰기 위해

drawBytes(), drawChars(), drawString() 등의 메소드를 이용

문자열이 그려질 위치의 시작점

좌표 (x, y)로 글자의 베이스라인 위치

54

(55)

단원 10 이벤트 처리와 그래픽 프로그래밍

클래스 Font

❖ 폰트를 사용하려면

먼저 사용할 폰트를 하나 만들고

그래픽 배경 객체의 메소드 setFont()를 호출하여 이용할 폰트를 지정

❖ 생성자

폰트 이름과 스타일

55

(56)

단원 10 이벤트 처리와 그래픽 프로그래밍

폰트 관련 여러 정보

❖ 폰트의 기본 정보를 조회하는 방법

❖ 클래스 FontMetrics 이용

폰트와 관련된 각종 길이 정보를 알기 위한 클래스

56

(57)

단원 10 이벤트 처리와 그래픽 프로그래밍

다양한 폰트로 폰트 이름을 출력

❖ 현재 시스템에서 사용가능한 폰트의 목록을 알 수 있는 방법

❖ 폰트의 생성과 지정

❖ 윈도우의 중앙에 문자열을 출력하기 위해

FontMetrics를 얻어 출력될 문자열의 길이를 변수 strWidth에 저장

57

(58)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-12

❖ 여러 폰트에 의한 문자열 그리기 예제

시스템에서 이용할 수 있는 폰트의 이름을 알아내 폰트의 이름과 스타일로 문자열 을 구성하여 여러 색상으로 화면에 출력

58

(59)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-12

59

package graphics;

 

import java.awt.Color;

import java.awt.Dimension;

import java.awt.Font;

import java.awt.FontMetrics;

import java.awt.Graphics;

import java.awt.GraphicsEnvironment;

 

import javax.swing.JFrame;

import javax.swing.JPanel;

 

public class FontWin extends JFrame {

private static final long serialVersionUID = 1L;

 

Color[] manyColors = { Color.black, Color.blue, Color.cyan, Color.gray, Color.green, Color.lightGray, Color.magenta, Color.orange, Color.pink, Color.red, Color.yellow, Color.darkGray };

int[] styles = { Font.PLAIN, Font.ITALIC, Font.BOLD, Font.BOLD | Font.ITALIC };

String[] styleNames = { "plain", "bold", "italic", "bold/

italic" };

 

GraphicsEnvironment ge =

GraphicsEnvironment.getLocalGraphicsEnvironment();

String[] fontNames = ge.getAvailableFontFamilyNames();

 

public FontWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

add(new MyPanel());

 

setSize(400, 200);

setVisible(true);

}

private int random(int r) {

return (int) Math.floor(Math.random() * r);

}  

class MyPanel extends JPanel {

private static final long serialVersionUID = 1L;

(60)

단원 10 이벤트 처리와 그래픽 프로그래밍

이미지 그리기

❖ ImageIcon

이미지를 윈도에 그리는 가장 간단한 방법

클래스 ImageIcon으로 객체를 생성하여 JLabel에 삽입하는 방법

그러나 이미지의 크기 조절이 불가능

60

(61)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-13

❖ 그림을 레이블을 이용하여 윈도에 그리기

61 package graphics;

 

import javax.swing.ImageIcon;

import javax.swing.JFrame;

import javax.swing.JLabel;

 

public class ImageWin extends JFrame {

private static final long serialVersionUID = 1L;

 

public ImageWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

ImageIcon img = new ImageIcon("image.png", "대자 연 풍경");

JLabel lb = new JLabel(img);

add(lb);

Integer height = new Integer(img.getIconHeight());

Integer width = new Integer(img.getIconWidth());

JLabel size = new JLabel(img.getDescription() +

": " + height + " " + width);

add(size, "South");

 

setSize(400, 200);

setVisible(true);

}

(62)

단원 10 이벤트 처리와 그래픽 프로그래밍

적절한 크기로 이미지 그리기

Graphics 객체의 drawImage()를 사용

▪ 메소드 drawImage(img, x, y, imgWidth, imgHeight, this)

첫 번째 인자인 Image 객체인 img

왼쪽 상단 위치 (x, y)에 그림 크기의 가로와 세로

마지막 인자는 그림의 변환을 알리는 객체로 윈도우 자신을 기술

윈도우의 외곽 테두리 크기를 파악

▪ 클래스 Container의 메소드 getInsets()을 이용

Insets in = getInsets();

– 반환 값은 Insets의 객체로 속성인 top, left, right, bottom으로 외곽 테두리의 두께의 길이를 알 수 있음

62

(63)

단원 10 이벤트 처리와 그래픽 프로그래밍

실습예제 10-14

❖ 윈도에 맞게 이미지 그리기

63 package graphics;

 

import java.awt.Graphics;

import java.awt.Image;

import java.awt.Insets;

 

import javax.swing.ImageIcon;

import javax.swing.JFrame;

 

public class DrawImageWin extends JFrame {

private static final long serialVersionUID = 1L;

 

Image img;

Insets in;

public DrawImageWin() {

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

ImageIcon imgIco = new ImageIcon("image.png");

img = imgIco.getImage();

setSize(350, 250);

setVisible(true);

in = getInsets();

System.out.println(in.top + " " + in.bottom + "

" + in.left + " " + in.right);

}

public void paint(Graphics g) {

//int origWidth = img.getWidth(this);

//int origHeight = img.getHeight(this);

(64)
(65)

Thank You !

참조

관련 문서

• 이번 실습에서는 Practice13_1 프로그램을 수 정하여, 곡선의 컨트롤 포인트를 마우스의 드 래깅으로 이동하여 곡선을 업데이트하도록 할 것이고, 곡선을

 Maximum Event Precision From Training Prior: 이벤트 정밀도가 최대 가 되는 임계치를 설정한다.  Event Precision Equal Recall: 이벤트 정밀도와

업무 시스템의 이벤트 로그 데이터를 분석하여 실제 프로세스를 도출하고, 프로세스 개선을 지원하는 프로세스 마이닝 기반

Temperature Hysteresis Inside / Outside Temperature event에 대한 hysteresis 폭을 설정 이벤트 종료레벨은 (threshold - hysteresis) 이다. 범위: 1 - 120

행사 및 부대 이벤트 운영 행사 및 부대 이벤트 운영 행사 관련 제작물 제작 및 진행 버스킹, 예술공연 운영 행사 운영.. 개발사와 투자사,

PuzzleData ProDiscovery TM | Global Process Mining Platform 업무 시스템의 이벤트 로그 데이터를 분석하여 실제 프로세스를 도출하고,. 프로세스 개선을

폼을 열어 레코드들이 표시될 때 발 생하며, 이 이벤트는 Current 이벤트 전에 발생하고 Open 이벤트 후에 발 생함.

마지막으로 제안된 움직임 모델링 기법에 대한 성능평가를 위해 실제 영상의 움직임 객체의 좌표값 추출을 통해 제시된 규칙을 적용하여 움직임 인식과 이벤트