JAVA chap 9. GUI 기초, AWT와 Swing

2023. 11. 21. 22:48컴퓨터공학 전공공부/자바기반 응용 프로그래밍

1. 자바의 GUI, AWT, Swing

자바의 GUI

GUI란 Graphical User Interface로, 사용자가 편리하게 사용할 수 있도록 입출력 등의 기능을 알기 쉬운 아이콘 등의 그래픽으로 나타낸 것을 말한다.

GUI 라이브러리 계층 구조

 

자바의 AWT

AWT란 Abstract Windowing Toolkit으로, 자바가 처음 나왔을 때 함께 배포된 GUI 라이브러리를 말한다. AWT 컴포넌트는 중량 컴포넌트이다. native(peer) 운영체제의 GUI 컴포넌트의 도움을 받아 작동한다. 이에 따라 운영체제에 많은 부담을 주지만, 오히려 처리 속도는 빠르다.

 

자바의 Swing

  • AWT 기술을 기반으로, 순수 자바 언어로 만들어진 라이브러리이다. Swing 컴포넌트는 경량 컴포넌트이다. native(peer) 운영체제에 의존하지 않는다.
  • Swing 클래스의 경우, 클래스 이름이 J로 시작한다는 특징이 있다.
  • Swing 컴포넌트에는 두 가지 유형이 있는데, JComponent를 상속받는 클래스와 AWT의 Container를 상속받는 클래스로 나뉜다. 대부분의 swing 컴포넌트는 전자에 해당되며, 후자의 예로는 JDialog, JFrame 등이 있다.

 

2. 컨테이너

컨테이너

다른 GUI 컴포넌트를 포함할 수 있는 컴포넌트를 말한다. 컨테이너 또한 다른 컨테이너에 포함될 수 있다.

 

최상위 컨테이너

다른 컨테이너에 속하지 않고 독립적으로 화면에 출력 가능한 컨테이너이다. 모든 컴포넌트는 컨테이너에 포함되어야 화면에 출력할 수 있다.

 

컨테이너와 컴포넌트의 포함관계

 

3. Swing GUI 프로그램 만들기

Swing GUI 프로그램을 만드는 과정

  1. swing 프레임을 작성한다.
  2. main() 메소드를 작성한다.
  3. swing 프레임에 swing 컴포넌트를 붙인다.

Swing 패키지 사용을 위한 import문

import java.awt.*; //그래픽 처리를 위한 클래스들의 경로명
import java.awt.event.*; //AWT 이벤트 사용을 위한 경로명
import javax.swing.*; //swing 컴포넌트 클래스들의 경로명
import javax.swing.event.*; //swing 이벤트를 위한 경로명

 

4. Swing 프레임

Swing 프레임이란?

모든 swing 컴포넌트를 담는 최상위 GUI 컨테이너이다. JFrame을 상속받아 구현한다.

JFrame 안에, 타이틀 바를 가진 frame 안에, menu bar와 content pane

 

Content Pane (컨텐트 팬)

화면에 출력될 모든 컴포넌트들이 부착되는 공간이다.

 

300*300 크기의 swing 프레임을 만드는 예시 코드

import javax.swing.*;

public class MyFrame extends JFrame {
	public MyFrame() { //생성자에서 작업
    	setTitle("스윙프레임 제목"); //프레임 제목 설정
        setSize(300,300); //프레임 크기를 300*300으로 설정
        setVisible(true); //프레임 출력
}

public static void main(String[] args) {
	MyFrame frame = new MyFrame();
    }
}

 

프레임에 컴포넌트 붙이기

타이틀 달기

public MyFrame() {
	super("타이틀문자열"); //JFrame의 생성자를 호출해 타이틀 달기
    setTitle("타이틀문자열"); //메소드를 호출하여 타이틀 달기
}

 

컨텐트팬 알아내기

Container contentPane = frame.getContentPane();

 

컨텐트팬에 컴포넌트 달기

Container c = frame.getContentPane();
JButton b = new JButton("Click");
c.add(b);

 

컨텐트팬 변경

JPanel p = new JPanel();
frame.setContentPane(p);

 

5. Swing 응용프로그램의 종료

프레임 종료버튼 (X)가 클릭되면?

프레임 윈도우가 닫히지만, 응용프로그램이 종료된 것은 아니다. 따라서 프레임 종료버튼이 클릭될 때 응용프로그램도 종료하기 위해선 코드를 따로 작성해줘야 한다. 다음은 프레임 종료버튼이 클릭될 때 프레임을 닫고, 응용프로그램도 종료하도록 하는 코드이다.

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

 

swing 프로그램인 main() 종료 뒤에도 프레임이 살아 있는 이유

메인 스레드란 창을 띄워주는 스레드를 말하고, 이벤트 분배 스레드란 키나 마우스 입력을 받아 이벤트를 처리할 코드를 호출하는 스레드를 말한다. main()이 종료되면 메인 스레드는 종료되나, 이벤트 분배 스레드가 살아 있어 프레임이 살아 있는 것이다.

 

6. 컨테이너와 배치 관리자

컨테이너와 배치의 개념

컨테이너마다 하나의 배치 관리자가 존재하며, 삽입되는 모든 컴포넌트의 위치와 크기를 결정하고 적절히 배치한다.

 

배치 관리자 대표 유형

  1. FlowLayout : 각각의 컴포넌트가 적당히 거리를 띄운 채로 좌상단부터 순서대로 채워진다. 한 줄이 다 차면 왼쪽 아래로 내려가 다시 채운다. 가로로 공간을 늘리면 아래 줄에 있던 컴포넌트가 위로 올라가 다시 정렬된다.
  2. BorderLayout : 최대 5개 영역(상, 하, 좌, 우, 가운데)로 나누고, 각 영역에 컴포넌트를 배치한다.
  3. GridLayout : grid(격자) 하나하나에 컴포넌트를 배치한다. 배치 순서는 FlowLayout과 동일하다.

디폴트 배치관리자

컨테이너는 생성될 때 디폴트 배치관리자가 설정된다.

AWT와 스윙 컨테이너에 따른 디폴트 배치 관리자

 

컨테이너에 새로운 배치 관리자 설정

Container.setLayout(LayoutManager lm)

//예시 : JPanel 패널에 BorderLayout 배치 관리자 설정
JPanel p = new JPanel();
p.setLayout(new BorderLayout());

 

FlowLayout

FlowLayout의 생성자

FlowLayout()
FlowLayout(int align)
FlowLayout(int align, int hGap, int vGap)
  • align : 컴포넌트의 정렬 방법. 왼쪽 정렬(FlowLayout.LEFT), 오른쪽 정렬(FlowLayout.RIGHT), 중앙 정렬(FlowLayout.CENTER)이 있으며, 중앙 정렬이 디폴트이다.
  • hGap : 좌우 컴포넌트 사이의 수평 간격. 픽셀 단위이며, 디폴트는 5이다.
  • vGap : 상하 컴포넌트 사이의 수직 간격. 픽셀 단위이며, 디폴트는 5이다.

BorderLayout

BorderLayout의 생성자

BorderLayout()
BorderLayout(int hGap, int vGap)
  • hGap : 좌우 컴포넌트 사이의 수평 간격. 픽셀 단위이며, 디폴트는 0이다.
  • vGap : 상하 컴포넌트 사이의 수직 간격. 픽셀 단위이며, 디폴트는 0이다.

add() 멤버 함수

void add(Component comp, int index) //comp 컴포넌트를 index 위치에 삽입
  • index : 컴포넌트의 위치. 동(BorderLayout.EAST), 서(BorderLayout.WEST), 남(BorderLayout.SOUTH), 북(BorderLayout.NORTH), 중앙(BorderLayout.CENTER)이 있다.

GridLayout

GridLayout()
GridLayout(int rows, int cols)
GridLayout(int rows, int cols, int hGap, int vGap)
  • rows : 그리드의 행 수. 디폴트는 1이다.
  • cols : 그리드의 열 수. 디폴트는 1이다.
  • hGap : 좌우 컴포넌트 사이의 수평 간격. 픽셀 단위이며, 디폴트는 0이다.
  • vGap : 상하 컴포넌트 사이의 수직 간격. 픽셀 단위이며, 디폴트는 0이다.

배치 관리자가 없는 컨테이너

응용 프로그램에서 컴포넌트의 절대 위치와 절대 크기를 결정한다. 컨테이너의 배치 관리자를 제거함으로써 만들 수 있다. (주의! setLayout을 호출하지 않는다고 배치 관리자가 없는 게 아니다.)

container.setLayout(null); //컨테이너의 배치 관리자 제거
component.setSize(int width, int height); //컴포넌트의 절대 크기 설정
component.setLocation(int x, int y); //컴포넌트의 절대 위치 설정. 기본 위치는 원점이다.
component.setBounds(int x, int y, int width, int height); //컴포넌트의 위치와 크기 동시 설정