이벤트 처리와
그래픽 프로그래밍
단원 10 이벤트 처리와 그래픽 프로그래밍
❖
이벤트 처리 개념을 이해하고 관련 클래스와 리스너를 활용할 수 있다.▪
• 이벤트 처리 개요와 관련 클래스▪
• 이벤트 객체와 이벤트 리스너▪
• 스윙의 주요 클래스와 계층구조❖
이벤트 처리를 위한 다양한 프로그래밍을 할 수 있다.▪
• 버튼의 이벤트 프로그래밍, • 마우스의 이벤트 프로그래밍▪
• 이벤트 리스너의 구현❖
이벤트 처리에서 어댑터 클래스의 필요성을 이해하고 프로그래밍에 활용할 수 있다.▪
• 어댑터 클래스의 필요성과 주요 어댑터 클래스❖
다양한 콤포넌트에서 이벤트 처리 프로그래밍을 할 수 있다.▪
• 콤포넌트, 아이템 이벤트 처리, • 콘테이너, 포커스 이벤트 처리❖
그래픽 프로그래밍 개요를 이해하고 글자와 이미지 처리 프로그래밍을 할 수 있다.▪
• 그래픽 프로그래밍을 이해하고 색상과 문자열, 직선과 사각형 그리기▪
• 글자를 위한 폰트 처리와 이미지 처리2
단원 10 이벤트 처리와 그래픽 프로그래밍 3
1. 이벤트 처리 개요
단원 10 이벤트 처리와 그래픽 프로그래밍
이벤트 개요와 이벤트 처리
❖ 이벤트
▪
컴포넌트는 적절한 이벤트(event)를 통하여 사용자 또는 시스템과 대화•
예를 들어 하나의 컴포넌트 위에서 마우스를 클릭– 이에 대한 반응으로 이 컴포넌트는 마우스 클릭에 대한 이벤트가 발생
❖ 이벤트 소스
▪
사용자나 시스템 이벤트를 발생시킨 진원지❖ 이벤트 리스너
▪
이벤트를 수용(listen)하는 개체•
특정한 이벤트 정보는 인터페이스인 이벤트 리스너(event listener)의 메소드로 전달4
단원 10 이벤트 처리와 그래픽 프로그래밍
이벤트 처리 구현 개념
❖ 자바의 이벤트를 처리
▪
[절차 1: 이벤트 리스너 구현]•
이벤트 리스너를 상속받아 필요한 메소드의 구현▪
[절차 2: 이벤트 리스너 등록]•
이벤트를 받는 컴포넌트에서 이벤트 리스너를 등록5
단원 10 이벤트 처리와 그래픽 프로그래밍
이벤트 클래스
❖ 다양한 이벤트 종류
▪
액션이벤트(ActionEvent)와 마우스이벤트(MouseEvent) 등▪
사용자의 특정한 행동에 대응하는 다양한 이벤트를 제공6
단원 10 이벤트 처리와 그래픽 프로그래밍
이벤트 계층 구조
❖ 이벤트 관련 최상위 클래스인 EventObject
▪
이벤트를 발생한 객체를 반환하는 getSource() 메소드를 제공7
단원 10 이벤트 처리와 그래픽 프로그래밍
컴포넌트와 발생 가능한 이벤트 객체
❖ 다양한 이벤트 종류 중에서 어느 이벤트를 인지하여 처리할 수 있는지 정리한 표
8
단원 10 이벤트 처리와 그래픽 프로그래밍
이벤트 리스너 개요
❖ 이벤트 리스너
▪
발생한 이벤트를 받아 호출되는 추상 메소드가 있는 인터페이스▪
MouseListener 소스9
단원 10 이벤트 처리와 그래픽 프로그래밍
이벤트 리스너 계층 구조
❖ 이벤트 리스너
▪
패키지 java.awt.event에 소속된 최상위 인터페이스인 EventListener를 상속10
단원 10 이벤트 처리와 그래픽 프로그래밍
이벤트 리스너의 추상 메소드
❖ 인터페이스인 이벤트 리스너
▪
특정한 이벤트에 따라 구현해야 할 메소드가 추상 메소드로 정의11
단원 10 이벤트 처리와 그래픽 프로그래밍 12
2. 이벤트 처리 프로그래밍 기초
단원 10 이벤트 처리와 그래픽 프로그래밍
첫 이벤트 프로그래밍
❖ 이벤트 처리를 위해서는 다음 두 단계의 처리가 반드시 필요
▪
[절차 1: 이벤트 리스너 구현]•
이벤트 리스너를 상속받아 필요한 메소드의 구현– 버튼에 대한 액션이벤트 처리를 위하여 ActionListener를 구현
▪
[절차 2: 이벤트 리스너 등록]•
이벤트를 받는 컴포넌트에서 이벤트 리스너를 등록– 버튼 객체는 버튼객체.addActionListener(리스너구현객체) 메소드 호출
13
단원 10 이벤트 처리와 그래픽 프로그래밍
이벤트 리스너의 구현과 이벤트 리스너 등록
❖ 이벤트 리스너 구현
▪
주 윈도우 클래스 ButtonActionWin•
인터페이스 ActionListener를 상속받아 추상 메소드인 actionPerformed(…)를 구 현해야❖ 이벤트 리스너 등록
▪
이벤트를 받는 버튼 btnOk, btnCancel 객체•
메소드 addActionListener(리스너가구현된객체)를 이용14
단원 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("버튼 액션 이벤트 처리");
} }
단원 10 이벤트 처리와 그래픽 프로그래밍
마우스의 누름과 놓음 처리
❖ 프레임 내부에서 마우스를 누른(press)후 다시 놓는(release) 이벤트 처리를 구현
16
단원 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)
단원 10 이벤트 처리와 그래픽 프로그래밍
MouseListenr 와 MouseEvent
❖ MouseListenr 의 메소드
❖ MouseEvent 의 변수와 메소드
18
단원 10 이벤트 처리와 그래픽 프로그래밍
MouseMotionListener
❖
마우스 이동(move)과 드래그(drag)에 대한 이벤트를 처리하는 리스너❖
마우스의 클릭과 이동에 대한 이벤트 처리▪ MouseListener, MouseMotionListener를 상속받아 7개의 메소드를 모두 구현
▪ 또는 간단히 리스너 MouseInputListener 하나를 상속받아 구현
19
단원 10 이벤트 처리와 그래픽 프로그래밍
마우스 이벤트 예제를 위한 화면 구성
❖ 레이블인 s1, s2, s3
▪
각각 Pressed/Released 와 Entered/Exited/Clicked 그리고
Dragged/Moved 정보 를 출력
20
단원 10 이벤트 처리와 그래픽 프로그래밍
마우스 이벤트를 위한 7가지 메소드 구현
❖ 이벤트 구현을 위한 내부 클래스 MyMouseListener
▪
MouseListener의 5가지 메소드와 MouseMotionListener의 2가지 메소드를 구 현21
단원 10 이벤트 처리와 그래픽 프로그래밍
이벤트 리스너 4가지 구현 방법
❖
이벤트 리스너를 구현하는 4가지 방법▪ [방법 1: 일반 구현]
•
원도우 구현 클래스에서 인터페이스 이벤트 리스 너를 상속받아 구현▪ [ 방법 2: 내부 구현]
•
원도우 내부에서 내부 클 래스로 인터페이스 이벤 트 리스너를 구현▪ [ 방법 3: 익명 구현]
•
이벤트 리스너 등록 시 익명의 클래스로 리스너 를 직접 구현▪ [ 방법 4: 외부 구현]
•
외부의 새로운 클래스로 인터페이스 이벤트 리스 너를 구현22
단원 10 이벤트 처리와 그래픽 프로그래밍
버튼 클릭 이벤트 처리
❖ 4 가지 방식으로 모두 구현
▪
버튼의 ActionEvent에 대한 이벤트 처리❖ 기능
▪
윈도 전체에 버튼을 하나 구성▪
버튼을 누르면 윈도우 캡션에 버튼이름과 버튼을 클릭한 횟수 표시23
단원 10 이벤트 처리와 그래픽 프로그래밍
일반 구현과 내부 구현
24
단원 10 이벤트 처리와 그래픽 프로그래밍
익명 구현과 외부 구현
25
단원 10 이벤트 처리와 그래픽 프로그래밍 26
3. 어댑터 클래스
단원 10 이벤트 처리와 그래픽 프로그래밍
어댑터 클래스 개요
❖
어댑터 클래스 필요성▪ MouseListener와 MouseMotionListener의 메소드는 각각 5개와 2개
▪ 7개의 메소드 중에서 처리할 메소드가 총 3개라도
•
나머지 필요 없는 메소드도 아무 문장 없이 구현해야 하는 번거로움이 발생▪ 이러한 불편을 제거하기 위해
•
어댑터 클래스는 리스너의 메소드를 구현 선언한 후 아무 문장이 없는 메소드를 미리 구현해 놓은 클 래스27
단원 10 이벤트 처리와 그래픽 프로그래밍
주요 어댑터 클래스
28
단원 10 이벤트 처리와 그래픽 프로그래밍
어댑터 클래스를 사용한 마우스 이동 구현
❖ 마우스 이동에 대한 이벤트만을 처리
▪
MouseAdapter 또는 MouseMotionAdapter로부터의 상속을 선언•
필요한 메소드인 mouseMoved()만을 구현29
단원 10 이벤트 처리와 그래픽 프로그래밍 30
4. 다양한 이벤트 처리
단원 10 이벤트 처리와 그래픽 프로그래밍
컴포넌트의 다양한 변화에 따른 이벤트
❖
컴포넌트 이벤트▪ 컴포넌트의 컴포넌트의 보임, 사라짐, 이동, 크기의 변화에 따라 발생
▪ JMenuItem과 JCheckBoxMenuItem을 제외한 대부분의 컴포넌트에서 발생
❖
클래스 ComponentEvent▪ ComponentEvent의 메소드 getComponent()
•
이벤트를 발생시킨 컴포넌트를 반환31
단원 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("콤포넌트 이벤트 처리");
} }
단원 10 이벤트 처리와 그래픽 프로그래밍
ItemEvent
❖
ItemEvent를 발생시키는 컴포넌트▪ JCheckBox, JList, JComboBox, JCheckBox, MenuItem 등
▪ ItemEvent를 처리하려면 인터페이스 ItemSelectable을 상속받아 구현
▪ 컴포넌트 자체나 또는 컴포넌트를 구성하는 항목이 on/off 또는 selected/deselected 등의 이원화된 상태를 갖는 특성
❖
ItemListener 메소드❖
ItemEvent의 상수와 메소드33
단원 10 이벤트 처리와 그래픽 프로그래밍
JCheckBoxMenuItem 에서 이벤트 처리
❖ 메뉴 구성을 위한 컴포넌트는 JMenu와 JCheckBoxMenuItem
▪
메뉴 하부에 다른 메뉴를 하부로 배치하려면•
mainMenu.add(submenu)❖ JCheckBoxMenuItem
▪
선택/비선택을 선택하는 메뉴항목을 위한 컴포넌트▪
메소드 addItemListener(리스너구현객체)•
메소드 itemStateChanged()를 구현한 객체를 등록하여 이벤트를 처리34
단원 10 이벤트 처리와 그래픽 프로그래밍
실습예제 10-6
❖ JCheckBox 와 JCheckBoxMenuItem에서 ItemEvent 처리 예제
▪
메뉴 JCheckBoxMenuItem과 JCheckBox에서 체크박스 선택에 따라 이벤트를 처리•
윈도우 중앙 JList와 하단 JLable에 ItemEvent 현황을 표시하는 프로그램35
단원 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("아이템이벤트 처리");
} }
단원 10 이벤트 처리와 그래픽 프로그래밍
컨테이너 이벤트
❖ 컨테이너 이벤트
▪
컨테이너 컴포넌트에서 발생하는 이벤트•
Container, JDialog, JFrame, JPanel, Jwindow▪
컨테이너 이벤트를 처리하는 리스너•
ContainerListener▪
ContainerListener 메소드▪
ContainerEvent 소속37
단원 10 이벤트 처리와 그래픽 프로그래밍
컨테이너 이벤트 처리 예제
❖
레이블, 패널, 버튼으로 구성▪ 추가되는 여러 버튼을 배열로 처리
•
클래스 Vector를 이용▪ 윈도 상단에 레이블, 중간에 패널
▪ 하단에 [Add button]과 [Remove button] 버튼을 배치
•
[Add button] 버튼을 누르면 새 로운 버튼이 하나 생성•
[Remove button] 버튼을 누르 면 마지막에 생긴 버튼부터 하나 씩 제거•
버튼이 새로이 추가되거나 삭제되 면 레이블에 그 상태를 기록38
단원 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) {
단원 10 이벤트 처리와 그래픽 프로그래밍
이벤트 포커스
❖ 클래스 Component로부터 상속받는 모든 컴포넌트에서 처리할 수 있는 이벤 트
❖ FocusListener
▪
포커스 이벤트를 처리하는 리스너❖ FocusAdapter
▪
FocusListener의 어댑터 클래스40
단원 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);
단원 10 이벤트 처리와 그래픽 프로그래밍 42
5. 그래픽 프로그래밍 개요
단원 10 이벤트 처리와 그래픽 프로그래밍
그래픽 배경
❖ 그래픽 배경(Graphics Context)
▪
그림이 그려지는 논리적인 화면▪
여기에 그려진 화면은 다시 화면이나 프린터로 출력43
단원 10 이벤트 처리와 그래픽 프로그래밍
클래스 Graphics
❖
Graphics▪ 그림을 그리는데 필요한 각종 기능을 제공하는 추상 클래스
•
즉 사각형, 타원, 원호와 같이 다양한 형태를 그리는 메소드•
글자체인 폰트와 문자열, 색상•
이미지에 관련된 다양한 메소드를 제공▪ 개념적으로 여러 종류의 그림을 그리기 위한 붓이나 팔레트
❖
그래픽 객체를 사용하는 메소드▪ 그림을 그리는 모듈은 대부분 paint()나 update() 또는 paintComponent() 메소드에서 구현
❖
그래픽 배경에서의 좌표44
단원 10 이벤트 처리와 그래픽 프로그래밍
❖ 각종 색상을 생성하여 활용
▪
그래픽 배경(graphics context)의 전경화면(foreground) 색상을 지정•
Graphics의 메소드 setColor()를 이용▪
Component•
메소드 setBackground()와 setForeground()– 각각 구성 요소의 배경화면(background)과 전경화면의 색상 지정
❖ 클래스 Color의 생성자
❖ 색상 상수와 RGB
클래스 Color
45
단원 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) {
// 윈도를 구성하는 콘텐트페인의 크기를 반환
단원 10 이벤트 처리와 그래픽 프로그래밍
사각형 그리기
❖ 사각형 그리기
▪
drawRoundRect()•
모서리가 둥근 사각형을 그리는•
인자 arcWidth와 argHeight– 모서리 부분에 해당하는 타원을 위한 너비와 높이
▪
drawRect(), fillRoundRect()•
다양한 메소드47
단원 10 이벤트 처리와 그래픽 프로그래밍
실습예제 10-10
❖ 직선 그리기 예제
▪
적당한 간격을 유지하여 13개의 직선을 여러 색상으로 그리고▪
청색으로 4개의 연결된 직선을 그리는 프로그램▪
13개의 직선에 색상을 다르게 지정하기 위해 switch-case 문을 이용▪
윈도우의 콘텐트 패인의 크기를 알아 내, 크기 내부에 알맞게 수평선과 직선을 그림48
단원 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;
단원 10 이벤트 처리와 그래픽 프로그래밍
타원과 원호, 다각형 그리기
❖ 타원과 원호 그리기
▪
메소드 drawOval()과 drawArc()를 이용❖ 다각형 그리기
▪
메소드 drawPolygon()과 fillPolygon()을 이용50
단원 10 이벤트 처리와 그래픽 프로그래밍
실습예제 10-11
❖ 타원 그리기 예제
▪
메소드fillOval()
과 클래스Color
를 이용•
다양한 색상으로 임의 크기의 타원을 그리는 예제▪
스레드를 이용하여 여러 색상의 타원이 계속 그려짐•
Runnable을 상속받아 run()을 재정의하고 클래스 JFrame을 상속받아 구현51
단원 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) {
단원 10 이벤트 처리와 그래픽 프로그래밍 53
6. 글자와 이미지 처리
단원 10 이벤트 처리와 그래픽 프로그래밍
글자 쓰기
❖ 그래픽 객체로 글씨를 쓰기 위해
▪
drawBytes(), drawChars(), drawString() 등의 메소드를 이용▪
문자열이 그려질 위치의 시작점•
좌표 (x, y)로 글자의 베이스라인 위치54
단원 10 이벤트 처리와 그래픽 프로그래밍
클래스 Font
❖ 폰트를 사용하려면
▪
먼저 사용할 폰트를 하나 만들고▪
그래픽 배경 객체의 메소드 setFont()를 호출하여 이용할 폰트를 지정❖ 생성자
▪
폰트 이름과 스타일55
단원 10 이벤트 처리와 그래픽 프로그래밍
폰트 관련 여러 정보
❖ 폰트의 기본 정보를 조회하는 방법
❖ 클래스 FontMetrics 이용
▪
폰트와 관련된 각종 길이 정보를 알기 위한 클래스56
단원 10 이벤트 처리와 그래픽 프로그래밍
다양한 폰트로 폰트 이름을 출력
❖ 현재 시스템에서 사용가능한 폰트의 목록을 알 수 있는 방법
❖ 폰트의 생성과 지정
❖ 윈도우의 중앙에 문자열을 출력하기 위해
▪
FontMetrics를 얻어 출력될 문자열의 길이를 변수 strWidth에 저장57
단원 10 이벤트 처리와 그래픽 프로그래밍
실습예제 10-12
❖ 여러 폰트에 의한 문자열 그리기 예제
▪
시스템에서 이용할 수 있는 폰트의 이름을 알아내 폰트의 이름과 스타일로 문자열 을 구성하여 여러 색상으로 화면에 출력58
단원 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;
단원 10 이벤트 처리와 그래픽 프로그래밍
이미지 그리기
❖ ImageIcon
▪
이미지를 윈도에 그리는 가장 간단한 방법•
클래스 ImageIcon으로 객체를 생성하여 JLabel에 삽입하는 방법•
그러나 이미지의 크기 조절이 불가능60
단원 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);
}
단원 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
단원 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);