Java

JAVA - Swing/AWT/GUI

해변 2022. 10. 5. 17:06
GUI란?
Graphical user interface
그래픽 사용자 인터페이스

 

JAVA에서도 GUI를?

Python의 tkinter 라이브러리와 같이 JAVA 또한 이러한 기능을 지원한다

기본적으로 자바 초창기에 배포된 AWT라는 패키지가 있지만 최근에는 사용하지 않는다

우리는 AWT의 모든 기능과 추가적으로 화려하고 풍부한 고급 컴포넌트를 지원하는 Swing 패키지를 다뤄볼 예정이다.

 

Swing 패키지

스윙 컴포넌트는 AWT와 달리 운영체제의 도움을 받지 않고 직접 그리기에 운영체제에 부담을 주지 않는다

 

스윙 컴포넌트의 종류는

이와 같이 다양한 종류가 있다.

 

스윙을 응용한 프로그램은 위의 컴포넌트를 이용하여 레고 블록을 조립하듯이 작성하는데

먼저 알고 넘어가야하는 개념들을 살펴보자

 

컨테이너
  • 다른 컴포넌트를 포함할 수 있는 GUI 컴포넌트
  • 그림을 그리기 전 도화지와 같은 개념
  • java.awt.Container를 상속받는다
컴포넌트
  • 컨테이너에 포함되어야만 화면에 출력될 수 있는 GUI "객체"
  • 다른 컴포넌트를 포함할 수 없는 순수 컴포넌트이다
  • 모든 GUI 컴포넌트가 상속받는 클래스 : java.awt.Component
  • 스윙 컴포넌트가 상속받는 클래스 : java.swing.JComponent
최상위 컨테이너
  • 다른 컨테이너에 포함되지 않고도 화면에 출력되며 독립적으로 존재 가능한 컨테이너
    • 스스로 화면에 자신을 출력하는 컨테이너 : JFrame, JDialog, JApplet

 

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

1. 스윙 프레임 만들기

2. main() 메소드 작성

    - 스윙 응용프로그램에서는 main의 기능을 최소화 시키는 것이 바람직하다(스윙 프레임을 생성하는 정도의 코드)

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

 

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

 

스윙 프레임은 모든 스윙 컴포넌트를 담는 최상위 컨테이너

JFrame을 상속받아 구현하며 컴포넌트들은 화면에 보이려면 스윙 프레임에 부착되어야 한다.

만일 프레임을 닫을 경우 프레임에 부착된 모든 컴포넌트가 보이지 않게 된다

 

스윙 프레임 기본 구성

프레임 - 스윙 프로그램의 기본 틀

메뉴바 - 메뉴들이 부착되는 공간

컨탠트팬 - GUI 컴포넌트들이 부착되는 공간

프레임에 컴포넌트 붙이기

타이틀을 설정할땐 super() 혹은 setTitle()을 이용한다

 

컨탠트팬에 컴포넌트 달기

컨탠트팬은 스윙 컴포넌트들이 부착되는 공간이다

Container contentPane = getContentPane(); //프레임의 컨텐트팬을 알아냄
JButton button = new JButton("Click") // 컨탠트팬에 버튼 부탁

class MyPanel extends Panel{
	//JPanel을 상속받은 패널 구현
}
//frame의 컨텐트 팬을 MyPanel 객체로 변경
frame.setContentPane(new MyPanel());

와 같은 형식으로 작업이 이루어진다

 

간단한 예제를 통해 자세히 알아보자

 

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class test extends JFrame{
    public test(){
        setTitle("ContentPane과 JFrame 예제"); //타이틀 달기
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //창을 닫으면 프로세스 종료 만약 안할시 GUI를 닫아도 계속 프로세스가 가동중
        Container contentPane = getContentPane(); //컨탠트팬 알아내기
        contentPane.setBackground(Color.gray); //배경 회색
        contentPane.setLayout(new FlowLayout()); //컨탠트팬에 FlowLayout 배치 관리자 달기
        
        contentPane.add(new JButton("OK")); //OK버튼
        contentPane.add(new JButton("Cancel"));  //Cancel버튼
        contentPane.add(new JButton("Ignore")); //Ignore버튼
        
        setSize(300, 150); //프레임 크기 300x150
        setVisible(true); //화면에 출력 
    }

    public static void main(String[] args) {
        new test();
    }
}

 

배치관리자
  • 컨테이너마다 하나의 배치관리자가 존재한다
  • 이는 컨테이너에 부착되는 컴포넌트의 위치와 크기를 결정한다
  • 컨테이너의 크기가 변경되면 컴포넌트의 위치와 크기를 재결정한다

 

종류

  • FlowLayout() : 컴포넌트가 삽입되는 순서대로 왼쪽->오른쪽으로 배치하며 배치할 공간이 없으면 아래로 내려와 반복한다
  • BorderLayout() : 컨테이너 공간을 동(EAST), 서(WEST), 남(SOUTH), 북(NORTH), 중앙(CENTER)의 5개 영역으로 나눈다.
  • GridLayout() : 컨테이너를 프로그램에서 설정한 동일한 크기의 2차원 격자로 나누며 삽입순서대로 좌->우, 위->아래로 배치한다
  • CardLayout() : 컨테이너의 공간에 카드를 쌓아 놓은 듯이 컴포넌트를 포개어 배치한다
  • Null() : 레이아웃을 쓰지 않고 각 컴포넌트마다 수동으로 위치 설정해줄 때 사용한다