1. 자바의 GUI

  • 자바에서 그래픽 사용자 인터페이스(GUI)는 사용자와 상호작용하기 위해 컴포넌트와 그래픽을 활용하는 방식으로 구현된다.

2. 자바 GUI 패키지

  • 자바는 GUI 프로그래밍을 위해 주로 두 가지 패키지를 제공한다.
    • AWT(Abstract Window Toolkit): java.awt 패키지에 포함되어 있으며, 초기의 GUI 도구이다.
    • Swing: javax.swing 패키지에 포함되어 있으며, AWT를 기반으로 더 화려하고 다양한 컴포넌트를 제공한다.

2.1. Swing 클래스의 특징

  • 이름: 클래스 이름이 대부분 J로 시작한다. (예: JFrame, JButton)
  • 컴포넌트 유형: 스윙 컴포넌트는 두 가지로 나뉜다.
    • JComponent를 상속받는 클래스: 스윙 컴포넌트의 공통 속성을 구현한 추상 클래스이다. 대부분의 스윙 컴포넌트가 해당된다.
    • AWT의 Container를 상속받는 클래스: JFrame, JDialog, JApplet

3. 스윙 GUI 프로그램 만들기

3.1. 스윙 프로그램을 만드는 과정

  1. 스윙 프레임(JFrame) 작성: 모든 컴포넌트를 담을 최상위 컨테이너인 JFrame을 상속받아 기본 틀을 만든다. 프레임메뉴바와 컴포넌트가 부착되는 컨텐트 팬(Content Pane)으로 구성된다.
  2. main() 메소드 작성: 프로그램을 시작하는 main() 메소드를 작성하며, 일반적으로 프레임 클래스 내부에 만드는 것이 권장된다.
  3. 프레임에 스윙 컴포넌트 추가: 생성된 프레임의 컨텐트 팬에 버튼, 레이블 등 필요한 컴포넌트를 추가한다.

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 화면은 여러 컨테이너를 조합하여 만든다.

  • 예를 들어, 최상위 컨테이너인 JFrameBorderLayout을 적용하고, 중앙(Center) 구역에 JPanel을 추가한 뒤, 그 JPanel에 다시 GridLayout을 설정하여 여러 버튼을 격자 형태로 배치하는 방식으로 복잡한 화면 구성을 구현할 수 있다.

  • 예제 9-7: 여러 컴포넌트를 가진 GUI 만들기