9장 연습문제
- 이론문제
1. 자바로 GUI 응용프로그램을 작성할 수 있도록 JDK에서 제공하는 패키지는 어떤 종류가 있는가?
-> Swing(javax.swing), AWT(java.awt), Javafx(javafx)
2. 자바는 GUI를 구성하기 위해 컴포넌트들을 지원한다. 경량 컴포넌트(light weight component)와 중량 컴포넌트(heavy weight component)는 어떤 점에서 서로 다른가?
-> 경량 컴포넌트는 중량 컴포넌트와는 달리 Native Component와 연계되지 않는 컴포넌트로 Peer에 의존하지 않음
-> 경량 컴포넌트는 완전히 Java만으로 작성되기 때문에 플랫폼에 제한이 없지만, 중량 컴포넌트는 해당 플랫폼이 제공하는 컴포넌트로 작성되어 경직된 컴포넌트임
3. 데스크톱에서 실행되는 GUI 응용프로그램 작성 시 AWT보다 스윙 사용을 권장하는 이유는 무엇인가?
->AWT보다 SWING을 사용한 UI가 더 예뻐서
4. 다음 프로그램에 필요한 import 문을 삽입하라.
-> import javax.swing.*;
5. 다음 코드에서 컨텐트팬을 알아내고 프레임의 배경색으로 파란색을 설정하도록 하라.
-> Container contentPane = frame.getContentPane(); // 프레임의 컨텐트팬을 알아낸다.
-> contentPane.setBackground(Color.BLUE); //프레임의 배경색을 파란색으로 설정한다.
6. 컴포넌트와 컨테이너에 대해서 잘못 말한 것을 모두 찾아라.
1) JFrame과 Frame 모두 컨테이너이다.
2) JPanel 패널은 여러 개의 JButton 컴포넌트를 가질 수 있다.
3) 패널은 여러 개의 패널을 가질 수 있다.
4) JPanel은 어떤 컨테이너에 포함되지 않고도 스스로 화면에 출력 가능한 최상위 컨테이너이다.
5) 일반적으로 컴포넌트들은 컨테이너에 포함되지 않고도 화면에 출력될 수 있다.
6) JFrame 클래스를 상속받아 새로운 클래스를 만들 수 있다.
7) JButton 클래스를 상속받아 새로운 버튼 클래스를 만들 수 있다.
7. 배치 관리자에 대해서 잘못 말한 것을 모두 찾아라.
1) 배치 관리자의 종류는 4가지뿐이다.
2) 컨테이너만 배치 관리자를 가지며 컴포넌트는 가질 수 없다.
3) Panel은 배치 관리자를 가지지만 Button은 배치 관리자를 가질 수 없다.
4) 배치 관리자는 자신이 소속된 컨테이너의 크기를 조절한다.
5) 배치 관리자의 기능은 컨테이너에 포함된 컴포넌트들의 위치와 크기를 설정하는 것이다.
6) 자바의 컨테이너가 생성될 때 디폴트 배치 관리자가 자동으로 생성된다.
7) 배치 관리자는 한 컨테이너에 여러 개 존재할 수 있다.
8) 배치 관리자를 가지지 않도록 컨테이너를 조절할 수 없다.
9) 개발자는 자바에서 주어진 것 외의 새로운 배치 관리자를 구현하여 사용할 수 있다.
8. 다음 프로그램으 실행 결과는 어떠한가? 그 이유는 무엇인가? 정상적으로 작동하도록 프로그램을 수정하라.
-> 에러가 발생한다
-> 이미 MyFrame 클래스에서 JFrame을 상속받았기 때문에 MyFrame 클래스를 인스턴스화 시켜서 기본생성자를 호출시켜줘야 한다.
-> "JFrame mf = new JFrame();" 이 부분을 "MyFrame mf = new MyFrame();"으로 수정한다.
9. 컨텐트팬의 기능은 무엇인가? 컨텐트팬을 가지는 스윙 컴포넌트는 어떤 것이 있는가?
-> 스윙에서 GUI 컴포넌트들이 부착되는 공간으로 사용된다.
-> 스윙 컴포넌트: JApplet JFrame JDialog. 등등
- 실습문제
1. 다음 그림과 같이 "Let's study Java"라는 문자열을 타이틀로 가지고 프레임의 크기가 400 x 200인 스윙 프로그램을 작성하라.
import javax.swing.*;
public class ex9_1 extends JFrame {
ex9_1() {
setTitle("Let's study Java"); // 프레임 타이틀 지정
setSize(400, 200); // 프레임 사이즈 설정
setVisible(true); // 눈에 보여줄 것인가
}
public static void main(String args[]) {
ex9_1 test = new ex9_1();
}
}
2. BorderLayout을 사용하여 컴포넌트 사이의 수평 간격이 5픽셀, 수직 간격이 7픽셀이 되도록 다음 그림과 같은 스윙 응용프로그램을 작성하라.
import javax.swing.*;
import java.awt.*;
public class ex9_2 extends JFrame {
ex9_2(){
setTitle("BorderLayout Practice"); //프레임 타이틀 지정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //System의 exit함수를 사용하여 애플리케이션을 끝냄
setLayout(new BorderLayout(5,7)); //배치 관리자(BorderLayout) 및 간격 수평(5),수직(7) 설정
add(new JButton("North"), BorderLayout.NORTH);
add(new JButton("South"), BorderLayout.SOUTH);
add(new JButton("East"), BorderLayout.EAST);
add(new JButton("West"), BorderLayout.WEST);
add(new JButton("Center"), BorderLayout.CENTER);
setSize(400,200); //프레임 사이즈 설정
setVisible(true); //눈에 보여줄 것인가
}
public static void main(String args[]){
ex9_2 test = new ex9_2();
}
}
3. GridLayout을 사용하여 다음 그림과 같이 한 줄에 10개의 버튼을 동일한 크기로 배치하는 스윙 프로그램을 작성하라.
import java.awt.*;
import javax.swing.*;
public class ex9_3 extends JFrame {
ex9_3(){
setTitle("Ten Buttons Frame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //System의 exit함수를 사용하여 애플리케이션을 끝냄
GridLayout grid = new GridLayout(1,10); //배치 관리자(GridLayout) 1행 10열 생성
setLayout(grid); //배치관리자 적용
for(int i=0; i<10; i++){ //for문을 통해 JButton 생성
add(new JButton(""+i+""));
}
setSize(500,200); //프레임 사이즈 설정
setVisible(true); //눈에 보여줄 것인가
}
public static void main(String args[]){
new ex9_3();
}
}
4. 문제 3을 수정하여 다음과 같이 각 버튼의 배경색을 서로 다르게 설정하라.
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
public class ex9_4 extends JFrame {
ex9_4() {
int[][] ColorArray = { { 255, 000, 000 }, { 255, 165, 000 }, { 255, 255, 000 }, { 128, 000, 000 },
{ 000, 000, 255 }, { 128, 000, 000 }, { 128, 000, 128 }, { 184, 134, 011 }, { 255, 192, 203 },
{ 128, 128, 128 } }; // int형 2차원 배열로 색상표 선언
Color ArrayColor = null; // 색상 데이터 담을 Color타입 변수 선언
setTitle("Ten Buttons Frame"); // 타이틀 지정
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // System의 exit메소드를 사용하여 애플리케이션종료
GridLayout grid = new GridLayout(1, 10); // 배치 관리자(GridLayout) 1행 10열 생성
setLayout(grid); // 배치관리자 적용
JButton[] jb = new JButton[10]; // 배열 10짜리 버튼만들기
for (int i = 0; i < 10; i++) { // for문을 통해 JButton 생성 및 색상 입히기
jb[i] = new JButton("" + i + ""); //JButton 생성
ArrayColor = new Color(ColorArray[i][0], ColorArray[i][1], ColorArray[i][2]); //컬러값 생성
jb[i].setBackground(ArrayColor); //컬러값 적용
add(jb[i]); //프레임에 생성한 JButton 적용
}
setSize(500, 200); // 프레임 사이즈 설정
setVisible(true); // 눈에 보여줄 것인가
}
public static void main(String args[]) {
new ex9_4();
}
}
/*
* {255,000,000}=RED {255,165,000}=ORANGE {255,255,000}=YELLOW
* {128,000,000}=GRIN {000,000,255}=BLUE {128,000,000}=NAVY
* {128,000,128}=PUPLE {184,134,011}=DARKGOLDENROD {255,192,203}=PINK
* {128,128,128}=GRAY
*/
5. GridLayout을 이용하여 다음 그림과 같이 Color.WHITE, Color.GRAY, Color.RED 등 16개의 색을 배경색으로 하는 4 X 4 바둑판을 구성하라.
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class ex9_5 extends JFrame {
ex9_5() {
setTitle("4x4 Color Frame");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // System의 exit함수를 사용하여 애플리케이션을 끝냄
GridLayout grid = new GridLayout(4, 4); // 배치 관리자(GridLayout) 1행 10열 생성
setLayout(grid); // 배치관리자 적용
JLabel[] jl = new JLabel[16]; // 배열 16짜리 라벨만들기
int[][] ColorArray = { { 255, 000, 000 }, { 255, 165, 000 }, { 255, 255, 000 }, { 128, 000, 000 },
{ 000, 000, 255 }, { 128, 000, 000 }, { 128, 000, 128 }, { 184, 134, 011 }, { 255, 192, 203 },
{ 128, 128, 128 }, { 210, 180, 140 }, { 255, 215, 000 }, { 240, 230, 140 }, { 127, 255, 000 },
{ 128, 128, 000 }, { 220, 020, 060 } }; // int형 2차원 배열로 색상표 선언
Color ArrayColor = null; // 색상 데이터 담을 Color타입 변수 선언
for (int i = 0; i < 16; i++) { // for문을 통해 JLabel 생성 및 색상 입히기
jl[i] = new JLabel("" + i + "");
ArrayColor = new Color(ColorArray[i][0], ColorArray[i][1], ColorArray[i][2]);
jl[i].setOpaque(true); // JLabel의 경우 기본 배경색이 투명이기 때문에 setOpaque함수를
// "true"로 지정해줘야 배경색설정이 가능하다.
jl[i].setBackground(ArrayColor); // JLabel 색상 적용
add(jl[i]); //생성한 JLabel 컨테이너에 적용
}
setSize(500, 200); // 프레임 사이즈 설정
setVisible(true); // 눈에 보여줄 것인가
}
public static void main(String args[]) {
new ex9_5();
}
}
/*
* {255,000,000}=RED{255,165,000}=ORANGE {255,255,000}=YELLOW
* {128,000,000}=GRIN{000,000,255}=BLUE {128,000,000}=NAVY
* {128,000,128}=PUPLE{184,134,011}=DARKGOLDENROD {255,192,203}=PINK
* {128,128,128}=GRAY {210, 180, 140 }=TAN {255,215,000}=GOLD
* {240,230,140}=KHAKI{127,255,000}=CHARTREUSE {128,128,000}=TEAL
* {220,020,060}=CRIMSON
*/
6. 20개의 10 X 10 크기의 JLabel 컴포넌트가 프레임 내의 (50, 50)위치에서 (250, 250)내의 영역에서 랜덤한 위치에 출력되도록 스윙 프로그램을 작성하라. 프레임의 크기를 300 X 300으로 하고, JLabel의 배경색은 모두 파란색으로 하라.
import java.awt.Color;
import java.awt.GridLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
public class ex9_6 extends JFrame {
ex9_6() {
setTitle("Random Labels");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // System의 exit함수 사용 애플리케이션 종료
setLayout(null); // 배치관리자가 없는 컨테이너 설정
JLabel[] jl = new JLabel[20]; // 20개의 방을 갖는 배열 라벨 선언
for (int i = 0; i < 20; i++) { // for문을 통해 JLabel 위치, 크기, 색상 설정 및 컨테이너에 생성
jl[i] = new JLabel("");
int x = (int)(Math.random()*200)+50; //50~250 중에 랜덤함수를 돌려 X좌표 값 선언
int y = (int)(Math.random()*200)+50; //50~250 중에 랜덤함수를 돌려 Y좌표 값 선언
jl[i].setSize(10, 10); //Label 크기를 10x10으로 설정
jl[i].setLocation(x, y); //Label을 랜덤한 x, y위치에 배치
jl[i].setOpaque(true); //색설정여부
jl[i].setBackground(Color.BLUE); //label 배경 파란색으로 지정
add(jl[i]); // 컨테이너에 생성
}
setSize(300, 300); // 프레임 사이즈 설정
setVisible(true); // 눈에 보여줄 것인가
}
public static void main(String args[]) {
new ex9_6();
}
}