1. 자바의 GUI
- 자바에서 그래픽 사용자 인터페이스(GUI)는 사용자와 상호작용하기 위해 컴포넌트와 그래픽을 활용하는 방식으로 구현된다.
2. 자바 GUI 패키지
- 자바는 GUI 프로그래밍을 위해 주로 두 가지 패키지를 제공한다.
- AWT(Abstract Window Toolkit):
java.awt패키지에 포함되어 있으며, 초기의 GUI 도구이다. - Swing:
javax.swing패키지에 포함되어 있으며, AWT를 기반으로 더 화려하고 다양한 컴포넌트를 제공한다.
- AWT(Abstract Window Toolkit):
2.1. Swing 클래스의 특징
- 이름: 클래스 이름이 대부분 J로 시작한다. (예:
JFrame,JButton) - 컴포넌트 유형: 스윙 컴포넌트는 두 가지로 나뉜다.
JComponent를 상속받는 클래스: 스윙 컴포넌트의 공통 속성을 구현한 추상 클래스이다. 대부분의 스윙 컴포넌트가 해당된다.- AWT의
Container를 상속받는 클래스:JFrame,JDialog,JApplet등
3. 스윙 GUI 프로그램 만들기
3.1. 스윙 프로그램을 만드는 과정
- 스윙 프레임(JFrame) 작성: 모든 컴포넌트를 담을 최상위 컨테이너인
JFrame을 상속받아 기본 틀을 만든다. 프레임은 메뉴바와 컴포넌트가 부착되는 컨텐트 팬(Content Pane)으로 구성된다. - main() 메소드 작성: 프로그램을 시작하는
main()메소드를 작성하며, 일반적으로 프레임 클래스 내부에 만드는 것이 권장된다. - 프레임에 스윙 컴포넌트 추가: 생성된 프레임의 컨텐트 팬에 버튼, 레이블 등 필요한 컴포넌트를 추가한다.
3.2. 스윙 프로그램의 종료
-
스윙 프로그램의 종료
- 프로그램 내에서 스스로 종료:
System.exit(0); - 프레임 종료 버튼(X) 클릭
- 프로그램 내에서 스스로 종료:
-
스윙 프로그램은
main()메소드가 종료되어도 화면이 사라지지 않는데, 이는 GUI와 이벤트를 처리하는 이벤트 분배 스레드가 계속 실행 중이기 때문이다. -
프레임의 종료 버튼(X)을 클릭했을 때 응용프로그램이 완전히 종료되도록 하려면 다음 코드를 추가해야 한다.
-
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
3.3. 예제
- 예제 9-1: 300x300 크기의 스윙 프레임 만들기
- 예제 9-2: 3개의 버튼 컴포넌트를 가진 스윙 프레임 만들기
4. 컨테이너와 배치(Layout)
-
컨테이너(Container)
- 다른 GUI 컴포넌트를 포함할 수 있는 특별한 컴포넌트
java.awt.Container상속- 모든 컴포넌트는 화면에 출력되기 위해 반드시 컨테이너에 포함되어야 한다.
-
구분
- AWT 컨테이너: Panel, Frame, Applet, Dialog, Window
- Swing 컨테이너: JPanel, JFrame, JApplet, JDialog, JWindow
- 최상위 컨테이너: JFrame, JApplet, JDialog처럼 다른 컨테이너에 속하지 않고 독립적으로 화면에 출력될 수 있는 컨테이너
-
컴포넌트
- 컨테이너에 포함되어야 화면에 출력될 수 있는 순수 컴포넌트
- 모든 컴포넌트는
java.awt.Component를 상속받음 - 모든 스윙 컴포넌트는
javax.swing.JComponent를 상속받음
-
배치관리자(Layout Manager)
- 컨테이너 내부에 컴포넌트들을 어떻게 배열할지를 결정하는 객체이다.
- 각 컨테이너는 기본 배치관리자를 가지며,
Container.setLayout(LayoutManager lm)메소드를 통해 변경할 수 있다.
5. FlowLayout 배치관리자
-
컨테이너에 컴포넌트를 왼쪽에서 오른쪽으로, 위에서 아래로 순서대로 배치한다.
-
컨테이너의 크기가 변하면 재배치된다.
-
예제 9-3:
FlowLayout을 이용하여 버튼 컴포넌트를 프레임에 추가하는 예제
6. BorderLayout 배치관리자
-
컨테이너 공간을 East, West, South, North, Center의 5개 구역으로 나눈다.
-
add(컴포넌트, 인덱스)메소드를 사용하여 각 구역에 컴포넌트를 배치한다. -
컨테이너의 크기가 변하면 재배치된다.
-
예제 9-4:
BorderLayout을 이용하여 컨테이너를 5개 구역으로 나누고 컴포넌트를 배치하는 예제
7. GridLayout 배치관리자
-
컨테이너 공간을 동일한 크기의 사각형 격자(그리드)로 나눈다.
-
컴포넌트는 지정된 격자에 따라 왼쪽에서 오른쪽으로, 위에서 아래로 순서대로 배치된다.
-
컨테이너의 크기가 변하면 재배치되고, 각 셀의 크기도 균등하게 조절된다.
-
예제 9-5:
GridLayout으로 입력 폼 만들기
8. 배치관리자 없는 컨테이너
-
개발자가 컴포넌트의 위치와 크기를 직접 지정하고 싶을 때 사용한다. (절대위치, 절대크기)
-
container.setLayout(null);코드로 배치관리자를 제거할 수 있다. -
배치관리자를 사용하지 않을 경우, 다음 메소드들을 이용해 컴포넌트의 좌표와 크기를 직접 설정한다.
- 컴포넌트 위치:
component.setLocation(x좌표, y좌표) - 컴포넌트 크기:
component.setSize(가로, 세로) - 컴포넌트 위치+크기:
component.setBounds(x좌표, y좌표, 가로, 세로)
- 컴포넌트 위치:
-
예제 9-6:
setLayout(null)을 통해 배치관리자를 제거하고, 컴포넌트의 위치와 크기를 직접 설정
9. 여러 컴포넌트를 가진 GUI 만들기
-
복잡한 GUI 화면은 여러 컨테이너를 조합하여 만든다.
-
예를 들어, 최상위 컨테이너인
JFrame에BorderLayout을 적용하고, 중앙(Center) 구역에JPanel을 추가한 뒤, 그JPanel에 다시GridLayout을 설정하여 여러 버튼을 격자 형태로 배치하는 방식으로 복잡한 화면 구성을 구현할 수 있다. -
예제 9-7: 여러 컴포넌트를 가진 GUI 만들기