![[J06] Java_자바 GUI 기초, AWT와 스윙 (1)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwggsy%2Fbtrepuz2QrS%2FRMKEKqFiUBqdTOUSpNLVkk%2Fimg.png)
[J06] Java_자바 GUI 기초, AWT와 스윙 (1)Java/Java 기본 개념2021. 9. 18. 18:00
목차
GUI - Graphical User Interface
- 이미지 혹은 그래픽을 이용하여 메뉴 등을 포함하는 화면을 구성하고, 키보드 외 마우스 등의 편리한 입력 도구를 이용하여 사용자가 입력하기 편하도록 만들어진 사용자 인터페이스이다.
AWT와 Swing 패키지
- 자바 언어는 GUI 응용프로그램을 쉽게 작성할 수 있도록 다양한 GUI 컴포넌트를 제공한다.
- GUI 컴포넌트는 AWT 컴포넌트와 Swing 컴포넌트로 구분된다.
- 이들은 각 java.awt 패키지와 java.swing 패키지를 통해 공급된다.
AWT - Abstract Windowing Toolkit
- 중량 컴포넌트로 불리며 운영체제의 도움을 받아 화면에 출력됨
- 운영체제의 자원을 많이 소모하여 운영체제에 많은 부담을 줌
- 운영체제에 따라 다른 모양으로 그려질 수 있음
Swing
- AWT와 달리 순수 자바 언어로 작성됨
- 운영 체제의 도움을 받지 않아 경량 컴포넌트라고 불림
- 운영체제에 상관없이 항상 동일하게 작동하고 그려짐
- 스윙 컴포넌트의 이름은 AWT와 구분하기 위해 모두 대문자 J로 시작함
GUI 패키지 계층 구조
- 모든 GUI 컴포넌트들은 Component 클래스를 반드시 상속받았으며 스윙 컴포넌트의 클래스 명은 모두 J로 시작한다.
컨테이너와 컴포넌트
- GUI 컴포넌트들은 다른 컴포넌트를 포함할 수 있는지 여부에 따라 순수 컴포넌트와 컨테이너로 분류된다.
- 컨테이너
- 다른 GUI 컴포넌트를 포함할 수 있는 컴포넌트
- 컨테이너는 컴포넌트이면서 동시에 컨테이너
- 컨테이너가 되기 위해선 java.awt.Container 클래스를 상속받아야만 함
- 다른 컴포넌트로 포함될 수 있음
- 컴포넌트
- 다른 컴포넌트를 포함할 수 없음
- 컨테이너에 포함되어야 화면에 출력될 수 있음
- 컨테이너와 컴포넌트의 관계
- 최상위 컨테이너 위에 컨테이너와 컴포넌트들이 마치 레고를 쌓는 것처럼 컨테이너와 컴포넌트의 계층 구조로 구성됨
- 컨테이너에 부착된 컴포넌트들을 자식 컴포넌트라 부름
스윙 패키지 사용을 위한 import 문
import javax.swing.*;
⚠️ 대부분의 스윙 응용프로그램은 이벤트 처리, 이미지나 도형을 그리는 부분을 필수적으로 동반하므로 다음과 같은 import문이 필요한 경우가 많다.
import java.awt.*; // 폰트 등 그래픽 처리를 위한 클래스들의 경로명
import java.awt.event.*; // 이벤트 처리에 필요한 기본 클래스들의 경로명
import javax.swing.*; // 스윙 컴포넌트 클래스들의 경로명
import javax.swing.event.*; // 스윙 이벤트 처리에 필요한 클래스들의 경로명
스윙 이벤트와 컨텐트팬
- 스윙 프레임이 출력될 때 스윙 프레임 내에 부착된 모든 컴포넌트들이 화면에 출력된다.
- 컴포넌트들은 스윙 프레임 없이 독립적으로 화면에 출력될 수 없다.
- 스윙 프레임이 닫히면 프레임 내의 모든 컴포넌트들도 프레임과 함께 화면에서 사라진다.
- 스윙에서 프레임 역할 수행 - JFrame
- JFrame 객체는 Frame, 메뉴바, 컨텐트팬의 3공간으로 구성됨.
- Frame(java.awt.Frame) - JFrame 속성 가짐
- 메뉴바(Menu Bar) - 메뉴들을 부착하는 공간
- 컨텐트팬(Content Pane) - 메뉴 제외 모든 GUI 컴포넌트들을 부착하는 공간
프레임 만들기, JFrame 상속
- JFrame을 상속받은 MyFrame 클래스
public class MyFrame extends JFrame { ... }
- 프레임 크기와 타이틀을 클래스 생성자에서 설정
setTitle("300x300 스윙 프레임 만들기"); // 프레임 타이틀 설정 setSize(300, 300); // 폭 300, 높이 300 크기로 프레임 크기 설정 setVisible(true); // 프레임이 출력되도록 지시
프레임에 컴포넌트 붙이기
- 타이틀 달기
- super() - JFrame의 생성자 호출
- setTitle() 메소드 이용
super("타이틀문자열"); setTitle("타이틀문자열");
- 컨텐트팬에 컴포넌트 달기
- 스윙에서는 컨텐트팬에서만 컴포넌트를 부착할 수 있음
- getContentPane() - 현재 프레임에 붙어 있는 컨텐트 알아내기 (Container 타입)
Container contentpane = getContentPane();
- 컨텐트팬에 컴포넌트 붙이기-add()
JButton button = new JButton("Click"); //버튼 컴포넌트 생성 contentPane.add(button); //컨텐트팬에 버튼 부착
- 컨텐트팬의 변경
- setContentPane() - 프레임에 부착된 컨텐트팬을 제거하고 새로운 컨텐트팬을 붙일 수 있다.
- 스윙 응용프로그램의 종료
- System.exit(0); - 자바 프로그램 종료
- 오른쪽 상단 X 버튼은 프레임 윈도우를 닫는 버튼이지 프로그램을 종료시키는 버튼은 아님
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //프레임이 닫힐 때 프로그램도 함께 종료
- 이벤트 처리 스레드 - JFrame 객체가 생성되면 main 스레드 외에, 입력되는 키와 마우스의 움직임을 컴포넌트에게 이벤트로 전달하는 이벤트 처리 스레드가 자동으로 추가 생성된다.
컨테이너와 배치
컨테이너와 배치 개념
- 컨테이너마다 배치관리자가 하나씩 있다.(삭제할 수도 있다)
- 배치관리자는 컨테이너에 컴포넌트가 부착되는 시점에 컴포넌트의 위치와 크기를 결정
- 컨테이너 크기가 변경되면 배치관리자는 컨테이너 내부의 모든 컴포넌트들의 위치와 크기를 재조정
배치관리자의 종류
- 배치관리자는 java.awt 패키지에 존재하는 클래스이므로 다음 import문 필요
import java.awt.*;
- FlowLayout
- 순서대로 왼쪽에서 오른쪽으로 컴포넌트르 배치하며
- 오른쪽에 더 이상 배치할 공간이 없으면 아래로 내려와서 다시 왼쪽에서 오른쪽으로 배치
- 컴포넌트의 크기는 화면에 출력될 수 있는 적당한 크기로 설정
- BorderLayout
- 컨테이너를 동서남북, 가운데로 5개 영역으로 나누고 응용프로그램에서 지정한 영역에 컴포넌트를 배치
- 5개 영역중 반드시 하나를 지정, 미지정 시 중앙에 배치
- 컴포넌트의 크기는 영역의 크기에 맞추어 설정
- GridLayout
- 컨테이너 공간을 응용프로그램에서 설정한 동일한 크기의 2차원 격자로 나눔
- 컴포넌트가 삽입되는 순서대로 좌에서 우로, 다시 위에서 아래로 배치
- 컴포넌트의 크기는 셀의 크기와 동일하게 설정
- CardLayout
- 컴포넌트를 컨테이너 공간에 포개어 배치
- 컴포넌트의 크기는 컨테이너의 크기와 동일하게 설정
컨테이너의 디폴트 배치관리자
- 컨테이너가 생성될 때 자동으로 디폴트 배치관리자가 생성됨
AWT와 스윙 컨테이너 디폴트 배치관리자
AWT와 스윙 컨테이너 | 디폴트 배치관리자 |
Window, Jwindow | BorderLayout |
Frame, JFrame | BorderLayout |
Dialog, JDialog | BorderLayout |
Panel, JPanel | FlowLayout |
Applet, JApplet | FlowLayout |
컨테이너에 새로운 배치관리자 설정, setLayout() 메소드
- 컨테이너 배치관리자를 마음대로 설정할 수 있다.
Container.setLayout(LayoutManager lm); // lm을 새로운 배치관리자로 설정 JPanel p = new JPanel(); p.setLayout(new BorderLayout()); // 패널에 BorderLayout 배치관리자 설정 Container contentPane = frame.getContentPane(); // 프레임의 컨텐트팬 contentPane.setLayoutt(new FlowLayout()); // FlowLayout 배치관리자 설정
728x90
반응형
'Java > Java 기본 개념' 카테고리의 다른 글
[JAVA] this와 this()의 차이 (0) | 2021.10.18 |
---|---|
[J05] Java_입출력 스트림과 파일 입출력 (0) | 2021.09.16 |
[J04] Java_모듈과 패키지 (0) | 2021.09.10 |
[J03] Java_상속 (0) | 2021.09.03 |
[J02] Java_클래스와 객체 (0) | 2021.08.27 |
@kdj :: Childev'note
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!