본문 바로가기
java

자바 8장 자바 GUI Swing 기초

by Salt-Fn 2020. 12. 1.

자바의 GUI

GUI 응용프로그램이란?


GUI(Graphical User Interface)란 이미지 혹은 그래픽으로 그린 버튼, 메뉴 등을 가진 화면에 마우스와 같은 편리한 입력 도구를 이용하여 사용자가 편리하게 입출력할 수 있도록 만든 사용자 interface다.

 

AWT와 Swing 패키지

AWT

AWT(Abstract Windowing Toolkit)는 자바가 처음 나왔을 때 함께 배포된 GUI 패키지이다. 운영체제의 도움을 받아 GUI를 그리기 때문에 속도는 빠르나 운영체제에 부담을 주므로 AWT 컴포넌트는 중량 컴포넌트(heavy weight component)라고 불린다. 최근에는 거의 사용하지 않는다.

 

Swing

스윙(Swing)은 AWT와는 달리 순수하게 자바 언어로 작성되었다. 운영체제의 도움을 받지 않기 때문에 스윙 컴포넌트들은 경량 컴포넌트(light weight component)라고 불린다. 스윙은 AWT보다 화려하고 다양한 많은 GUI 컴포넌트를 제공하며, AWT와 구분하기 위해 컴포넌트 이름이 모드 대문자 J로 시작한다. Swing을 사용하기 위해 AWT패키지가 필요하다.

 

GUI 패키지 계층 구조

모든 GUI 컴포넌트들은 Component 클래스를 반드시 상속받는다. 그 중에서 Swing 컴포넌트의 클래스 명은 모두 J로 시작하며, JComponent를 상속받는 것들과 JApplet, JFrame, JDialog들이다. Font, Dimension, Color, Graphics 클래스는 GUI컴포넌트가 아니지만, 문자의 폰트 설정, 색, 도형 그리기 등 그래픽 작업 시 반드시 필요하다.

 

컨테이너와 컴포넌트

컨테이너란 컴포넌트를 포함할 수 있는 특별한 GUI 컴포넌트이다. 컨테이너가 되기 위해서는 java.awt.Container 클래스를 상속 받아야 한다. Container클래스는 java.awt.Component를 상속받기 때문에 컨테이너 또한 컴포넌트이다.

그러므로 컨테이너는 다른 컨테이너에 컴포넌트로 포함될 수 있다.

Frame, Panel, Applet, Dialog, Window // AWT 컨테이너

JFrame, JPanel, JApplet, JDialog, JWindow // Swing 컨테이너

 

컴포넌트란 컨테이너와 달리 다른 컴포넌트를 포함할 수 없으며, 임의의 컨테이너에 포함되어야 비로소 화면에 출력될 수 있는 GUI 객체이다. AWT나 Swing의 모든 컴포넌트들은 java.awt.Component를 상속받기 때문에, Component 클래스는 모든 컴포넌트들의 공통적인 요소들을 구현하고 있다. 또한 순수Swing 컴포넌트들은 모두 javax.swing.JComponent를 상속받기 때문에 JComponent는 Swing 컴포넌트들의 공통적인 기능을 구현하고 있다.

 

최상위 컨테이너

컨테이너 중에서 다른 컨테이너에 속하지 않고도 독립적으로 존재하여 출력될 수 있는 컨테이너를 최상위 컨테이너

(Top Level Container)라고 한다. JFrame, JDialog, JApplet등이 이에 속한다. 그러나 이들을 제외한 JPanel, JScrollPane 등 나머지 컨테이너와 컴포넌트들은 다른 컨테이너에 부착될 때만 화면에 출력된다.

 

스윙 GUI 프로그램 만들기

1. 스윙 프레임 작성

2. main() 메소드 작성

3. 프레임에 스윙 컴포넌트 붙이기

 

스윙 컴포넌트들을 사용하기 위해서는 스윙 패키지의 경로명을 import해야 한다.

import java.awt.*; // 그래픽 처리를 위한 클래스들의 경로명

import java.awt.event.*; // AWT 이벤트 사용을 위한 경로명

import javax.swing.*; // Swing 컴포넌트 클래스들의 경로명

import javax.swing.event.*; // 스윙 이벤트를 위한 경로명

 

Swing 응용 플로그램의 프레임은 JFrame을 상속 받아 만든다.

public class MYFrame extends JFrame {

......................................................................

}

ex)

프레임에 컴포넌트 붙이기

타이틀 달기

프레임에 타이틀을 달기 위해서는 super()를 이용하여 JFrame 의 생성자를 호출하거나, setTitle() 메소드를 이용한다.

 

Swing에서는 컨텐트 팬에만 컴포넌트를 부착할 수 있다. JFrame 객체가 처음 생길 때 컨테트팬은 자동으로 생성된다.

그러므로 프레임에 붙어 있는 컨텐트팬을 알아내기 위해서는, JFrame 클래스의 getContentPane() 메소드를 호출한다.

컨탠트팬은 Container 타입니다.

 

public class MyFrame extends JFrame {

   public My Frame() {

      ...

      Container contentPane = getContentPane(); // 프레임의 컨텐트팬을 알아낸다.

                                                      // new는 붙이지 않는다. 새로 만드는게 아니라 기존에 있는걸 사용하기 때문.

   }

}

컨텐트팬은 컨테이너이기 때문에 add() 메소드를 이용하여 컴포넌트를 부착하면 된다.

JButton button=new JButton("click") // 버튼 컴포넌트 생성

contentPane.add(button);

 

스윙 응용프로그램의 종료

자바에서 프로그램을 종료하기 위해서는 어떤 상황에서나 

System.exit(0)을 사용한다.

 

Swing에서는 프레임 종료 버튼(X)의 클릭은 프레임 윈도우를 닫는 버튼이지 프로그램을 종료시키는 버튼은 아니다. 그러므로 프레임 윈도우가 닫힐 때 Swing 프로그램도 종료 시키고자 한다면

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

코드를 삽입하여야 한다.

 

컨테이너와 배치

컨테이너에 부착되는 컴포넌트의 위치와 크기는 컨테이너 내부에 있는 배치관리자(Layout Manger)에 의해 결정된다.

AWT나 Swing의 컨테이너는 다음과 같은 특징을 가진다.

 

- 컨테이너는 하나의 배치관리자를 가진다.

- 컨테이너에 컴포넌트가 부착되는 시점에, 배치관리자는 컴포넌트의 위치와 크기를 결정한다.

- 컨테이너의 크기가 변경되면 배치관리자는 컨테이너의 모든 컴포넌트들의 위치와 크기를 재조정한다.

 

배치관리자는 java.awt 패키지의 클래스들을 이용하므로

import java.awt.*;  을 import해야 한다.

 

대표적인 4가지 배치 관리자

- FlowLayout

 컨테이너 내부에 삽입되는 순서대로 왼쪽에서 오른쪽으로 컴포넌트를 배치하며, 오른쪽에 더 이상 공간이 없으면 아래로 내려와 다시 왼쪽부터 삽입한다.

 

- BorderLayout

 컨테이너의 공간을 동, 서, 남, 북 ,중앙의 5개의 영역으로 나누고, 응용프로그램에서 지정한 영역에 컴포넌트를 배치한다.

 

- GridLayout

 컨테이너의 공간을 응용프로그램에서 설정한 동일한 크기의 2차원 그리드로 나누고, 들어오는 순서대로 왼쪽에서 오른쪽, 다시 위에서 아래로 배치한다. 컴포넌트의 크기는 셀의 크기와 일치시킨다.

 

- CardLayout

 컨테이너의 공간에 카드를 쌓아 놓은 듯이 컴포넌트들을 포개어 배치한다. 컴포넌트의 크기는 컨테이너의 크기와 일치시킨다.

 

컨테이너의 디폴트 배치관리자

컨테이너가 생성될 때 자동으로 디폴트 배치관리자가 생성된다.

AWT와 Swing 컨테이너 디폴트 배치관리자
Window, JWindow BorderLayout
Frame, JFrame BorderLayout
Dialog, JDialog BorderLayout
Panel, JPanel FlowLayout
Applet, JApplet FlowLayout

Container 클래스의 setLayout() 메소드를 호출하면, 컨테이너에 새로운 배치관리자를 설정할 수 있다.

ex)

JPanel p = new JPanel();

p.setLayout(new BorderLayout());

 

Container c = frane.getContentPane();

c.setLayout(new FlowLayout()); 

 

FlowLayout

BorderLayout

GridLayout

배치관리자 없는 컨테이너

배치관리자 없는 컨테이너가 필요한 경우

 

- 컴포넌트의 크기나 위치를 개발자 임의로 결정하고자 하는 경우

- 게임 프로그램과 같이 시간이나 마우스/키보드의 입력에 따라 컴포넌트들의 위치와 크기가 수시로 변하는 경우

- 여러 컴포넌트들이 서로 겹치는 효과를 연출하고자 하는 경우

 

Container의 setLayout() 메소드로 컨테이너의 배치관리자 제거할 수 있다.

JPanel p = new JPanel();

p.setLayout(null); // 배치 관리자 삭제

 

그 결과 패널 p에는 배치관리자가 없으므로, 패널 p에 컴포넌트를 추개하도 컴포넌트의 위치나 크기를 조절하는 어떤 배치도 일어나지 않는다. 배치관리자가 없는 컨테이너에 컴포넌트를 삽입할 때는 응용프로그램에서 컴포넌트의 절대 위치와 크기를 설정하야 한다.

 

void setSize(int width, int height) // 컴포넌트를 width x height 크기로 설정

void setLocation(int x, int y) // 컴포넌트의 왼쪽 상단 모서리 좌표를 (x,y)로 설정

void setBounds(int x, int y, int width, int height) // 크기와 위치 동시 설정

 

배치 관리자 없는 컨테이너의 예

'java' 카테고리의 다른 글

자바 5장 상속  (0) 2020.11.28
자바 4장 클래스와 객체  (0) 2020.11.27