Presentation is loading. Please wait.

Presentation is loading. Please wait.

10장. 이벤트 처리와 그래픽 프로그래밍.

Similar presentations


Presentation on theme: "10장. 이벤트 처리와 그래픽 프로그래밍."— Presentation transcript:

1 10장. 이벤트 처리와 그래픽 프로그래밍

2 학습목표 이벤트 처리 개념을 이해하고 관련 클래스와 리스너를 활용할 수 있다.
• 이벤트 처리 개요와 관련 클래스 • 이벤트 객체와 이벤트 리스너 • 스윙의 주요 클래스와 계층구조 이벤트 처리를 위한 다양한 프로그래밍을 할 수 있다. • 버튼의 이벤트 프로그래밍, • 마우스의 이벤트 프로그래밍 • 이벤트 리스너의 구현 이벤트 처리에서 어댑터 클래스의 필요성을 이해하고 프로그래밍에 활용할 수 있다. • 어댑터 클래스의 필요성과 주요 어댑터 클래스 다양한 콤포넌트에서 이벤트 처리 프로그래밍을 할 수 있다. • 콤포넌트, 아이템 이벤트 처리, • 콘테이너, 포커스 이벤트 처리 그래픽 프로그래밍 개요를 이해하고 글자와 이미지 처리 프로그래밍을 할 수 있다. • 그래픽 프로그래밍을 이해하고 색상과 문자열, 직선과 사각형 그리기 • 글자를 위한 폰트 처리와 이미지 처리

3 1. 이벤트 처리 개요

4 이벤트 개요와 이벤트 처리 이벤트 이벤트 소스 이벤트 리스너
Section 1 이벤트 처리 개요 p408 이벤트 개요와 이벤트 처리 이벤트 컴포넌트는 적절한 이벤트(event)를 통하여 사용자 또는 시스템과 대화 예를 들어 하나의 컴포넌트 위에서 마우스를 클릭 이에 대한 반응으로 이 컴포넌트는 마우스 클릭에 대한 이벤트가 발생 이벤트 소스 사용자나 시스템 이벤트를 발생시킨 진원지 이벤트 리스너 이벤트를 수용(listen)하는 개체 특정한 이벤트 정보는 인터페이스인 이벤트 리스너(event listener)의 메소드로 전달

5 이벤트 처리 구현 개념 자바의 이벤트를 처리 [절차 1: 이벤트 리스너 구현] [절차 2: 이벤트 리스너 등록]
Section 1 이벤트 처리 개요 이벤트 처리 구현 개념 자바의 이벤트를 처리 [절차 1: 이벤트 리스너 구현] 이벤트 리스너를 상속받아 필요한 메소드의 구현 [절차 2: 이벤트 리스너 등록] 이벤트를 받는 컴포넌트에서 이벤트 리스너를 등록

6 이벤트 클래스 다양한 이벤트 종류 액션이벤트(ActionEvent)와 마우스이벤트(MouseEvent) 등
Section 1 이벤트 처리 개요 이벤트 클래스 다양한 이벤트 종류 액션이벤트(ActionEvent)와 마우스이벤트(MouseEvent) 등 사용자의 특정한 행동에 대응하는 다양한 이벤트를 제공

7 이벤트 계층 구조 이벤트 관련 최상위 클래스인 EventObject
Section 1 이벤트 처리 개요 이벤트 계층 구조 이벤트 관련 최상위 클래스인 EventObject 이벤트를 발생한 객체를 반환하는 getSource() 메소드를 제공

8 컴포넌트와 발생 가능한 이벤트 객체 다양한 이벤트 종류 중에서 어느 이벤트를 인지하여 처리할 수 있는지 정리한 표
Section 1 이벤트 처리 개요 컴포넌트와 발생 가능한 이벤트 객체 다양한 이벤트 종류 중에서 어느 이벤트를 인지하여 처리할 수 있는지 정리한 표

9 이벤트 리스너 개요 이벤트 리스너 발생한 이벤트를 받아 호출되는 추상 메소드가 있는 인터페이스 MouseListener 소스
Section 1 이벤트 처리 개요 이벤트 리스너 개요 이벤트 리스너 발생한 이벤트를 받아 호출되는 추상 메소드가 있는 인터페이스 MouseListener 소스

10 Section 1 이벤트 처리 개요 이벤트 리스너 계층 구조 이벤트 리스너 패키지 java.awt.event에 소속된 최상위 인터페이스인 EventListener를 상속

11 이벤트 리스너의 추상 메소드 인터페이스인 이벤트 리스너 특정한 이벤트에 따라 구현해야 할 메소드가 추상 메소드로 정의
Section 1 이벤트 처리 개요 이벤트 리스너의 추상 메소드 인터페이스인 이벤트 리스너 특정한 이벤트에 따라 구현해야 할 메소드가 추상 메소드로 정의

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

13 첫 이벤트 프로그래밍 이벤트 처리를 위해서는 다음 두 단계의 처리가 반드시 필요 [절차 1: 이벤트 리스너 구현]
Section 2 이벤트 처리 프로그래밍 기초 p416 첫 이벤트 프로그래밍 이벤트 처리를 위해서는 다음 두 단계의 처리가 반드시 필요 [절차 1: 이벤트 리스너 구현] 이벤트 리스너를 상속받아 필요한 메소드의 구현 버튼에 대한 액션이벤트 처리를 위하여 ActionListener를 구현 [절차 2: 이벤트 리스너 등록] 이벤트를 받는 컴포넌트에서 이벤트 리스너를 등록 버튼 객체는 버튼객체.addActionListener(리스너구현객체) 메소드 호출

14 이벤트 리스너의 구현과 이벤트 리스너 등록 이벤트 리스너 구현 이벤트 리스너 등록
Section 2 이벤트 처리 프로그래밍 기초 이벤트 리스너의 구현과 이벤트 리스너 등록 이벤트 리스너 구현 주 윈도우 클래스 ButtonActionWin 인터페이스 ActionListener를 상속받아 추상 메소드인 actionPerformed(…)를 구현해야 이벤트 리스너 등록 이벤트를 받는 버튼 btnOk, btnCancel 객체 메소드 addActionListener(리스너가구현된객체)를 이용

15 실습예제 10-1 Section 2 이벤트 처리 프로그래밍 기초 import java.awt.event.ActionEvent;
//2개 버튼의 이벤트 처리를 위해 리스너를 추가 import java.awt.event.ActionListener; btnOk.addActionListener(this); btnCancel.addActionListener(this); import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JButton; public void actionPerformed(ActionEvent evt) { import javax.swing.JLabel; //클릭된 버튼의 이름을 저장 String strCmd = evt.getActionCommand(); import java.awt.BorderLayout; import java.awt.GridLayout; // 레이블에 클릭된 버튼의 이름을 지정 if (strCmd.equals("OK")) { public class ButtonActionWin extends JFrame implements ActionListener { dLb.setText(" OK Button"); } else if (strCmd.equals("Cancel")) { private static final long serialVersionUID = 1L; dLb.setText(" Cancel Button"); JButton btnOk = new JButton("OK"); JButton btnCancel = new JButton("Cancel"); JLabel dLb = new JLabel("클릭한 버튼의 제목이 보입니다."); public static void main(String[] args) { ButtonActionWin myWin = new ButtonActionWin(); public ButtonActionWin() { myWin.setTitle("버튼 액션 이벤트 처리"); 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);

16 마우스의 누름과 놓음 처리 프레임 내부에서 마우스를 누른(press)후 다시 놓는(release) 이벤트 처리를 구현
Section 2 이벤트 처리 프로그래밍 기초 마우스의 누름과 놓음 처리 프레임 내부에서 마우스를 누른(press)후 다시 놓는(release) 이벤트 처리를 구현

17 실습예제 10-2 Section 2 이벤트 처리 프로그래밍 기초 import java.awt.*;
if (childWin == null) import java.awt.event.*; childWin = new MouseEventWin(); childWin.setLocation(x, y); import javax.swing.JFrame; childWin.setTitle(++countChild + "번째 자식 윈도"); public class MouseEventWin extends JFrame { childWin.setSize(getSize().width*2/3, getSize().height*2/3); private static final long serialVersionUID = 1L; MouseEventWin childWin = null; childWin.setVisible(true); static int countChild; public void mouseReleased(MouseEvent e) { public MouseEventWin() { if (childWin != null) childWin.setVisible(false); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(400, 150); setVisible(true); //처리하지 않은 이벤트에 대한 메소드도 기능 없이 구현 필요 //register mouse event handler, motion event handler public void mouseEntered(MouseEvent e) { addMouseListener(new MyMouseListener()); public void mouseExited(MouseEvent e) { } public void mouseClicked(MouseEvent e) { class MyMouseListener implements MouseListener { public void mousePressed(MouseEvent e) { public static void main(String [] args) { Rectangle bounds = getBounds(); MouseEventWin myWin = new MouseEventWin(); int x = e.getX() + bounds.x; myWin.setTitle("마우스를 누르세요"); int y = e.getY() + bounds.y;

18 MouseListenr와 MouseEvent
Section 2 이벤트 처리 프로그래밍 기초 MouseListenr와 MouseEvent MouseListenr의 메소드 MouseEvent의 변수와 메소드

19 MouseMotionListener 마우스 이동(move)과 드래그(drag)에 대한 이벤트를 처리하는 리스너
Section 2 이벤트 처리 프로그래밍 기초 MouseMotionListener 마우스 이동(move)과 드래그(drag)에 대한 이벤트를 처리하는 리스너 마우스의 클릭과 이동에 대한 이벤트 처리 MouseListener, MouseMotionListener를 상속받아 7개의 메소드를 모두 구현 또는 간단히 리스너 MouseInputListener 하나를 상속받아 구현

20 마우스 이벤트 예제를 위한 화면 구성 레이블인 s1, s2, s3
Section 2 이벤트 처리 프로그래밍 기초 마우스 이벤트 예제를 위한 화면 구성 레이블인 s1, s2, s3 각각 Pressed/Released와 Entered/Exited/Clicked 그리고 Dragged/Moved 정보를 출력

21 마우스 이벤트를 위한 7가지 메소드 구현 이벤트 구현을 위한 내부 클래스 MyMouseListener
Section 2 이벤트 처리 프로그래밍 기초 마우스 이벤트를 위한 7가지 메소드 구현 이벤트 구현을 위한 내부 클래스 MyMouseListener MouseListener의 5가지 메소드와 MouseMotionListener의 2가지 메소드를 구현

22 이벤트 리스너 4가지 구현 방법 이벤트 리스너를 구현하는 4가지 방법 [방법 1: 일반 구현] [방법 2: 내부 구현]
Section 2 이벤트 처리 프로그래밍 기초 이벤트 리스너 4가지 구현 방법 이벤트 리스너를 구현하는 4가지 방법 [방법 1: 일반 구현] 원도우 구현 클래스에서 인터페이스 이벤트 리스너를 상속받아 구현 [방법 2: 내부 구현] 원도우 내부에서 내부 클래스로 인터페이스 이벤트 리스너를 구현 [방법 3: 익명 구현] 이벤트 리스너 등록 시 익명의 클래스로 리스너를 직접 구현 [방법 4: 외부 구현] 외부의 새로운 클래스로 인터페이스 이벤트 리스너를 구현

23 버튼 클릭 이벤트 처리 4가지 방식으로 모두 구현 기능 버튼의 ActionEvent에 대한 이벤트 처리
Section 2 이벤트 처리 프로그래밍 기초 버튼 클릭 이벤트 처리 4가지 방식으로 모두 구현 버튼의 ActionEvent에 대한 이벤트 처리 기능 윈도 전체에 버튼을 하나 구성 버튼을 누르면 윈도우 캡션에 버튼이름과 버튼을 클릭한 횟수 표시

24 Section 2 이벤트 처리 프로그래밍 기초 일반 구현과 내부 구현

25 Section 2 이벤트 처리 프로그래밍 기초 익명 구현과 외부 구현

26 3. 어댑터 클래스

27 Section 3 어댑터 클래스 p432 어댑터 클래스 개요 어댑터 클래스 필요성 MouseListener와 MouseMotionListener의 메소드는 각각 5개와 2개 7개의 메소드 중에서 처리할 메소드가 총 3개라도 나머지 필요 없는 메소드도 아무 문장 없이 구현해야 하는 번거로움이 발생 이러한 불편을 제거하기 위해 어댑터 클래스는 리스너의 메소드를 구현 선언한 후 아무 문장이 없는 메소드를 미리 구현해 놓은 클래스

28 Section 3 어댑터 클래스 주요 어댑터 클래스

29 어댑터 클래스를 사용한 마우스 이동 구현 마우스 이동에 대한 이벤트만을 처리
Section 3 어댑터 클래스 어댑터 클래스를 사용한 마우스 이동 구현 마우스 이동에 대한 이벤트만을 처리 MouseAdapter 또는 MouseMotionAdapter로부터의 상속을 선언 필요한 메소드인 mouseMoved()만을 구현

30 4. 다양한 이벤트 처리

31 컴포넌트의 다양한 변화에 따른 이벤트 컴포넌트 이벤트 클래스 ComponentEvent
Section 4 다양한 이벤트 처리 p110 컴포넌트의 다양한 변화에 따른 이벤트 컴포넌트 이벤트 컴포넌트의 컴포넌트의 보임, 사라짐, 이동, 크기의 변화에 따라 발생 JMenuItem과 JCheckBoxMenuItem을 제외한 대부분의 컴포넌트에서 발생 클래스 ComponentEvent ComponentEvent의 메소드 getComponent() 이벤트를 발생시킨 컴포넌트를 반환

32 실습예제 10-5 윈도우를 구성하는 텍스트 영역의 크기가 변하면 컴포넌트 이벤트 발생 결과를 텍스트 영역에 표시
Section 4 다양한 이벤트 처리 실습예제 10-5 윈도우를 구성하는 텍스트 영역의 크기가 변하면 컴포넌트 이벤트 발생 결과를 텍스트 영역에 표시 import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; public ComponentEventWin() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); import javax.swing.JFrame; setSize(600, 150); import javax.swing.JTextArea; add(txtArea, "Center"); public class ComponentEventWin extends JFrame { txtArea.addComponentListener(new MyComponentAdapter()); private static final long serialVersionUID = 1L; setVisible(true); JTextArea txtArea = new JTextArea(); class MyComponentAdapter extends ComponentAdapter { public static void main(String[] args) { public void componentResized(ComponentEvent evt) { ComponentEventWin myWin = new ComponentEventWin(); String str = evt.getSource().getClass() + " 콤포넌트 크기 재조정: "; myWin.setTitle("콤포넌트 이벤트 처리"); str += evt.getComponent().getBounds() + "\n"; txtArea.append(str); }

33 ItemEvent ItemEvent를 발생시키는 컴포넌트 ItemListener 메소드 ItemEvent의 상수와 메소드
Section 4 다양한 이벤트 처리 ItemEvent ItemEvent를 발생시키는 컴포넌트 JCheckBox, JList, JComboBox, JCheckBox, MenuItem 등 ItemEvent를 처리하려면 인터페이스 ItemSelectable을 상속받아 구현 컴포넌트 자체나 또는 컴포넌트를 구성하는 항목이 on/off 또는 selected/deselected 등의 이원화된 상태를 갖는 특성 ItemListener 메소드 ItemEvent의 상수와 메소드

34 JCheckBoxMenuItem에서 이벤트 처리
Section 4 다양한 이벤트 처리 JCheckBoxMenuItem에서 이벤트 처리 메뉴 구성을 위한 컴포넌트는 JMenu와 JCheckBoxMenuItem 메뉴 하부에 다른 메뉴를 하부로 배치하려면 mainMenu.add(submenu) JCheckBoxMenuItem 선택/비선택을 선택하는 메뉴항목을 위한 컴포넌트 메소드 addItemListener(리스너구현객체) 메소드 itemStateChanged()를 구현한 객체를 등록하여 이벤트를 처리

35 실습예제 10-6 JCheckBox와 JCheckBoxMenuItem에서 ItemEvent 처리 예제
Section 4 다양한 이벤트 처리 실습예제 10-6 JCheckBox와 JCheckBoxMenuItem에서 ItemEvent 처리 예제 메뉴 JCheckBoxMenuItem과 JCheckBox에서 체크박스 선택에 따라 이벤트를 처리 윈도우 중앙 JList와 하단 JLable에 ItemEvent 현황을 표시하는 프로그램

36 실습예제 10-6 Section 4 다양한 이벤트 처리 import java.awt.event.ItemEvent;
box3.addItemListener(this); box4.addItemListener(this); import java.awt.event.ItemListener; pCheck.add(box1); pCheck.add(box2); pCheck.add(box3); pCheck.add(box4); import javax.swing.AbstractButton; import javax.swing.JCheckBox; import javax.swing.JCheckBoxMenuItem; public void makeMenuAndEventHandle() { import javax.swing.JFrame; JMenuBar mBar = new JMenuBar(); import javax.swing.JLabel; JMenu mainMenu = new JMenu("파일"); import javax.swing.JMenu; JMenu subMenu = new JMenu("멀티미디어"); import javax.swing.JMenuBar; JCheckBoxMenuItem subCheck1 = new JCheckBoxMenuItem("비디오"); import javax.swing.JPanel; import javax.swing.JTextArea; JCheckBoxMenuItem subCheck2 = new JCheckBoxMenuItem("이미지"); public class ItemEventWin extends JFrame implements ItemListener { subMenu.add(subCheck1); private static final long serialVersionUID = 1L; subMenu.add(subCheck2); subCheck1.addItemListener(this); JPanel pCheck = new JPanel(); //체크박스가 배치될 패널 subCheck2.addItemListener(this); JTextArea txtArea = new JTextArea(); JLabel status = new JLabel("메뉴 상태"); mainMenu.add(subMenu); mBar.add(mainMenu); public ItemEventWin() { setJMenuBar(mBar); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 200); public void itemStateChanged(ItemEvent evt) { makeCheckBox(); String str = ((AbstractButton) evt.getItem()).getText(); makeMenuAndEventHandle(); if (evt.getStateChange() == ItemEvent.DESELECTED) add(pCheck, "North"); str += " 비선택\n"; add(txtArea, "Center"); else add(status, "South"); str += " 선택\n"; setVisible(true); status.setText(str); } txtArea.append(str); public void makeCheckBox() { JCheckBox box1 = new JCheckBox("수영"); public static void main(String[] args) { JCheckBox box2 = new JCheckBox("골프"); ItemEventWin myWin = new ItemEventWin(); JCheckBox box3 = new JCheckBox("축구"); myWin.setTitle("아이템이벤트 처리"); JCheckBox box4 = new JCheckBox("야구"); box1.addItemListener(this); box2.addItemListener(this);

37 컨테이너 이벤트 컨테이너 이벤트 컨테이너 컴포넌트에서 발생하는 이벤트 컨테이너 이벤트를 처리하는 리스너
Section 4 다양한 이벤트 처리 컨테이너 이벤트 컨테이너 이벤트 컨테이너 컴포넌트에서 발생하는 이벤트 Container, JDialog, JFrame, JPanel, Jwindow 컨테이너 이벤트를 처리하는 리스너 ContainerListener ContainerListener 메소드 ContainerEvent 소속

38 컨테이너 이벤트 처리 예제 레이블, 패널, 버튼으로 구성 추가되는 여러 버튼을 배열로 처리 윈도 상단에 레이블, 중간에 패널
Section 4 다양한 이벤트 처리 컨테이너 이벤트 처리 예제 레이블, 패널, 버튼으로 구성 추가되는 여러 버튼을 배열로 처리 클래스 Vector를 이용 윈도 상단에 레이블, 중간에 패널 하단에 [Add button]과 [Remove button] 버튼을 배치 [Add button] 버튼을 누르면 새로운 버튼이 하나 생성 [Remove button] 버튼을 누르면 마지막에 생긴 버튼부터 하나씩 제거 버튼이 새로이 추가되거나 삭제되면 레이블에 그 상태를 기록

39 실습예제 10-7 Section 4 다양한 이벤트 처리 import java.awt.BorderLayout;
import java.awt.GridLayout; //ActionListener's method implementation public void actionPerformed(ActionEvent evt) { import java.awt.event.ActionEvent; String strBtn = evt.getActionCommand(); import java.awt.event.ActionListener; if ( strBtn.equals("Add button") ){ import java.awt.event.ContainerEvent; recentBtn = new JButton("button " + (++btnCount)); import java.awt.event.ContainerListener; recentBtn.setName("button " + btnCount); recentBtn.addActionListener(this); import javax.swing.*; p1.add(recentBtn); import java.util.Vector; aryBtn.addElement(recentBtn); } else if ( strBtn.equals("Remove button") ){ public class ContainerEventWin extends JFrame implements ContainerListener, ActionListener { if (!aryBtn.isEmpty()) { recentBtn = (JButton) aryBtn.lastElement(); private static final long serialVersionUID = 1L; aryBtn.removeElementAt(--btnCount); p1.remove(recentBtn); JButton btnAdd = new JButton("Add button"); update(getGraphics()); JButton btnRemove = new JButton("Remove button"); JLabel lbl = new JLabel(); JPanel p1 = new JPanel(); JButton recentBtn; //가장 최근에 삽입 또는 삭제되는 버튼 int btnCount = 0; //ComponentListener's method implementation public void componentAdded(ContainerEvent evt) { Vector<JButton> aryBtn = new Vector<JButton>(); String str = "총" + btnCount + "개: " + evt.getChild().getName() + " added"; public ContainerEventWin() { lbl.setText(str); } JPanel p2 = new JPanel(new GridLayout(0, 2)); public void componentRemoved(ContainerEvent evt) { p2.add(btnAdd); String str = "총" + btnCount + "개: " + evt.getChild().getName() + " removed"; p2.add(btnRemove); add(lbl, BorderLayout.NORTH); lbl.setText(str); add(p1, BorderLayout.CENTER); add(p2, BorderLayout.SOUTH); public static void main(String [] args) { ContainerEventWin myWin = new ContainerEventWin(); // 버튼이 추가되는 패널은 콘테이너 리스너 등록 myWin.setTitle("Container event handle"); p1.addContainerListener(this); // 버튼은 액션 리스너 등록 btnAdd.addActionListener(this); btnRemove.addActionListener(this); setSize(300, 200); setVisible(true); }

40 이벤트 포커스 클래스 Component로부터 상속받는 모든 컴포넌트에서 처리할 수 있는 이벤트 FocusListener
Section 4 다양한 이벤트 처리 이벤트 포커스 클래스 Component로부터 상속받는 모든 컴포넌트에서 처리할 수 있는 이벤트 FocusListener 포커스 이벤트를 처리하는 리스너 FocusAdapter FocusListener의 어댑터 클래스

41 실습예제 10-8 버튼과 텍스트 영역의 포커스 이벤트 표시 Section 4 다양한 이벤트 처리
import java.awt.event.FocusEvent; txtArea.addFocusListener(this); import java.awt.event.FocusListener; import javax.swing.JButton; public void focusLost(FocusEvent evt) { import javax.swing.JFrame; String str = evt.getSource().getClass() + " 포커스 잃음\n"; import javax.swing.JTextArea; txtArea.append(str); public class FocusEventWin extends JFrame implements FocusListener { private static final long serialVersionUID = 1L; public void focusGained(FocusEvent evt) { String str = evt.getSource().getClass() + " 포커스 얻음\n"; JTextArea txtArea = new JTextArea(); public FocusEventWin() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(350, 150); public static void main(String[] args) { //윈도 구성과 포커스 리스너 추가 FocusEventWin myWin = new FocusEventWin(); makeWindowAndEventHandle(); myWin.setTitle("포커스 이벤트 처리"); setVisible(true); } public void makeWindowAndEventHandle() { JButton btn = new JButton("버튼"); add(txtArea, "Center"); add(btn, "South"); //버튼과 텍스트영역의 이벤트 처리를 위해 리스너 추가 btn.addFocusListener(this);

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

43 그래픽 배경 그래픽 배경(Graphics Context) 그림이 그려지는 논리적인 화면
Section 5 그래픽 프로그래밍 개요 p448 그래픽 배경 그래픽 배경(Graphics Context) 그림이 그려지는 논리적인 화면 여기에 그려진 화면은 다시 화면이나 프린터로 출력

44 클래스 Graphics Graphics 그래픽 객체를 사용하는 메소드 그래픽 배경에서의 좌표
Section 5 그래픽 프로그래밍 개요 클래스 Graphics Graphics 그림을 그리는데 필요한 각종 기능을 제공하는 추상 클래스 즉 사각형, 타원, 원호와 같이 다양한 형태를 그리는 메소드 글자체인 폰트와 문자열, 색상 이미지에 관련된 다양한 메소드를 제공 개념적으로 여러 종류의 그림을 그리기 위한 붓이나 팔레트 그래픽 객체를 사용하는 메소드 그림을 그리는 모듈은 대부분 paint()나 update() 또는 paintComponent() 메소드에서 구현 그래픽 배경에서의 좌표

45 클래스 Color 각종 색상을 생성하여 활용 클래스 Color의 생성자 색상 상수와 RGB
Section 5 그래픽 프로그래밍 개요 클래스 Color 각종 색상을 생성하여 활용 그래픽 배경(graphics context)의 전경화면(foreground) 색상을 지정 Graphics의 메소드 setColor()를 이용 Component 메소드 setBackground()와 setForeground() 각각 구성 요소의 배경화면(background)과 전경화면의 색상 지정 클래스 Color의 생성자 색상 상수와 RGB

46 실습예제 10-9 문자열 그리기 메소드 paint()
Section 5 그래픽 프로그래밍 개요 실습예제 10-9 문자열 그리기 메소드 paint() Graphics 객체 g를 사용하여 메소드 setColor()로 색상을 지정 drawString(“문자열”, x, y)으로 문자열을 그림 package graphics; public void paint(Graphics g) { //윈도를 구성하는 콘텐트페인의 크기를 반환 import java.awt.Color; Dimension d = getSize(); import java.awt.Dimension; //그래픽의 색상을 지정 import java.awt.Graphics; g.setColor(new Color(255, 90, 180)); import javax.swing.JFrame; g.drawString("자바 그래픽 프로그래밍", d.width/3, 2*d.height/3 ); public class DrawStringWin extends JFrame { private static final long serialVersionUID = 1L; public static void main(String[] args) { public DrawStringWin() { new DrawStringWin().setTitle("문자열 그리기"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 150); setVisible(true); }

47 사각형 그리기 사각형 그리기 drawRoundRect() drawRect(), fillRoundRect()
Section 5 그래픽 프로그래밍 개요 사각형 그리기 사각형 그리기 drawRoundRect() 모서리가 둥근 사각형을 그리는 인자 arcWidth와 argHeight 모서리 부분에 해당하는 타원을 위한 너비와 높이 drawRect(), fillRoundRect() 다양한 메소드

48 실습예제 10-10 직선 그리기 예제 적당한 간격을 유지하여 13개의 직선을 여러 색상으로 그리고
Section 5 그래픽 프로그래밍 개요 실습예제 10-10 직선 그리기 예제 적당한 간격을 유지하여 13개의 직선을 여러 색상으로 그리고 청색으로 4개의 연결된 직선을 그리는 프로그램 13개의 직선에 색상을 다르게 지정하기 위해 switch-case 문을 이용 윈도우의 콘텐트 패인의 크기를 알아 내, 크기 내부에 알맞게 수평선과 직선을 그림

49 실습예제 10-10 직선 그리기 예제 Section 5 그래픽 프로그래밍 개요 package graphics;
case 1: g.setColor(Color.blue); break; case 2: g.setColor(Color.cyan); break; import java.awt.Color; case 3: g.setColor(Color.darkGray); break; import java.awt.Container; case 4: g.setColor(Color.gray); break; import java.awt.Dimension; case 5: g.setColor(Color.green); break; import java.awt.Graphics; case 6: g.setColor(Color.lightGray); break; import javax.swing.JFrame; case 7: g.setColor(Color.magenta); break; case 8: g.setColor(Color.orange); break; public class DrawLineWin extends JFrame { case 9: g.setColor(Color.pink); break; private static final long serialVersionUID = 1L; case 10: g.setColor(Color.red); break; case 11: g.setColor(Color.white); break; public DrawLineWin() { case 12: g.setColor(Color.yellow); break; setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); g.drawLine(10, 40 + i*incHeight, clientWidth + 5, 40 + i*incHeight); setSize(400, 200); setVisible(true); } //Draw PolyLine public void paint(Graphics g) { g.setColor(Color.blue); //get ContentPane int[] xAry = {10, clientWidth/2, clientWidth/2, clientWidth + 5}; Container win = getContentPane(); //윈도를 구성하는 콘텐트페인의 크기를 반환 int[] yAry = {30 + clientHeight/2, 30, clientHeight + 30, 30 + clientHeight/2}; Dimension d = win.getSize(); int clientWidth = d.width; //가로 크기 g.drawPolyline(xAry, yAry, 4); int clientHeight = d.height;//세로 크기 int incHeight = (clientHeight-10) / 12; public static void main(String[] args) { for (int i = 0; i < 13; i++) { new DrawLineWin().setTitle("여러 직선 그리기"); switch (i) { case 0: g.setColor(Color.black); break;

50 타원과 원호, 다각형 그리기 타원과 원호 그리기 다각형 그리기 메소드 drawOval()과 drawArc()를 이용
Section 5 그래픽 프로그래밍 개요 타원과 원호, 다각형 그리기 타원과 원호 그리기 메소드 drawOval()과 drawArc()를 이용 다각형 그리기 메소드 drawPolygon()과 fillPolygon()을 이용

51 실습예제 10-11 타원 그리기 예제 메소드 fillOval()과 클래스 Color를 이용
Section 5 그래픽 프로그래밍 개요 실습예제 10-11 타원 그리기 예제 메소드 fillOval()과 클래스 Color를 이용 다양한 색상으로 임의 크기의 타원을 그리는 예제 스레드를 이용하여 여러 색상의 타원이 계속 그려짐 Runnable을 상속받아 run()을 재정의하고 클래스 JFrame을 상속받아 구현

52 실습예제 10-11 타원 그리기 예제 Section 5 그래픽 프로그래밍 개요 package graphics;
import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics; private int random(int r) { return (int)Math.floor(Math.random() * r); import javax.swing.JFrame; public class DrawOvalWin extends JFrame implements Runnable { private Color randomColor() { return new Color((int) (Math.random()*255), private static final long serialVersionUID = 1L; (int) (Math.random()*255), (int) (Math.random()*255)); public DrawOvalWin() { setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); new Thread(this).start(); public void paint(Graphics g) { Dimension d = getSize(); setSize(400, 200); g.setColor(randomColor()); setVisible(true); int width = random(50); int height = random(50); } g.fillOval(random(d.width), random(d.height), width, height); public void run() { while(true) { repaint(); public static void main(String[] args) { try { new DrawOvalWin().setTitle("여러 타원 그리기"); Thread.sleep(200); } catch(Exception e) { System.out.println(e);

53 6. 글자와 이미지 처리

54 Section 6 글자와 이미지 처리 p460 글자 쓰기 그래픽 객체로 글씨를 쓰기 위해 drawBytes(), drawChars(), drawString() 등의 메소드를 이용 문자열이 그려질 위치의 시작점 좌표 (x, y)로 글자의 베이스라인 위치

55 클래스 Font 폰트를 사용하려면 생성자 먼저 사용할 폰트를 하나 만들고
Section 6 글자와 이미지 처리 클래스 Font 폰트를 사용하려면 먼저 사용할 폰트를 하나 만들고 그래픽 배경 객체의 메소드 setFont()를 호출하여 이용할 폰트를 지정 생성자 폰트 이름과 스타일

56 폰트 관련 여러 정보 폰트의 기본 정보를 조회하는 방법 클래스 FontMetrics 이용
Section 6 글자와 이미지 처리 폰트 관련 여러 정보 폰트의 기본 정보를 조회하는 방법 클래스 FontMetrics 이용 폰트와 관련된 각종 길이 정보를 알기 위한 클래스

57 다양한 폰트로 폰트 이름을 출력 현재 시스템에서 사용가능한 폰트의 목록을 알 수 있는 방법 폰트의 생성과 지정
Section 6 글자와 이미지 처리 다양한 폰트로 폰트 이름을 출력 현재 시스템에서 사용가능한 폰트의 목록을 알 수 있는 방법 폰트의 생성과 지정 윈도우의 중앙에 문자열을 출력하기 위해 FontMetrics를 얻어 출력될 문자열의 길이를 변수 strWidth에 저장

58 실습예제 10-12 여러 폰트에 의한 문자열 그리기 예제
Section 6 글자와 이미지 처리 실습예제 10-12 여러 폰트에 의한 문자열 그리기 예제 시스템에서 이용할 수 있는 폰트의 이름을 알아내 폰트의 이름과 스타일로 문자열을 구성하여 여러 색상으로 화면에 출력

59 실습예제 10-12 Section 6 글자와 이미지 처리 package graphics;
class MyPanel extends JPanel { import java.awt.Color; import java.awt.Dimension; public void paint(Graphics g) { import java.awt.Font; // get window size import java.awt.FontMetrics; Dimension d = getSize(); import java.awt.Graphics; // get client rectangle import java.awt.GraphicsEnvironment; int clientWidth = d.width; import javax.swing.JFrame; int yPrev = 20; import javax.swing.JPanel; // for (int i = 0; i < fontNames.length; i++) { for (int i = 0; i < 6; i++) { public class FontWin extends JFrame { int sIndex = random(styleNames.length); private static final long serialVersionUID = 1L; int fIndex = random(fontNames.length); // set font 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 }; Font curFont = new Font(fontNames[fIndex], styles[sIndex], 12); // make string printed String curStr = fontNames[fIndex] + " " + styleNames[sIndex] + " (" + curFont.getFamily() + ")"; int[] styles = { Font.PLAIN, Font.ITALIC, Font.BOLD, Font.BOLD | Font.ITALIC }; // get exact string width using FontMetrics g.setFont(curFont); String[] styleNames = { "plain", "bold", "italic", "bold/italic" }; FontMetrics curFontMet = g.getFontMetrics(curFont); int strWidth = curFontMet.stringWidth(curStr); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); // set color g.setColor(manyColors[random(manyColors.length)]); String[] fontNames = ge.getAvailableFontFamilyNames(); // set start location int xStart = (clientWidth - strWidth) / 2; public FontWin() { int yStart = curFontMet.getHeight(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); yPrev += yStart; add(new MyPanel()); // draw string g.drawString(curStr, xStart, yPrev); setSize(400, 200); setVisible(true); } private int random(int r) { public static void main(String[] args) { return (int) Math.floor(Math.random() * r); new FontWin().setTitle("폰트 처리");

60 이미지 그리기 ImageIcon 이미지를 윈도에 그리는 가장 간단한 방법
Section 6 글자와 이미지 처리 이미지 그리기 ImageIcon 이미지를 윈도에 그리는 가장 간단한 방법 클래스 ImageIcon으로 객체를 생성하여 JLabel에 삽입하는 방법 그러나 이미지의 크기 조절이 불가능

61 실습예제 10-13 그림을 레이블을 이용하여 윈도에 그리기 Section 6 글자와 이미지 처리
package graphics; public static void main(String[] args) { import javax.swing.ImageIcon; new ImageWin().setTitle("그림 처리"); 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 적절한 크기로 이미지 그리기 Graphics 객체의 drawImage()를 사용 윈도우의 외곽 테두리 크기를 파악
Section 6 글자와 이미지 처리 적절한 크기로 이미지 그리기 Graphics 객체의 drawImage()를 사용 메소드 drawImage(img, x, y, imgWidth, imgHeight, this) 첫 번째 인자인 Image 객체인 img 왼쪽 상단 위치 (x, y)에 그림 크기의 가로와 세로 마지막 인자는 그림의 변환을 알리는 객체로 윈도우 자신을 기술 윈도우의 외곽 테두리 크기를 파악 클래스 Container의 메소드 getInsets()을 이용 Insets in = getInsets(); 반환 값은 Insets의 객체로 속성인 top, left, right, bottom으로 외곽 테두리의 두께의 길이를 알 수 있음

63 실습예제 10-14 윈도에 맞게 이미지 그리기 Section 6 글자와 이미지 처리 package graphics;
//int origWidth = img.getWidth(this); //int origHeight = img.getHeight(this); import java.awt.Graphics; int space = 10; import java.awt.Image; int imgWidth = this.getWidth()-in.left-in.right-2*space; import java.awt.Insets; int imgHeight = this.getHeight()-in.top-in.bottom-2*space; import javax.swing.ImageIcon; import javax.swing.JFrame; g.drawImage(img, in.left + space, in.top + space, imgWidth, imgHeight, this); public class DrawImageWin extends JFrame { private static final long serialVersionUID = 1L; Image img; public static void main(String[] args) { Insets in; new DrawImageWin().setTitle("윈도 그림 처리"); 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) {

64 Thank You !


Download ppt "10장. 이벤트 처리와 그래픽 프로그래밍."

Similar presentations


Ads by Google