1. AWT와 Swing
AWT
자바가 처음 나왔을 때 함께 배포된 GUI 패키지
운영체제의 도움을 받아 GUI를 그리기 때문에 속도가 빠르나
그만큼 운영체제에 부담을 주어 중량 컴포넌트라고 불리며
최근에는 거의 사용하지 않는 추세이다.
Swing
순수하게 Java언어로만 작성된 패키지
운영체제의 도움을 받지 않기 때문에 경량 컴포넌트라고 불린다.
AWT보다 화려하고 다양한 많은 GUI 컴포넌트를 제공하며,
AWT와의 구분을 위하여 모두 J로 시작한다.
AWT에 구현된 이벤트 처리나 GUI 컴포넌트의 기본원리를 바탕으로 작성되었기 때문에
스윙을 사용하기 위해선 AWT 패키지가 필요하다.
하지만 컴포넌트는 서로 다른 구조로 구현되있기 때문에 혼용하면 안된다.
2. 컨테이너와 컴포넌트
GUI 패키지의 주요 클래스의 상속 관계
모든 GUI 컴포넌트들은 Component 클래스를 상속받고 있다.
* Font, Dimension, Color, Graphics 클래스는 GUI " 컴포넌트 "는 아니다. *
그리고 스윙 컴포넌트들은 JComponent를 상속받는다.
컨테이너
컴포넌트를 포함할 수 있는 특별한 GUI 컴포넌트
awt.Container 를 상속받아야 하며
해당 클래스도 컴포넌트를 상속 받고 있으므로
컨테이너 또한 컴포넌트이다.
( JFrame, JPanel, JApplet, JDialog, JWindow )가 스윙 컨테이너
컴포넌트
대부분 다른 컴포넌트를 포함할 수 없으며,
임의의 컨테이너에 포함되어야 화면에 출력될 수 있는 GUI 객체
Component 클래스는 모든 컴포넌트들의 공통적인 요소를 구현하고 있고
JComponent 클래스도 순수 스윙 컴포넌트들의 공통적인 기능을 구현하고 있다.
최상위 컨테이너
컨테이너들 중에서 다른 컨테이너에 속하지 않고도 독립적으로 존재 하여
화면에 출력가능한 컨테이너를 일컫는다.
JFrame, JDialog, JApplet등이 이에 속한다.
계층 구조
최상위 컨테이너 ) 컨테이너 ) 컴포넌트
3. 스윙 프로그램 만들기
GUI 프로그래밍에 주로 쓰이는 import 구문
import java.awt.*, import javax.swing.*
import java.awt.event.*, import javax.swing.event.*
스윙 프레임과 ContentPane
JFrame은 스윙에서 프레임 ( 최상단 컨테이너 ) 역할을 한다.
JFrame 객체는 Frame, 메뉴바, 컨텐트 팬의 세 공간으로 구성된다.
Frame은 상속을 받았기 때문에 존재하는 것이고
메뉴바는 이름 그대로이고
ContentPane은 메뉴를 제외한 모든 GUI 컴포넌트를 부착하는 공간이다.
JFrame 주요 속성
setTitle(str) or super(str) : 프레임 타이틀 설정
setSize : 크기 설정
setVisible : 화면에 보이게 설정
cf. main()이 종료한 뒤에도 프레임이 살아 있는 이유는?
메인 스레드가 죽어도 이벤트 처리 스레드가 살아있기 때문이다.
컨텐트팬에 컴포넌트 달기
스윙에서는 컨텐트팬에만 컴포넌트를 부착할 수 있다.
하지만 JDK1.5 이후부터 JFrame에 add 메소드를 호출하는 것 만으로
컨텐트팬에 컴포넌트를 추가하도록 수정되었다.
기존의 방법을 알아 보면
Container contentPane = getContentPane(); 으로 해당 프레임의 컨텐트팬을 얻고
거기다가 붙이는 거였다.
컨텐트팬의 변경
프레임의 붙어있는 컨텐트팬을 제거하고 새 컨텐트팬을 만들어 붙일수 도 있다.
컨텐트팬은 Container 타입이므로 해당 컴포넌트가 컨테이너를 상속받았다면
컨텐트팬이 될 수 있다.
설정은 setContentPane을 이용한다.
cf. 자바에서 응용프로그램의 종료를 원할시 System.exit(0); 을 이용한다.
cf. 스윙 프로그램에서 (x)버튼과 함께 완벽히 프로그램이 종료되길 원한다면
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 를 추가하면 된다.
4. 컨테이너와 배치관리자
배치관리자
하나의 컨테이너는 하나의 배치관리자를 가진다. ( 물론 아예 안가질수는 있다 )
배치관리자는 컴포넌트가 부착되는 시점에 컴포넌트의 위치와 크기를 결정한다.
컨테이너의 크기가 변경되면 배치관리자는
컨테이너의 모든 컴포넌트들의 위치와 크기를 재조정한다.
배치관리자의 종류
java.awt 패키지에 배치관리자 클래스들이 존재한다.
1. FlowLayout
왼쪽상위에서 오른쪽상위로 그후 왼쪽 하위에서 오른쪽 하위로 배치
컴포넌트의 크기는 적당한 크기로 설정한다.
2. BorderLayout
컴포넌트의 공간을 동서남북중앙으로 나누고,
응용프로그램에서 지정한 영역에 컴포넌트를 배치한다.
컴포넌트의 크기는 영역의 크기와 동일하게 설정한다.
3. GridLayout
설정한 크기대로 2차원의 그리드로 나누고
플로우 레이아웃과 비슷하게 배치되며
컴포넌트의 크기는 셀의 크기와 일치시킨다.
4. CardLayout
컴포넌트를 포개어 배치하며 컴포넌트의 크기는 컨테이너의 크기와 일치시킨다.
새로운 배치관리자 설정을 위해선 setLayout(배치관리자) 메소드를 이용한다.
예) setLayout(new BoxLayout(...));
Default 배치관리자
BorderLayout -> JFrame, JWindow, JDialog
FlowLayout -> JPanel, JApplet
5. FlowLayout
생성자
FlowLayout() or FlowLayout(int align, int hGap, int vGap)
- align : 중앙 정렬이 Default, FlowLayout.RIGHT등의 static 상수를 이용
- hGap, vGap : 각각 좌우 상하 간격, 픽셀 단위이며, 5px이 Default
6. BorderLayout
생성자
BorderLayout() or BorderLayout(int hGap, int vGap)
- 의미는 같으며 Default : 0
add(comp, index) : index는 동서남북중앙에 해당한다.
( BorderLayout.CENTER 등의 상수 이용 )
7. GridLayout
생성자
GridLayout() or GridLayout(int rows, int cols)
or GridLayout(int rows, int cols, int hGap, int vGap)
" row가 ㅣ 방향, col이 - 방향 "
- Default는 각각 1,1,0,0
만약 격자의 셀 수보다 더 많은 컴포넌트가 추가되면
모든 컴포넌트를 수용할 수 있게 적당히 수가 변경된다.
8. 배치관리자 제거
이유
1. 컴포넌트의 크기나 위치를 개발자가 정하고 싶은 경우
2. 수시로 위치가 변경되는 환경일 경우
3. 여러 컴포넌트들이 서로 겹치는 효과가 핅요할 경우
제거 방법 : setLayout(null); : 참 쉽쥬
제거후엔
setSize, setLocation 혹은 setBound 메소드를 이용하여 크기와 위치를 설정해주어야 하며
그렇지 않으면 보이지 않을 것이다.
CardLayout을 제거하고 컴포넌트들이 겹치도록 배치할 수 있는 방법중 하나이다.