Transcript 14장

14장. 그래피컬 사용자
인터페이스
public class SumTest {
public static void main(String a1[])
{
int a, b, sum;
a = Integer.parseInt(a1[0]);
b = Integer.parseInt(a1[1]);
sum = a + b ; // 두 수를 더하는 부분입니다
System.out.println("두수의 합은 " + sum + "입니다");
}
}
1
학습목표
사용자 인터페이스인 GUI의 개념에 대해 학습한다.
자바에서 제공되는 GUI인 AWT와 스윙(Swing)의 차이점에 대해 학습한다.
AWT 패키지의 주요 클래스의 메소드에 관해 학습한다.
프레임 클래스에 관해 사용방법을 학습한다.
배치관리자에 대해 학습한다.
프레임에 배치할 수 있는 패널에 대해 학습한다.
패널에서의 그래픽 사용과 컬러의 사용에 대해 학습한다.
2
 목차
 section 1 AWT와 스윙(Swing)
-
1-1 AWT(Abstract Window Toolkit)
-
1-2 스윙(Swing)
 section 2 AWT 패키지와 주요 클래스
-
2-1 java.awt 패키지
-
2-2 Component 클래스
-
2-3 Container 클래스
 section 3 프레임(Frame)
3
 목차
 section 4 배치관리자 (Layout Manager)
-
4-1 FlowLayout 클래스
-
4-2 BorderLayout 클래스
-
4-3 GridLayout 클래스
 section 5 패널(Panel)
 section 6 패널에서의 그래픽 사용
 section 7 색의 사용
 section 8 글꼴(Font)의 사용
4
1 AWT와 스윙(Swing)
1-1 TCP/IP(Transmission Control Protocol/Internet Protocol)
 사용자 인터페이스(User Interface)
-
일반적인 응용 프로그램이나 웹 프로그램에서 사용자가 접속하는 부분
 GUI(Graphical User Interface)
-
사용자 인터페이스에 다양한 그래픽을 적용한 것
-
“goo-ee”라고 부름
14장. 그래피컬 사용자 인터페이스
5
1 AWT와 스윙(Swing)
1-1
AWT(Abstract Window Toolkit)
 AWT(Abstract Window Toolkit)
-
자바 언어는 초기에 GUI를 제공하기 위해 패키지를 제공
 윈도와 Linux에서 실행된 AWT 컴포넌트의 예
462 page
14장. 그래피컬 사용자 인터페이스
6
1 AWT와 스윙(Swing)
1-2
스윙(Swing)
 스윙(Swing)
-
선(sun)사가 넷스케이프사와 공동으로 개발한 새로운 그래픽 툴킷(toolkit)
-
자바의 표준 클래스인 JFC(Java Foundation Classes)로 제공되고 있으며 JDK에 포함
-
스윙은 AWT와 달리 그래픽을 JVM이 자체적으로 처리
14장. 그래피컬 사용자 인터페이스
7
1 AWT와 스윙(Swing)
1-2
스윙(Swing)
 AWT 패키지와 스윙 패키지의 관련도
463 page
14장. 그래피컬 사용자 인터페이스
8
1 AWT와 스윙(Swing)
1-2
스윙(Swing)
 스윙 컴포넌트의 예
463 page
14장. 그래피컬 사용자 인터페이스
9
2 AWT 패키지와 주요 클래스
2-1
java.awt 패키지
 java.awt 패키지
-
GUI 구축을 위한 컴포넌트 클래스뿐만 아니라 다른 클래스들도 많이 제공
 java.awt 패키지에서 제공되는 클래스들의 유형별 분류
유형 구분
컴포넌트의 배치와 관련된
클래스
GUI 구성과 관련된 클래스
그래픽 출력과 관련된 클래스
클래스 명
BorderLayout, FlowLayout, GridLayout, GridBagLayout,
GridBagConstraints, CardLayout
Button, Label, Canvas, Checkbox, Choice, Scrollbar, Component,
List, Menu, TextComponent, TextArea, MenuBar, MenuItem, TextField,
CheckboxGroup, CheckboxMenuItem, MenuComponent
Color, Font, FontMetrics, Rectangle, Point, Polygon, Graphics,
Image
컨테이너 클래스
Frame, Panel, Window, Container, FileDialog, Dialog
그 외의 클래스
Insets, Dimension, Toolkit, Event, MediaTracker
14장. 그래피컬 사용자 인터페이스
10
2 AWT 패키지와 주요 클래스
2-2
Component 클래스
 Component 클래스
-
추상 클래스로
-
그래피컬 사용자 인터페이스(GUI) 구축에 필요한 많은 하위 클래스를 가지고 있음
-
약 100여 개의 메소드가 제공
14장. 그래피컬 사용자 인터페이스
11
2 AWT 패키지와 주요 클래스
2-2
Component 클래스
 Component 클래스의 주요 메소드
유형 구분
클래스 명
Image createImage(int width, int height)
width, height 크기의 Image 객체를 생성하여 반환
Font getFont()
현재 설정된 폰트를 폰트 객체로 반환
FontMetrics getFontMetrics(Font font)
font 폰트에 관한 FontMetrics 객체를 반환
Color getForeground()
전경색(foreground)을 Color 객체로 반환
Dimension getSize()
현재 컴포넌트의 크기를 Dimension 객체로 반환
void paint(Graphics g)
현재의 컴포넌트에 Graphics 객체 g를 이용하여 그림을 그리는 메소드
void repaint()
JVM에 update() 메소드 호출을 요청한다.
void setBackground(Color c)
배경색을 c로 설정
void setFont(Font f)
폰트를 f로 설정
void setForeground(Color c)
전경색을 c로 설정
void setSize(int x, int y)
컴포넌트의 크기를 x, y 값으로 설정한다. x, y 값은 픽셀 단위이다.
void setVisible(boolean b)
b가 true일 경우 컴포넌트를 화면에 나타낸다.
public void update(Graphics g)
컴포넌트를 배경색으로 채우고 paint() 메소드를 호출한다.
14장. 그래피컬 사용자 인터페이스
12
2 AWT 패키지와 주요 클래스
2-3
Container 클래스
 Container 클래스
-
Component 클래스의 하위 클래스로서 컴포넌트를 담는 쟁반 역할을 하는 클래스
-
사용되는 쟁반 역할을 하는 클래스는 JFrame, JPanel, Applet, JApplet 클래스
14장. 그래피컬 사용자 인터페이스
13
2 AWT 패키지와 주요 클래스
2-3
Container 클래스
 Container 클래스의 주요 메소드
유형 구분
클래스 명
Component add(Component c)
컴포넌트 c를 현재의 컨테이너에 추가하고 c를 반환
Component add(Component c, int
position)
컴포넌트 c를 position이 지정하는 위치에 추가
void remove(Component c)
컴포넌트 c를 현재의 컨테이너에서 제거
void setLayout(LayoutManager lm) lm으로 지정된 배치관리자를 현재 컨테이너의 배치관리자로 설정
void addContainerListener(Contain
이벤트를 받아들이기 위한 이벤트 리스너를 등록
erListener cl)
void removeContainerListener(Co
이벤트 리스너의 등록을 해제
ntainerListener cl)
14장. 그래피컬 사용자 인터페이스
14
3 프레임(Frame)
 응용 프로그램에서 GUI를 구축하기 위해서는 프레임 클래스를 이용
 JFrame 클래스
-
Component → Container → Window → Frame → JFrame 형태로 상속된 클래스
 JFrame 클래스 생성자
형식
public JFrame()
public JFrame(String title)
14장. 그래피컬 사용자 인터페이스
15
3 프레임(Frame)
 JFrame 클래스의 메소드
메소드
설명
public Container getContentPane()
현재의 프레임에 대한 Container 객체를 반환
void setDefaultCloseOperation
(int operation)
프레임의 오른쪽 상단에 묵시적으로 “close” 버튼을 만든다.
operation은 상수를 의미하며, 일반적으로 EXIT_ON_CLOSE를
지정하여 프레임을 종료시킨다.
void setJMenuBar
(JMenuBar menubar)
프레임에 menubar를 설정한다.
void setTitle(String title)
프레임의 타이틀바에 title로 지정된 문자열을 나타낸다. 이 메
소드는 java.awt 패키지인 Frame 클래스로부터 상속된 클래
스이다.
14장. 그래피컬 사용자 인터페이스
16
3 프레임(Frame)
 실습예제
FrameTest1.java
01
02
03
04
05
06
07
08
import javax.swing.*;
public class FrameTest1{
public static void main(String[] args) {
JFrame jf = new JFrame("Test Frame");
jf.setSize(400,300);
jf.setVisible(true);
}
}
swing 패키지를 포함
JFrame 클래스로부터 객체 생성
객체(프레임) 크기 설정
객체를 나타냄
 프로그램 설명
-
01
: 프로그램에서는 JFrame 클래스를 사용하기 위해 swing 패키지를 포함시킨다.
-
04
: “Test Frame” 제목을 가지고 프레임 객체를 생성하였다.
-
05~06
: JFrame 클래스의 상위 클래스인 Component 클래스에 선언된 메소드이다.
setSize() 메소드는 프레임의 크기를 설정하는 메소드이고, setVisible() 메소드는 컴포넌트를
화면에 나타내는 메소드이다.
14장. 그래피컬 사용자 인터페이스
17
3 프레임(Frame)
14장. 그래피컬 사용자 인터페이스
18
3 프레임(Frame)
 실습예제
FrameTest2.java
01
02
03
04
05
06
07
08
09
10
11
12
import javax.swing.*;
swing 패키지를 포함
import java.awt.*;
awt 패키지 포함
public class FrameTest2{
public static void main(String[] args) {
JFrame jf = new JFrame("Test Frame(버튼포함)");
Container ct = jf.getContentPane();
Container(쟁반 역할) 객체 생성
JButton jb = new JButton("테스트버튼");
버튼 객체 생성
ct.add( jb);
버튼을 쟁반에 추가
jf.setSize(400,300);
jf.setVisible(true);
}
}
14장. 그래피컬 사용자 인터페이스
19
3 프레임(Frame)
 프로그램 설명
-
01~02
: JFrame, JButton 클래스들은 swing 패키지에 속한 클래스이고, Container 클래스
는 awt 패키지에 속한 클래스이다. 두 개의 패키지를 포함하여 프로그램을 작성하였다.
-
06
: Container 클래스는 그릇을 담는 쟁반 역할을 수행하는 클래스이다.
getContentPane() 메소드는 JFrame 클래스에 선언된 메소드로서 Container 클래스의 객체
를 반환하는 메소드이다. jf.getContentPane() 메소드는 jf(프레임 객체)와 연관된 Container
객체를 반환한다. Container 객체는 그릇 역할을 하므로 이 컨테이너에 추가되는 모든 컴포
넌트들은 프레임에 나타나게 된다.
-
07
: JButton 클래스로 버튼 객체를 생성하였다(16장에서 JButton 클래스 설명).
-
08
: 생성된 버튼 객체를 Container 객체에 추가하였다.
14장. 그래피컬 사용자 인터페이스
20
3 프레임(Frame)
14장. 그래피컬 사용자 인터페이스
21
4 배치관리자(Layout Manager)
 배치관리자
-
애플릿이나 컨테이너에 컴포넌트를 자동으로 배치
-
프로그램 작성자는 컴포넌트가 위치할 좌표를 계산할 필요가 없음
-
사용자가 애플릿의 크기를 변형시켰을 때도 배치관리자는 재배치를 자동으로 수행
14장. 그래피컬 사용자 인터페이스
22
4 배치관리자(Layout Manager)
4-1
FlowLayout 클래스
 FlowLayout 클래스 생성자
형식
FlowLayout()
FlowLayout(int align)
FlowLayout(int align, int hgap, int vgap)
14장. 그래피컬 사용자 인터페이스
23
4 배치관리자(Layout Manager)
4-1
FlowLayout 클래스
 실습예제
FlowLayoutTest.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
import javax.swing.*;
import java.awt.*;
class FlowLayout1 extends JFrame{
JFrame 클래스로부터 상속
public FlowLayout1(){
생성자
Container ct = getContentPane();
Container(쟁반 역할) 객체 생성
오른쪽 정렬 layout 객체 생성
FlowLayout f = new FlowLayout(FlowLayout.RIGHT, 10, 15);
ct.setLayout(f);
쟁반 객체에 layout 설정
for ( int i = 1; i<=15 ; i++)
쟁반에 버튼 15개 추가
ct.add(new JButton("버튼"+i));
setTitle("FlowLayout Test");
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
public class FlowLayoutTest {
public static void main(String[] args) {
new FlowLayout1();
객체 변수 없이 객체 생성
}
}
14장. 그래피컬 사용자 인터페이스
24
4 배치관리자(Layout Manager)
4-1
FlowLayout 클래스
 프로그램 설명
-
03
: JFrame 클래스로부터 상속받아 클래스를 생성하였다. JFrame 클래스의 모든 특성을
상속받는다.
-
05
: 객체 변수 없이 getContentPane() 메소드가 사용되었다. 메소드 앞에 객체 변수명이
없을 경우는 현재의 객체를 의미한다. 즉 현재 클래스에서 이 메소드를 탐색하고 없으면 상
위 클래스로 가서 탐색하여야 한다. 이 메소드는 JFrame 클래스에서 선언된 메소드이다. 프
레임과 연관된 Container 객체를 반환한다.
-
06
: layout 객체를 생성한다. FlowLayout 클래스의 생성자를 이용하여 오른쪽 정렬과 버
튼 사이의 간격을 지정하여 객체를 생성하였다.
-
07
: 생성된 layout 객체를 이용하여 쟁반 객체인 Container 객체의 정렬 방법을 설정하였
다.
-
08~09
-
18
: 설정된 쟁반 객체에 15개의 버튼을 생성하여 추가하였다.
: 객체 변수 없이 클래스로부터 객체를 생성하는 문장이다. 객체 변수가 필요하지 않을
경우 위와 같이 객체만 생성하면 된다.
14장. 그래피컬 사용자 인터페이스
25
4 배치관리자(Layout Manager)
4-1
FlowLayout 클래스
14장. 그래피컬 사용자 인터페이스
26
4 배치관리자(Layout Manager)
4-2
BorderLayout 클래스
 BorderLayout 클래스
-
컴포넌트를 프레임에 추가할 때 방향을 지정하여 추가할 수 있도록 해주는 클래스
 BorderLayout 클래스 생성자
형식
BorderLayout()
BorderLayout(int hgap, int vgap)
14장. 그래피컬 사용자 인터페이스
27
4 배치관리자(Layout Manager)
4-2
BorderLayout 클래스
 실습예제
BorderLayoutTest.java
01
import javax.swing.*;
02
import java.awt.*;
03
class BorderLayout1 extends JFrame{
04
public BorderLayout1() {
05
Container ct = getContentPane();
06
BorderLayout bl = new BorderLayout(10, 10);
07
ct.setLayout(bl);
08
ct.add(new JButton("오른쪽버튼"), BorderLayout.EAST);
09
ct.add(new JButton("왼쪽버튼"), BorderLayout.WEST);
10
ct.add(new JButton("위쪽버튼"), BorderLayout.NORTH);
11
ct.add(new JButton("아래쪽버튼"), BorderLayout.SOUTH);
12
ct.add(new JButton("중앙버튼"), BorderLayout.CENTER);
13
setTitle("BorderLayout Test");
14
setSize(400,300);
15
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
14장. 그래피컬 사용자 인터페이스
BorderLayout 객체 생성 (수직 수평 간격 10)
쟁반 객체에 layout 설정
쟁반에 버튼 5개
방향 지정하여 추가
28
4 배치관리자(Layout Manager)
4-2
BorderLayout 클래스
 실습예제
BorderLayoutTest.java
16
setVisible(true);
17
}
18
}
19
public class BorderLayoutTest {
20
public static void main(String[] args) {
21
new BorderLayout1();
22
23
}
}
14장. 그래피컬 사용자 인터페이스
29
4 배치관리자(Layout Manager)
4-2
BorderLayout 클래스
 프로그램 설명
-
06
: BorderLayout 클래스로부터 객체를 생성하였다. 각 요소들의 수직, 수평 간격을 10픽
셀로 지정하였다.
-
07
: 생성된 layout 객체를 이용하여 쟁반 객체인 Container 객체의 정렬 방법을 설정하였
다.
-
08~12
: 설정된 쟁반 객체에 5개의 버튼을 생성하여 추가하였다. 각각의 버튼은 배치 방
향이 설정되어 생성되었다.
14장. 그래피컬 사용자 인터페이스
30
4 배치관리자(Layout Manager)
4-2
BorderLayout 클래스
14장. 그래피컬 사용자 인터페이스
31
4 배치관리자(Layout Manager)
4-3
GridLayout 클래스
 GridLayout 클래스
-
컴포넌트를 행과 열을 가진 배열 형태로 배치
 GridLayout 클래스 생성자
형식
GridLayout()
GridLayout(int rows, int cols)
GridLayout(int rows, int cols, int hgap, int vgap)
14장. 그래피컬 사용자 인터페이스
32
4 배치관리자(Layout Manager)
4-3
GridLayout 클래스
 실습예제
GridLayoutTest.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
import javax.swing.*;
import java.awt.*;
class FlowLayout1 extends JFrame{
public FlowLayout1(){
Container ct = getContentPane();
FlowLayout f = new FlowLayout(FlowLayout.RIGHT, 10, 15);
ct.setLayout(f);
for ( int i = 1; i<=15 ; i++)
ct.add(new JButton("버튼"+i));
setTitle("FlowLayout Test");
setSize(400,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
public class FlowLayoutTest {
public static void main(String[] args) {
new FlowLayout1();
}
}
14장. 그래피컬 사용자 인터페이스
GridLayout 객체 생성
(3행 5열, 수직 수평 간격 10)
33
4 배치관리자(Layout Manager)
4-3
GridLayout 클래스
 프로그램 설명
-
00
: GridLayout 클래스로부터 객체를 생성하였다. 각 요소들을 3행 5열로 배치하도록 설
정하였고, 각 요소들의 수직, 수평 간격을 10픽셀로 지정하였다.
14장. 그래피컬 사용자 인터페이스
34
5 패널(Panel)
 Frame, Container, Panel의 관계
-
Frame에 연관된 Container 객체를 지정
-
Container 객체에는 다수 개의 Panel 객체를 생성
478 page
14장. 그래피컬 사용자 인터페이스
35
5 패널(Panel)
 실습문제
JPanelTest.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
import javax.swing.*;
import java.awt.*;
class JPanel1 extends JFrame{
public JPanel1() {
Container ct = getContentPane();
ct.setLayout(new BorderLayout());
JPanel jp1 = new JPanel();
jp1.setLayout(new GridLayout(5,1));
jp1.add(new JRadioButton("자바"));
jp1.add(new JRadioButton("C"));
jp1.add(new JRadioButton("VisualBasic"));
jp1.add(new JRadioButton("JSP"));
jp1.add(new JRadioButton("PHP"));
JPanel jp2 = new JPanel();
jp2.setLayout(new GridLayout(5,1));
jp2.add(new JButton("자바"));
jp2.add(new JButton("C"));
jp2.add(new JButton("VisualBasic"));
jp2.add(new JButton("JSP"));
jp2.add(new JButton("PHP"));
14장. 그래피컬 사용자 인터페이스
Frame과 연관된 Container 객체 생성
BorderLayout으로 설정
JPanel 객체 생성
JPanel 객체에 GridLayout 설정(5행 1열)
Radio 버튼을
패널 객체에 추가
또 다른 패널 객체 생성
36
5 패널(Panel)
 실습문제
JPanelTest.java
21
22
23
24
25
26
27
28
29
30
31
32
33
ct.add( jp1, BorderLayout.EAST);
두 개의 패널을 Container에 추가(방향 지정)
ct.add( jp2, BorderLayout.WEST);
setTitle("JPanel Test");
setSize(300,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
public class JPanelTest {
public static void main(String[] args) {
new JPanel1();
}
}
14장. 그래피컬 사용자 인터페이스
37
5 패널(Panel)
 프로그램 설명
-
05
: JFrame으로부터 상속받아 객체를 생성하였다.
-
06
: Container 객체의 레이아웃을 BorderLayout으로 설정하였다.
-
07
: JPanel 클래스로부터 객체를 생성하였다.
-
08
: JPanel 객체의 레이아웃을 GridLayout으로 설정하였다. 5행 1열로 설정하였다.
-
09~13
: JPanel 객체에 Radio 버튼 객체를 생성하여 추가하였다.
-
21~22
: 작성한 두 개의 패널 객체를 Container 객체에 추가하였다. 각 패널을 추가하면서
방향을 지정하여 배치하였다.
14장. 그래피컬 사용자 인터페이스
38
5 패널(Panel)
14장. 그래피컬 사용자 인터페이스
39
6 패널에서의 그래픽 사용
 paintComponent 메소드
형식
protected void paintComponent(Graphics g)
.........................
class DrawTest extends JPanel {
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawString(.........);
g.drawLine(..........);
g.drawRect(...........);
}
}
14장. 그래피컬 사용자 인터페이스
JPanel 클래스로부터 상속
메소드 오버라이딩
상위 클래스의 paintComponent() 메소드 호출
다양한 그래픽 기능 사용
40
6 패널에서의 그래픽 사용
 Graphics 클래스
-
java.awt 패키지에 포함된 클래스( java.awt.Graphics)
-
윈도에 다양한 그래픽을 나타낼 수 있는 많은 메소드를 제공
-
적합한 메소드를 이용하여 선, 사각형, 원, 원호, 그림, 문자 등 많은 그래픽 기능을 사용
-
Graphics 클래스에는 약 40여 개의 메소드가 정의
14장. 그래피컬 사용자 인터페이스
41
6 패널에서의 그래픽 사용
 Graphics 클래스의 주요 메소드
메소드
설명
void drawArc(int x, int y, int w, int h, int startAngl
e, int endAngle)
void drawImage(Image img, int x, int y, imageObs
erver io)
startAngle과 endAngle로 지정된 각도를 가지는 원호를 그린
다.
viod drawLine(int x0, int y0, int x1, int y1)
x0,y0부터 x1,y1까지 라인을 그린다.
viod drawLine(int x0, int y0, int x1, int y1)
x0,y0부터 x1,y1까지 라인을 그린다.
void drawOval(int x, int y, int w, int h)
x,y 좌표에 w,h의 폭과 높이를 가진 타원을 그린다.
void drawPolygon(int x[ ], int y[ ], int n)
x[]와 y[] 배열의 각 점을 좌표로 하여 n개의 코너점을 가진 다
각형을 그린다.
void drawRect(int x, int y, int w, int h)
x,y 좌표에 w,h의 폭과 높이를 가진 사각형을 그린다.
void drawString(String str, int x, int y)
문자열을 x,y 좌표에 그린다.
void fillArc(int x, int y, int w, int h, int startAngle, i
nt endAngle)
속이 찬 원호를 그린다.
void fillOval(int x[ ], int y[ ], int n)
속이 찬 타원을 그린다.
14장. 그래피컬 사용자 인터페이스
img로 지정된 이미지를 애플릿의 x,y 좌표에 그린다.
42
6 패널에서의 그래픽 사용
 Graphics 클래스의 주요 메소드
메소드
설명
void fillOval(int x[ ], int y[ ], int n)
속이 찬 타원을 그린다.
void fillPolygon(int x[ ], int y[ ], int n)
속이 찬 다각형을 그린다.
void fillRect(int x, int y, int w, int h)
속이 찬 사각형을 그린다.
Color getColor( )
현재 객체의 색을 Color 객체로 반환
Font getFont( )
현재 객체의 폰트를 Font 객체로 반환
FontMetrics getFontMetrics( )
현재 객체의 폰트 정보를 FontMetrics 객체로 반환
void setColor(Color color)
현재 객체의 색을 color로 설정
14장. 그래피컬 사용자 인터페이스
43
6 패널에서의 그래픽 사용
 실습예제
LineTest.java
01
import javax.swing.*;
02
import java.awt.*;
03
class LineTestPanel extends JPanel{
04
protected void paintComponent(Graphics g) {
05
super.paintComponent(g);
06
g.drawLine(10, 10, 100, 10);
07
g.drawLine(100, 10, 100, 100);
08
g.drawLine(100, 100, 10, 100);
09
g.drawLine(10, 100, 10, 10);
10
g.drawLine(10, 10, 100, 100);
11
g.drawLine(10, 100, 100, 10);
12
13
그림을 그릴 수 있는 클래스 작성(JPanel 클래스로부터 상속)
paintComponent() 메소드를 오버라이딩
상위 클래스의 paintComponent() 메소드 호출
Graphics 객체 g를
이용하여 그린다
}
}
14장. 그래피컬 사용자 인터페이스
44
6 패널에서의 그래픽 사용
 실습예제
LineTest.java
14
class LineTestFrame extends JFrame{
15
LineTestFrame() {
JFrame 클래스로부터 상속받아
클래스 작성
16
setTitle("DrawLine Test");
17
Container ct = getContentPane();
18
LineTestPanel ltp = new LineTestPanel();
19
ct.add(ltp);
20
setSize(300,200);
21
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
22
setVisible(true);
23
생성된 패널 객체를 프레임에 추가
}
24
}
25
public class LineTest {
26
public static void main(String args[]){
27
new LineTestFrame();
28
29
LineTestPanel 클래스로부터 객체를 생성
}
}
14장. 그래피컬 사용자 인터페이스
45
6 패널에서의 그래픽 사용
 프로그램 설명
-
03 : 우선 그림을 그리기 위한 객체를 만들기 위해서는 반드시 JPanel 클래스로부터 상속
받아 클래스를 작성해야 한다.
-
04 : paintComponent(Graphics g) 메소드를 오버라이딩하였다. 이 메소드는 JPanel 클래
스(상속된 클래스 포함)로부터 객체가 생성될 때 자동으로 수행되는 메소드이다. 이 메소드
는 매개변수로 Graphics 클래스의 객체를 가지며, 이 Graphics 객체를 이용하여 다양한 그
래픽 기능을 수행할 수 있다. Graphics 클래스는 java.awt 패키지에 속하는 클래스이며 다양
한 그래픽 메소드들을 제공하고 있다.
-
05 : 상위 클래스의 paintComponent() 메소드를 호출하며, 이 메소드는 현재의 패널과
Graphics 객체를 연동시키는 역할을 수행한다.
-
06~11
-
14
-
18~19
-
27 : 메인 클래스에서 LineTestFrame 클래스의 객체를 생성한다. 프레임 객체는 패널 객체
를 생성하게 되고, 패널 객체가 생성되면 paintComponent() 메소드가 자동으로 수행되어
그림이 그려지게 된다.
: Graphics 객체를 이용하여 라인을 그린다.
: 프레임 클래스를 생성한다.
: LineTestPanel 클래스로부터 객체를 생성하여, 프레임에 추가한다.
14장. 그래피컬 사용자 인터페이스
46
6 패널에서의 그래픽 사용
14장. 그래피컬 사용자 인터페이스
47
6 패널에서의 그래픽 사용
 실습예제
RectanglesTest.java
01
import javax.swing.*;
02
import java.awt.*;
03
class RectanglesPanel extends JPanel{
04
protected void paintComponent(Graphics g) {
05
super.paintComponent(g);
06
g.drawRect(10, 10, 100, 100);
07
g.fllRect(120, 10, 100, 100);
08
g.fllRoundRect(10, 120, 100, 100, 15, 15);
09
g.drawRoundRect(120, 120, 100, 100, 30, 40);
10
}
11
}
12
class RectanglesFrame extends JFrame{
13
다양한 사각형을
그린다
public RectanglesFrame() {
14장. 그래피컬 사용자 인터페이스
48
6 패널에서의 그래픽 사용
 실습예제
RectanglesTest.java
14
setTitle("DrawRectangle Test");
15
Container ct = getContentPane();
16
ct.add(new RectanglesPanel());
17
setSize(300,300);
18
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
19
setVisible(true);
20
}
21
}
22
public class RectanglesTest {
23
public static void main(String[] args) {
24
new RectanglesFrame();
25
26
객체의 생성과 추가를
하나의 문장으로 작성
}
}
14장. 그래피컬 사용자 인터페이스
49
6 패널에서의 그래픽 사용
 프로그램 설명
-
06~08
: Graphics 객체를 이용하여 다양한 사각형을 그린다. 프로그램의 다른 부분은 이
전 프로그램과 같다.
-
16
: 객체를 생성하는 문장과 생성된 객체를 프레임에 추가하는 문장을 하나로 작성하여
기술하였다.
14장. 그래피컬 사용자 인터페이스
50
6 패널에서의 그래픽 사용
 실습예제
CircleTest.java
01
import javax.swing.*;
02
import java.awt.*;
03
class CirclePanel extends JPanel{
04
protected void paintComponent(Graphics g) {
05
super.paintComponent(g);
06
g.drawOval(10, 10, 50, 50);
07
g.fllOval(100, 10, 75, 50);
08
g.drawArc(210, 50, 70, 70, 0, 75);
09
g.fllArc(150, 50, 90, 90, 0, 75);
10
g.drawArc(10, 100, 70, 80, 0, 175);
11
g.fllArc(100, 100, 70, 90, 180, 270);
12
13
다양한 원호를
그린다
}
}
14장. 그래피컬 사용자 인터페이스
51
6 패널에서의 그래픽 사용
 실습예제
CircleTest.java
14
class CircleFrame extends JFrame{
15
public CircleFrame() {
16
setTitle("DrawCircle Test");
17
Container ct = getContentPane();
18
ct.add(new CirclePanel());
19
setSize(300,300);
20
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
21
setVisible(true);
22
}
23
}
24
public class CircleTest {
25
public static void main(String[] args) {
26
new CircleFrame();
27
28
}
}
14장. 그래피컬 사용자 인터페이스
52
6 패널에서의 그래픽 사용
 프로그램 설명
-
06~18
: Graphics 객체를 이용하여 다양한 원호를 그린다.
14장. 그래피컬 사용자 인터페이스
53
7 색의 사용
 색을 객체로 취급하며 이를 위해 Color 클래스( java.awt 패키지)를 제공
 Graphics 객체에 컬러 설정
형식
.......
public void paintComponent(Graphics g) {
......
Color c = Color.orange;
g.setColor(c);
g.fillRect(100, 10, 60, 50);
}
 Color 클래스 생성자
Color(int red, int green, int blue)
Color(float r, float g, float b)
Color(int rgb)
14장. 그래피컬 사용자 인터페이스
54
7 색의 사용
 Color 클래스에서 제공하는 색상 관련 상수
색의 이름
RGB 값
black
(0, 0, 0)
magenta
(255, 0, 255)
blue
(0, 0, 255)
orange
(255, 200, 0)
cyan
(0, 255, 255)
pink
(255, 175, 175)
darkGray
(64, 64, 64)
red
(255, 0, 0)
gray
(128, 128, 128)
white
(255, 255, 255)
green
(0, 255, 0)
yellow
(255, 255, 0)
lightGray
(192, 192, 192)
14장. 그래피컬 사용자 인터페이스
55
7 색의 사용
 Color 클래스의 주요 메소드
메소드
설명
Color brighter()
현재 객체의 색보다 한 단계 밝은 색의 Color 객체를 반환
Color darker()
현재 객체의 색보다 한 단계 어두운 색의 Color 객체를 반환
static Color decode(String str) throws
NumberFormatException
문자열 str과 동일한 Color 객체를 반환
booleanequals(Object obj)
현재의 객체와 obj로 지정된 객체가 같은 색을 가지면 true, 아니면
false를 반환
int getRed()
현재 객체의 R(red)값을 반환
int getGreen()
현재 객체의 G(green)값을 반환
int getBlue()
현재 객체의 B(blue)값을 반환
int getRGB()
현재 객체의 RGB값을 반환
14장. 그래피컬 사용자 인터페이스
56
7 색의 사용
 실습예제
ColorTest.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
import javax.swing.*;
import java.awt.*;
class ColorPanel extends JPanel{
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
상수를 사용하여 컬러를 설정
문자열을 그래픽으로 그린다
g.drawString("객체지향 프로그래밍 JAVA", 50, 50);
g.setColor(Color.blue);
g.drawString("배우기 쉬운 자바 프로그래밍", 50, 80);
Color c1 = new Color(100, 255, 100);
Color 객체를 생성(r,g,b 번호로 생성)
Color c2 = new Color(255, 100, 255);
g.setColor(c1);
Color 객체로 컬러를 설정
g.fllRect(50, 100, 60, 50);
g.setColor(c2);
g.fllOval(130, 100, 90, 30);
g.setColor(Color.cyan);
g.drawRoundRect(50, 190, 200, 50, 15, 15);
14장. 그래피컬 사용자 인터페이스
57
7 색의 사용
 실습예제
ColorTest.java
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
}
}
class ColorFrame extends JFrame{
public ColorFrame() {
setTitle("Color Test");
Container ct = getContentPane();
add(new ColorPanel());
setSize(300,300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
public class ColorTest {
public static void main(String[] args) {
new ColorFrame();
}
}
14장. 그래피컬 사용자 인터페이스
58
7 색의 사용
 프로그램 설명
-
06
: Color 클래스에서 제공되는 상수를 가지고 Graphics 객체의 컬러를 설정한다. 한번
설정되면, 그 이후에 그려지는 모든 그래픽은 설정된 컬러로 표현된다.
-
07
: g.drawString() 메소드는 문자열을 그래픽으로 그리는 메소드이다. 패널의 특정 위치
에 지정된 컬러로 문자열을 그린다.
-
10~11
: Color 클래스의 생성자를 이용하여 객체를 생성한다. 생성자에 컬러의 red,
green, blue 값을 지정하여 객체를 생성할 수 있다.
-
12
: 생성된 Color 객체를 이용하여 Graphics 객체의 컬러를 설정한다.
14장. 그래피컬 사용자 인터페이스
59
7 색의 사용
14장. 그래피컬 사용자 인터페이스
60
8 글꼴(Font)의 사용
 자바에서는 패널이나 애플릿에 대한 텍스트 출력을 그래픽 객체로 처리
 drawString() 메소드
-
패널이나 애플릿에 텍스트를 출력하기 위해서는 Graphics 클래스에서 제공
 setFont(Font font) 메소드를 이용하여 출력할 텍스트의 글꼴을 지정
14장. 그래피컬 사용자 인터페이스
61
8 글꼴(Font)의 사용
 Font 클래스 생성자
형식
Font(String name, int style, int fontsize)
.........
public void paintComponent(Graphics g) {
........
Font font = new Font("Serif", Font.ITALIC, 36);
g.setFont(font);
g.drawString("JAVA APPLET", 100, 50);
.......
}
14장. 그래피컬 사용자 인터페이스
62
8 글꼴(Font)의 사용
 Font 클래스의 주요 메소드
메소드
설명
String getName( )
글꼴의 이름을 반환
int getSize( )
글꼴의 크기를 반환
int getStyle( )
글꼴의 스타일을 반환
14장. 그래피컬 사용자 인터페이스
63
8 글꼴(Font)의 사용
 실습예제
FontTest1.java
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
import javax.swing.*;
import java.awt.*;
class FontPanel extends JPanel{
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Font sanserif, serif, monospaced, etc;
Font 객체 변수 선언
sanserif = new Font("SansSerif",Font.BOLD,20);
serif = new Font("Serif",Font.ITALIC,20);
Font 객체 생성
monospaced = new Font
("Monospaced",Font.BOLD+Font.ITALIC,20);
etc = new Font("굴림",Font.BOLD,20);
g.setFont(sanserif);
Graphics 객체에 폰트를 설정하고
g.drawString("Teach you self JAVA : Courier ",20,20);
문자열 출력
g.setFont(serif);
g.drawString
("Complete Reference JAVA : Timesoroman ",20,50);
g.setFont(monospaced);
g.drawString("JAVA Tutorial : Symbol ",20,82);
g.setFont(etc);
14장. 그래피컬 사용자 인터페이스
64
8 글꼴(Font)의 사용
 실습예제
FontTest1.java
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
g.drawString("객체지향 프로그래밍 자바 : 굴림체",20,118);
}
}
class FontFrame extends JFrame{
public FontFrame() {
setTitle("Font Test");
Container ct = getContentPane();
ct.add(new FontPanel());
setSize(430,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
}
}
public class FontTest1 {
public static void main(String[] args) {
new FontFrame();
}
}
14장. 그래피컬 사용자 인터페이스
65
8 글꼴(Font)의 사용
 프로그램 설명
-
06
: Font 클래스의 객체 변수를 선언하였다.
-
07
: 다양한 형태의 폰트 객체를 생성하였다.
-
12, 13
: Graphics 객체에 폰트를 설정하고, 문자열을 출력하면 설정된 폰트로 문자열이 출
력된다.
14장. 그래피컬 사용자 인터페이스
66
 학습정리
 AWT와 스윙(Swing)
① 응용 프로그램에서 사용자가 접속하는 부분을 GUI라고 한다.
② 자바 언어는 초기에 AWT라는 GUI 패키지를 제공하였다. 이 클래스들은 그래픽을
실행되는 시스템의 그래픽 컴포넌트를 이용하는 방법을 사용하였기 때문에, 실행되
는 시스템에 따라 조금씩 다르게 나타나는 단점이 있다.
③ Swing GUI 패키지는 실행되는 시스템의 그래픽 컴포넌트와는 무관하게 JVM이 모
든 그래픽을 처리한다. 이 방법은 실행시간이 AWT 방법에 비해 더 소요되지만, 실
행되는 시스템에 상관없이 일관된 형태의 GUI를 제공할 수 있는 장점이 있다.
 AWT 패키지와 주요 클래스
① AWT 패키지에는 GUI 구축을 위한 다양한 클래스들을 제공하고 있다.
② Component 클래스는 약 100여 개의 메소드를 제공하는 추상 클래스로서 대부분
의 GUI 관련 클래스들이 Component 클래스의 하위 클래스이다.
③ Container 클래스는 쟁반 역할을 하는 클래스로서 다른 GUI 컴포넌트들을 쟁반에
담아 나타내는 역할을 수행한다.
67
 학습정리
 프레임(Frame)과 배치관리자
① 일반적인 응용 프로그램 구축 시 GUI 부분을 작성하기 위해 프레임을 사용한다. 자바는
JFrame 클래스를 제공한다.
② 자바는 쟁반 역할을 하는 클래스로 Container 클래스와 JPanel 클래스를 제공하고 있다.
일반적으로 프레임에 하나의 Container 클래스 객체를 배정하고, 하나의 Container 클래
스 객체에는 다수 개의 JPanel 객체를 배정한다.
③ 자바는 쟁반 클래스에 객체를 배치하기 위해 배치관리자를 클래스로 제공하고 있다. 자
바는 배치관리자의 특성에 따라 FlowLayout, BorderLayout, GridLayout 클래스를 제공하
고 있다.
 그래픽의 사용
① 패널 객체에는 다양한 그래픽을 표현할 수 있다. 일반적으로 패널 객체에 그래픽을 나타
내기 위해서는 paintComponent(Graphics g) 메소드를 이용한다. 이 메소는 패널 객체가
생성될 때 자동으로 호출되는 메소드이다.
② paintComponent(Graphics g) 메소드의 매개변수로 지정된 Graphics 클래스의 객체를 이
용하여 패널에 그래픽을 출력한다.
③ 컬러와 폰트를 설정하여 도형과 문자열의 출력이 가능하다.
68
14장. 그래피컬 사용자
인터페이스
69