본문 바로가기

Java/Theory

Chapter 10. AWT & Applet

Chapter 10. AWT & Applet

1. AWT(Abstract Window Toolkit)

 - GUI Programming을 하기 위한 도구

 - GUI Application의 개발에 필요한 여러 개의 관련 Package와 Class의 집합으로 구성

 - 특징

  · AWT로 작성된 GUI Application은 Platform에 독립적이기 때문에 여러 종류 OS에서 Code를 수정하지 않고 실행이 가능

  · Windows Button과 같은 GUI Component를 직접 구현하지 않고 해당 OS의 Native Component를 사용하기 때문에 AWT로 작성된 GUI Application의 외형은 실행되는 OS마다 달라질 수 있다.

  · 여러 종류의 GUI 기반의 OS들이 공통적으로 가지고 있는 Component만으로 구성해야 하기 때문에 AWT가 제공할 수 있는 GUI Component의 수는 제한적이다.

 - Swing

  · AWT를 확장한 것

  · AWT와는 다르게 순수한 Java로 이루어져 있어 AWT보다 다양하고 풍부한 기능의 Component를 제공한다.

  · Swing의 Class는 AWT의 Class들을 기반으로 만들어진 자식 Class들이므로 AWT와 Swing은 Component의 종류와 사용법만 다를 뿐 나머지는 거의 같다.

 - AWT의 Package

Package

Explain

java.awt

AWT를 이용한 GUI Application을 작성하는데 필요한 기본적인 Class와 Component를 제공

java.awt.datatransfer

여러 Application 사이 또는 단일 Application 내에서의 Data 전송을 구현하는데 필요한 Class와 Interface를 제공

java.awt.dnd

Drag and Drap 기능을 구현하는데 필요한 Class 제공

java.awt.event

GUI Application에서 발생하는 Event를 처리하는데 필요한 Class와 Interface 제공

java.awt.font 

Font와 관련된 Class와 Interface 제공

java.awt.image

이미지를 생성하거나 변경하는데 사용되는 Class 제공

java.awt.print

출력에 관련된 Class와 Interface를 제공

 - Component

  · MenuComponent를 제외한 AWT의 모든 Component의 부모 Class이며 추상 Class이다.

  · Component Class의 조상 Class는 Object Class이다.

  · Component Class와 자식 Class는 Window, Scroll Bar, Button 등 GUI Application Program의 화면을 구성하는데 사용되는 Class이며 AWT Component 또는 Component라고 한다.

  · Component의 종류

  ◦ 일반적인 Component

   ▹ Menu 관련 Component를 제외한 모든 Component 포함

  ◦ Menu Component

   ▹ Menu 관련 Component를 포함

 - Container

  · 다른 Component를 포함할 수 있으며 Button, Label나 다른 Container를 포함할 수 있다.

  · 여러 개의 Overloading된 add Method들이 정의 되어있으며 add Method를 이용해 Container에 다른 Component를 포함시킬 수 있다.

  · Container에 포함된 Component는 Container에 설정된 설정 값(배경색, 전경색, 글자체 등)을 따라가게 된다.

  · 독립적 Container

  ◦ 독립적으로 사용될 수 있으며 다른 Component나 종속적인 Container를 포함할 수 있다.

  ◦ 종류

   ▹ Frame

    ▸  가장 일반적인 Container로 Window와 모양이 같다.

    ▸  Title Bar와 크기 조절 Button, 닫기 Button을 가지고 있다.

    ▸  Menu를 추가할 수 있다.

   ▹ Window

    ▸  Frame의 부모 Container

    ▸  경계선 Title Bar, 크기 조절 Button, 닫기 Button이 없고 Menu 추가가 불가능하다.

    ▸  Component를 담을 수 있는 평면 공간만을 갖는다.

   ▹ Dialog

    ▸  Frame과 같이 Title Bar를 가지고 있지만, Menu는 가질 수 없으며 기본적으로 크기변경이 불가능하다.

    ▸  주로 프로그램 사용자에게 Message를 보여주거나 응답을 받는데 사용한다.

  · 종속적인 Container

  ◦ 독립적으로 사용될 수 없으며 다른 Container에 포함되어야만 한다.

  ◦ 종류

   ▹ Panel

    ▸  평면 공간으로 Frame과 같이 여러 Component를 담을 수 있다.

    ▸  단독적으로는 사용이 불가능하다.

   ▹ ScrollPane

    ▸  Panel과 같은 평면공간이지만 Panel과는 달리 단 하나의 Componet만 포함할 수 있다.

    ▸  자신보다 큰 Component가 포함되면 Scroll Bar가 자동적으로 나타난다.


2. AWT의 주요 Component

 - Frame

  · 다른 Component를 포함할 수 있는 Container

  · 특징

  ◦ Title Bar, 최대화 Button, 최소화 Button, 닫기 Button, 창 크기조절 기능 제공

  ◦ Frame 객체는 생성했다고 해서 화면에 출력되는 것이 아니며 setVisible(true)를 사용해 화면에 나타내야 한다.

 - Button

  · 사용자가 Click 시 어떠한 작업이 수행되도록 Event처리를 할 때 사용

 - Choice

  · 여러 개의 Item이 있는 목록을 보여주고 한 가지를 선택하도록 할 때 Choice를 사용

  · Click해서 Item이 있는 목록을 펼쳐 봐야한다.

 - List

  · Choice처럼 목록중에 원하는 항목을 선택할 수 있도록 할 때 사용

  · Choice와는 달리 Click하지 않아도 모든 목록을 보여주며 Item을 하나 또는 여러 개를 선택할 수 있다.

 - Label

  · 화면에 글자를 표시할 때 사용

  · 설명이나 메시지를 화면에 나타내는데 주로 사용

 - Checkbox

  · boolean과 같이 true/false 또는 on/off와 같이 둘준 한 값을 가질 수 있는 Component

  · 여러 값 중 한가지를 선택할 수 있는 radio Button도 만들 수 있다.

 - TextField

  · 사용자로부터 값을 입력 받을 수 있는 Component

  · 편집이 가능하며 한 줄만 입력할 수 있다.

 - TextArea

  · 여러 줄의 Text를 입력하거나 보여줄 수 있는 Component로 편집이 가능하다.

  · Scroll Bar를 이용해 실제화면에 보이는 것보다 많은 양의 Text를 담을 수 있다.

 - Scrollbar

  · 사용자가 정해진 범위 내에 있는 값을 쉽게 선택할 수 있도록 해주는 Component

  · 속도조절, 색상 선택과 같은 곳에 사용

 - Canvas

  · 빈 평면 공간을 제공하는 Component

  · 그림 그리기, 글 작성을 할 수 있으며 주로 이미지를 위한 공간으로 사용되며 사용자 정의 Component를 만들 때 사용된다.

 - Panel

  · 다른 Component를 자신의 영역 내에 포함시킬 수 있는 Container

  · Panel 자신이 다른 Container에 포함될 수 있고 Panel이 Panel을 포함할 수 있다.

  · Frame과 달리 Title Bar, Button이 없는 단지 비어있는 평면 공간만을 갖는다.

  · Layout을 관리할 때 도움이 많이 된다.

 - ScrollPane

  · 다른 Component를 포함시킬 수 있으나 다른 Container들과는 달리 하나의 Component만을 포함할 수 있다.

  · 제한된 공간에서 크기가 큰 Component를 화면에 보여줄 수 있도록 하는데 사용되며 포함된 Component의 크기가 ScrollPane 자신보다 큰 경우 Scroll Bar를 이용해 볼 수 있게 해준다.

 - Dialog

  · 주로 화면에 Message창을 보여주는데 사용되는 Container

  · Program의 실행중 Error Message를 발생시키거나 File 삭제 전 사용자로부터 응답을 받아야하는 경우 사용된다.

  · Frame과 모양이 유사하다.

  · 필수응답(modal)인 경우(true) 부모로 지정된 Frame은 Dialog가 사라지기 전까지는 사용할 수 없게 된다.

 - FileDialog

  · File을 열거나 저장할 떄 사용되는 Dialog

  · 대부분의 기능들이 이미 구현되어 있어 따로 Code를 추가하지 않아도 된다.


3. AWT의 주요 Component 외의 Class

 - Font

  · 글씨체를 나타낼 시 사용되는 Class

  · Component에서 setFont(Font f) Method를 이용하면 Component에 사용되는 글씨체를 변경할 수 있다.

  · Font Class의 정수형 상수

  ◦ Font Style은 정수형 상수를 통해 나타낼 수 있으며 두 가지 이상의 Style을 사용하기 위해서는 사용할 두 상수를 ‘+’를 이용해 더해서 표현할 수 있다.

  ◦ 상수 종류

   ▹ Font.PLAIN : 보통체

   ▹ Font.BOLD : 굵은 글씨체

   ▹ Font.ITALIC : 기울임체

   ▹ Font.BOLD+Font.ITALIC : 굵은 기울림체

  · Font Class에서 제공하는 글씨체

  ◦ Font Class에서는 기본적으로 5가지 글씨체를 제공하며 System에 설치된 Font를 사용하기 위해서는 GrapicsEnvironment Class를 사용해야한다.

  ◦ 글씨체 종류

   ▹ Serif

   ▹ SansSerif

   ▹ Dialog

   ▹ DialogInput

   ▹ Monospaced

 - Color

  · 색을 표현하기 위해 사용되는 Class

  · RGB 값을 이용해 색을 표현할 수 있는 객체를 생성해 사용할 수 있다.

  · Component의 전경색과 배경색을 설정할 경우 각각 setForeground(Color c), setBackground(Color c)를 사용해 설정한다.


4. Menu

 - Menu를 구성하는 Component

  · Frame에 Menu를 구성하기 위해 사용하는 Component

  · Menu를 구성하는 Component의 부모 Class는 MenuComponent Class이다.

  · Menu 내에 Menu를 담아 계층형 Menu를 구성할 수 있다.

  · Menu 특징

  ◦ MenuBar에는 Menu만 포함할 수 있으며 MenuItem은 포함 시킬 수 없다.

  ◦ Menu에는 Menu와 MenuItem이 포함될 수 있다.

  ◦ 계층형 Menu를 만들고자 할 때는 Menu에 Menu를 포함시키면 된다.

 - PopupMenu

  · 고정적인 Menubar와 달리 Frame 내의 어디서나 Mouse의 오른쪽 Button을 누르면 나타나는 위치가 고정되어 있지 않은 Menu


5. Layout Manager

 - Layout Manager에 포함된 Component의 배치를 자동적으로 관리해주는 역할을 한다.

 - Component의 크기가 변경되어도 배치를 자동적으로 관리해주며 Component를 효율적으로 배치하기 위해서 필수적으로 사용해야 한다.

 - Layout Manager 종류

  · BorderLayout

  · FlowLayout

  · GridLayout

  · CardLayout

  · GridbagLayout

 - Container 별 기본 Layout Manager

  · FlowLayout : Panel, Applet

  · BorderLayout : Window, Dialog, Frame

 - BorderLayout

  · 5개의 영역(North, South, East, West, Center)으로 나누고 각 영역에 하나의 Component만을 배치하는 Layout Manager

  · 한 영역에 하나 이상의 Component를 넣기 위해서는 Panel에 원하는 Component를 넣은 다음 BorderLayout의 한 영역에 해당 Panel을 넣어야 한다.

  · BorderLayout은 Container인 Window, Frame, Dialog의 기본 Layout Manager로 해당 Container의 Layout Manager를 따로 설정하지 않으면 생성될 때부터 이미 BorderLayout으로 설정되어 있다.

 - FlowLayout

  · Component가 추가되는 순서에 따라 왼쪽에서 오른쪽으로 이어나가며 공간이 부족하면 아랫줄에 추가되는 Layout

  · 왼쪽 정렬, 오른쪾 정렬, 가운데 정렬이 가능하다.

 - GridLayout

  · Table처럼 행과 열로 나누어 Component를 배치한다.

  · 추가되는 Component는 모드 같은 크기로 나누어지며 Container의 크기를 변경하면 각 영역이 모두 같은 비율로 커지거나 작아진다.

 - CardLayout

  · 여러 화면을 Slide처럼 바꿔가며 보여줄 수 있는 Layout

  · 여러 개의 Container를 CardLayout을 추가한 다음 순서대로 또는 임의의 Container를 선택해서 보여줄 수 있다.

  · Program 설치시 단계별로 다른 화면으로 이동하는 경우에 사용된다.


6. Event Handling

 - Event

  · 사용자 또는 Program Code에 의해 발생할 수 있는 사건

  · Event 관련 용어

  ◦ Event Source

   ▹ Event가 발생한 Component

   ▹ 사용자가 Button을 눌렀을 때 Event가 발생하고 Button은 이 Event의 Event Source가 된다.

  ◦ Event Handler

   ▹ Event가 발생했을 때 실행될 Code를 구현해 놓은 Class

  ◦ Event Listener

   ▹ Event를 감지하고 처리하는 감지기 역할을 한다.

   ▹ Event Handler를 Event Listener로 Event Source에 연결해야하는 Event가 발생했을 때 Event가 처리된다.

 - Event 상속도


 - Event의 발생과 처리

  · Event Handling은 Exception Handling의 방법과 유사하다.

  · Event의 발생과 처리

  ◦ Event가 발생하면 해당 Event Class의 Instance가 생성된다.

  ◦ Event를 처리할 Listener가 Event Source에 등록되어 씨는지 확인한다.

  ◦ 등록된 Listener 중에서 발생한 Event를 처리할 Listener가 있으면 Listener가 Event를 처리한다.

  ◦  Event를 처리할 Listener가 없으면 아무 일도 일어나지 않는다.

 - Event 처리 방법

  · Event Handling

  ◦ 사용자의 어떠한 동작에 의해서 Event가 발생했을 때 이에 대해 적절한 작업을 수행하도록 하는 것

  · Event 처리 단계

  ◦ Event 처리 시 필요한 Method를 찾는다.

  ◦ 선택한 Method가 속해있는 Interface를 구현하는 Class를 작성한다.

  ◦ 위에서 구현한 Class의 Instance를 생성해서 Event Source에 Listener로 등록한다.

  · Event 종류와 관련 Interface 및 Method

 - Adapter Class

  · Event Handler를 작성 시 Event Handle에 필요한 Method 개수와는 관계없이 해당 Event Listener에 정의된 모든 Abstract Method를 구현하기는 불편하며 이를 해소하기 위해 고안된 Class이다.

  · Event Listener 대신 Adapter Class를 상속받아 원하는 Method만을 작성하는 방식이다.

  · Example

1
2
3
4
5
6
7
8
9
10
11
12
13
class KeyHanler implements KeyListener {
      public void keyPressed(KeyEvent e) {
            System.out.println(e.getKeyChar());
      }
      puglic void keyReleased(KeyEvnet e) { };
      puglic void keyTyped(KeyEvnet e) { };
}
 
class KeyHandler extends KeyAdapter {
      public void keyPressed(KeyEvent e) {
            System.out.println(e.getKeyChar());
      }
}
cs

  ◦ Adapter Class는 Event Listener에 정의된 Method를 아무 내용 없이 구현해 놓았을 뿐이며 이를 상속받은 Class에서 Overriding해서 사용하게 된다.


7. Graphic of AWT

 - paint()

1
2
3
public void paint(Graphics g) {
      ......
}
cs

  · Component에 그림을 그리기위한 것으로 Component Class에 정의되어 있다.

  · 그리고자 하는 Component(Frame, Canvas, Panel 등)의 paint()에 맞게 Overriding하면 된다.
  · Graphics

  ◦ Graphics 객체는 각 Component의 Graphic 관련 정보가 담겨있다.

  ◦ 모든 Component가 가지고 있다.

  ◦ Component에 그림을 그리고자 할 때는 getGraphics()를 호출해서 Component의 Graphics 객체에 대한 참조를 얻어내서 Graphics 객체가 가지고 있는 다양한 Grahpic Method를 이용해 작업한다.

 - AWT Thread & repaint()

  · paint()는 개발자가 직접호출하지 않아도 AWT Thread에 의해서 자동적으로 호출된다.

  · AWT Thread는 GUI Application을 실행하면 자동적으로 생성되는 Daemon Thread로 대기상태에 있다가 화면이 갱신되어야할 상황이 발생되면 paint() 또는 update()를 호출해서 화면이 다시 그려지도록한다.

  · AWT Thread에 의해 자동적으로 화면이 갱신되는 상황

  ◦ 처음 화면에 나타날 때

  ◦ 다른 화면에 가려져 있던 부분이 다시 화면에 나타날 때

  ◦ Icon화 되어 있다가 원래 크기로 화면에 나타날 때

  · AWT Thread에 의해 자동적으로 화면이 갱신되는 상황 외에 화면에 다시 그려지도록 하려면 repaint()를 호출하면 된다.

  · repaint()

  ◦ AWT Thread에게 화면을 다시 그릴 것을 요청한다.

  ◦ 요청을 받은 AWT Thread는 update()를 호출하고 update()는 paint()를 호출한다.

 - Image Class

  · gif, jpg와 같은 ImageFile을 보여주거나 가상화면을 생성하는데 사용하는 Class

  · Example

1
2
3
Toolkit tk = Toolket.getDefaultToolkit();
Image img = tk.getImage(“getjava.gif”);
g.drawImage(img, 00this);
cs

    ※ this를 사용하는 이유

     > 모든 AWT Component는 ImageObserver Interface를 구현했기 때문에 ImageObserver로 Component 자신(this)를 지정한다.


8. Applet

 - Applet


  · Web Browser를 통해 실행될 수 있는 Java Class이다.

  · 특징

  ◦ Applet 관련정보가 포함된 HTML 문서를 작성해야한다.

  ◦ java.exe가 아닌 Web Browser를 통해 실행된다.

  ◦ main Method가 필요없다.

  ◦ Applet은 java.applet.Applet을 상속하는 public Class여야한다.

 - Life cycle & Method

  · Applet 실행과정

  ◦ Web Browser가 Applet이 포함된 HTML 문서를 읽는다.

  ◦ Web Browser가 Applet(Java Class)을 Download한다.

  ◦ Applet이 초기화된다.(init() Method 호출)

  ◦ Applet이 실행된다.(start() Method 호출)

 - Security Restriction

  · Applet은 Network을 통해 외부로부터 자동으로 Download 받는 Program이기 때문에 보안상 잠재적인 위험요소를 가지고 있으며 몇몇 작업을 수행하는 것이 금지되어 있다.

  · 금지된 작업

  ◦ 사용자의 Computer에 있는 실행 File을 실행하는 것

  ◦ 사용자 Computer의 File을 읽거나 쓰기

  ◦ 사용자 Computer의 정보 읽기

  ◦ Applet을 제공한 Server가 아닌 다른 Computer에서 Socket 열기

  ◦ Native Method 호출

 - HTML Tag

  · Applet을 사용하기 위한 HTML Tag

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<APPLET
      [ARCHIVE=archiveList]
      CODE=appletFile.class
      WIDTH=pixels
      HEIGHT=pixels
      [CODEBASE=codebaseURL]
      [ALT=alternateText]
      [NAME=appletInstanceName]
      [ALIGN=alignment]
      [VSPAGE=pixels]
      [HSPACE=pixels]
>
      [<PARAM NAME=appletAttribute1 VALUE=value>]
      [<PARAM NAME=appletAttribute2 VALUE=value>]
      ...
</APPLET>
cs

  ◦ ARCHIVE

   ▹ Applet 사용되는 Class File이나 Image File이 담긴 jar File을 지정하는데 사용

   ▹ jar File이 하나 이상일 때는 쉼표(,)를 구분자로 사용

  ◦ CODE

   ▹ Applet Class의 Class File을 지정하는데 사용

   ▹ [Package Name].[Class Name].class 형태로 지정

  ◦ WIDTH, HEIGHT

   ▹ Applet이 Web Browser에 보여질 영역의 폭과 넓이를 지정하는데 사용

  ◦ CODEBASE

   ▹ Applet을 Download할 경로(URL)을 지정하는데 사용

   ▹ 이 Option이 없으면 Applet이 담긴 HTML의 경로가 codebase가 됨

  ◦ ALT

   ▹ <APPLET> Tag를 이해하지 못하는 Web Browser에서 Applet 대신 보여줄 Text를 지정하는데 사용

  ◦ NAME

   ▹ Applet의 이름을 지정하는데 사용

   ▹ 하나의 HTML Page에 둘 이상의 Applet이 있을 때 서로 구별되도록 할 수 있음

  ◦ ALIGN

   ▹ Applet의 정렬위치를 지정하는데 사용

   ▹ HTML의 Tag에 사용되는 align Option(left, right, top, bottom 등)과 동일한 값이 사용될 수 있음 

  ◦ VSPACE, HSPACE

   ▹ Applet의 외부 여백을 지정하는데 사용

  ◦ <PARAM NAME=attribute VALUE=value>

   ▹ 외부에서 Applet에 값을 전달할 떄 사용

   ▹ Java Application을 실행할 때 Command Line에서 값을 입력하는 것과 유사

   ▹ Applet 내부에서는 getParameter(String name) Method를 사용해서 값을 읽을 수 있음

'Java > Theory' 카테고리의 다른 글

Chapter 9. Thread  (0) 2015.08.22
Chapter 8. Useful Classes II  (0) 2015.08.19
Chapter 7. Useful Classes I  (0) 2015.08.19
Chapter 6. Collection Framework  (0) 2015.08.19
Chapter 5. Inner Class  (0) 2015.08.19