09 자바 GUI 기초

목차

    자바 GUI 기초

    9.1 자바 GUI 소개

    • 콘솔-기반 : 명령 프로프트와 같이 텍스트만을 사용하여 사용자와 대화하는 것 (현재는 거의 사용되지 않음)
    • 그래픽 사용자 인터페이스 (Graphical User Interface)
    • GUI 기반의 응용 프로그램을 작성하다 보면, 클래스·객체·상속·인터페이스들이 실제로 어떻게 사용되는지 체험 가능
    • GUI는 객체들로 만들어 지고 이 객체들은 GUI 컴포넌트라고 한다.
    • 대표적인 컴포넌트가 버튼, 체크박스, 콤보박스

    AWT, 스윙, JavaFX

    : 현재 자바에서 사용할 수 있는 GUI

    • AWT(Abstract Windows Toolkit) : 운영체제가 제공하는 자원을 이용하여 컴포넌트를 생성
    • 스윙(Swing) : 순사 자바로 작성되어 있어서 어떤 플랫폼이든 일관된 화면을 보여줄 수 있다.
    자바 AWT 자바 스윙
    플랫폼 의존적 플랫폼 독립적
    무거움(중량) 가벼움(경량)
    룩앤필을 지원하지 않음 룩앤필을 지원
    컴포넌트의 개수가 적음 비교적 많은 컴포넌트를 제공
    MVC (모델 뷰 컨트롤러) 모델을 따르지 않음 MVC 모델을 따름
    • JavaFX : HTML5와 안드로이드 때문에 모바일에서도 많이 사용하지 않음. (오라클에서도 지원 중단)
    • 스윙은 AWT에서 업그레이드 된것이라 클래스 이름에 J를 붙임
    • 스윙 컴포넌트는 계층 구조로 설계되어 일부 컴포넌트는 다른 컴포넌트들을 포함한다

    스윙 패키지

    • 모두 18개의 패키지로 구성되어 있지만, 대부분의 프로그램은 일부만 사용
    • java.awt : GUI 컴포넌트를 위한 부모 클래스들을 제공, Color나 Point와 같은 유틸리티 타입의 클래스 포함
    • java.awt.event : GUI 컴포넌트로부터 발생되는 이벤트를 처리하기 위한 클래스와 인터페이스를 포함
    • javax.swing : 버튼이나 텍스트 필드, 프레임, 패널과 같은 GUI 컴포넌트들을 포함

    9.2 자바 GUI 기초

    컨테이너 컴포넌트

    • 단순 컴포넌트 : 단순한 컴포넌트
      JButton, JLabel, JCheckbox, JChoice, JList, JMenu, JTextField, JScrollbar, JTextbar, JTextArea, JCanvas 등이 속함
    • 컨테이너 컴포넌트 : 다른 컴포넌튿을을 내부에 넣을 수 있는 컴포넌트
      JFrame, JDialog, JPanel, JScrollPane 등이 여기에 속함

    최상위 컨테이너

    : 절대 다른 컨테이너 안에 포함될 수 없는 컨테이너 

    • JFrame, JDialog, JApplet 등

    GUI 프로그램을 만드는 절차

    • 제일 먼저 최상위 컨테이너를 하나 생성해야 한다
    • 그 다음 애플리케이션에 필요한 컴포넌트를 생성하여 컨테이너에 추가

    프레임을 생성하는 방법 # 1

    • JFrame의 객체를 생성
    main()이 종료되어도 윈도우는 종료되지 않음
    자바 스윙에서 JFrame 객체를 만들면 윈도우를 담당하는 새로운 스레드가 하나 생성되기 때문

    프레임을 생성하는 방법 # 2

    • JFrame을 상속한 클래스를 정의 ( 그 객체 자체가 컨테이너가 될 수 있음)
    • 필요한 변수나 메소드를 추가할 수 있음

    프레임에 버튼 추가하기

    • add() 메소드를 이용
    • setVisible(true)는 맨 마지막
    더 자세한 내용은 카테고리 스윙 프로젝트에 있음

    9.3 컨테이너 살펴보기

    JFrame 클래스

    • 프레임(Frame), 메뉴바(Menubar), 컨텐트 페인(Content Pane)으로 되어 있다.
      • 프레임(Frame)은 AWT에서 제공하는 클래스로서 윈도우 자체를 나타낸다.
      • 메뉴바(Menubar)는 메뉴를 부착할 수 있는 공간이다.
      • 컨텐트 페인(Content Pane)은 컴포넌트들을 부착하는 판유리 같은 것이다.
    • 프레임이 제공 하는 메소드 중 많이 사용되는 것들
      • add(component) : 프레임의 컨텐트 페인에 컴포넌트를 추가
      • setLocation(x,y), setSize(width,height) : 프레임의 위치와 크기를 설정
      • setIconImage(IconImage) : 윈도우의 제목줄에 표시할 아이콘을 설정
      • setTitle() : 제목줄의 제목을 변경
      • setResizable(boolean) : 사용자가 윈도우의 크기를 조절하도록 허용하는지 여부 설정
      • getContentPane() : 프레임 안의 컨텐트 페인을 가져온다.
      • setLayout() : 프레임의 배치 관리자를 설정한다.

    JPanel 클래스

    • 컴포넌트들을 부착할 수 있도록 설계된 컨테이너 중의 하나
    • 일반적으로 패널에 컴포넌트를 추가하고 그 패널을 프레임에 추가한다.
      • setQpaque() : 투명도를 조절한다.
      • setLayout() : 배치 관리자 설정
      • add(aComponent) : 패널에 컴포넌트를 추가
      • remove(aComponent) : 패널에서 컴포넌트를 제거
      • setBackground(Color c) : 패널의 배경색을 변경

    9.4 배치 관리자

    : 컨테이너 안에 존재하는 컴포넌트들의 크기와 위치를 관맇나느 객체
    (컨테이너 마다 하나씩만 존재)

    배치 관리자의 종류

    • FlowLayout : 컨테이너에 추가되는 순서대로 컴포넌트를 부착 (왼 → 오, 위 →  아래)
    • BorderLayout : 컨테이너의 영역을 동서남북, 중앙 5개 영역으로 구분하여 배치 (기본 배치 관리자)
    • GridLayout : 컨테이너의 공간을 동일한 크기의 격자로 나누고 이 격자에 배치
    • CardLayout : 컨테이너에 컴포넌트를 카드처럼 겹치게 쌓아서 배치 

    배치 관리자를 설정하기

    • 컨테이너에 배치 관리자를 설정하려면 먼저 new 연산자를 이용하여 배치 관리자 객체를 만들고 이 객체를 컨테이너의 setLayout() 메소드를 사용하여 배치 관리자로 지정한다.
    panel.setLayout(new BorderLayout()); // 패널의 배치 관리자를 설정

    FlowLayout

    • 각 컴포넌트들은 하나의 줄에서 차례로 배치되고 더 이상 공간이 없으면 다음 줄에 배치된다.
    • 생성자
      • FlowLayout()
      • FlowLayout(int align)  : 정렬 방법을 지정
      • FlowLayout(int align, int hGap, int vGap) : 간격을 지정

    BorderLayout

    • 컨테이너를 5개의 영역(상, 하, 좌, 우, 중앙)으로 구분하고 각각의 영역에 컴포넌트를 배치할 수 있는 배치 관리자.
    • 컴포넌트를 add 할때 지정해주어야 한다. ("North", "South", "East", "West", "Center")
    add(button, "South");
    • 지정해주지 않으면 기본값은 "Center"
    • 여러 개의 컴포넌트를 같은 영역에 추가하는 경우, 마지막으로 추가된 컴포넌트만 표시
    • 생성자
      • BorderLayout()
      • BorderLayout(int hGap, int vGap)

    GridLayout

    • 컨테이너 공간을 격자 모양으로 나눈 후에 각 셀에 하나씩 컴포넌트들을 배치한다.
    • 생성자
      • GridLayout() : 1행 1열
      • GridLayout(int rows, int cols) : rows 행 cols 열
      • GridLayout(int rows, int cols, int hGap, int vGap) : 간격 지정
    • 행의 개수나 열의 개수를 0으로 하면 추가하는 컴포넌트의 개수에 따라서 행이나 열의 개수가 정해진다.

    CardLayout

    • 한 번에 하나의 컴포넌트만 볼 수 있게 배치하는 관리자
    • 일반적으로 사용하는 메소드
      • next(container) : 주어진 컨테이너의 다음 카드로 이동
      • previous(container) : 주어진 컨테이너의 이전 카드로 이동
      • first(contanier) : 주어진 컨테이너의 첫 번째 카드로 이동
      • last(contanier) : 주어진 컨테이너의 마지막 카드로 이동

    절대 위치로 배치하기

    • 컨테이너 안의 컴포넌트들의 크기와 위치가 외부의 영향을 받지 않는 경우 사용
    • 특수한 효과를 주고자 하는 경우에 사용
    • setLayout(null), 컴포넌트는 위치와 크기를 지정해주어야 한다.
    http://docs.oracle.com/javase/tutorial/uiswing/layout/

    9.5 기초 컴포넌트들

    레이블

    • 사용자를 위한 정보 또는 계산의 결과를 표시하는 데 사용
    • 텍스트와 이미지를 동시에 표시할 수 있다.
    • 텍스트를 표시하는 데 사용하는 폰트의 종류, 크기, 색상 등은 변경 가능

    레이블에 이미지 표시하기

    • 스윙 컴포넌트에 이미지를 표시하려면 먼저 ImageIcon 인스턴스를 생성하여야 한다.
    • setIcon() 메소드를 사용하여 레이블에 이미지를 지정한다.
    • 레이블에 이미지가 설정되면 레이블의 텍스트는 오른쪽에 표시된다.

    텍스트 필드

    • JTextField 클래스로서 제공
    • 입력이 가능한 한 줄의 텍스트 상자
    • JPasswordField : 사용자가 입력하는 문자를 보여주지 않는다.
    • JFormattedTextField : 사용자가 입력할 수 있는 문자 집합을 제한
    • requestFocus() : 키보드 포커스
    • 텍스트 필드에 입력후 enter키 입력시 이벤트 발생

    버튼

    • 사용자가 클릭했을 경우, 이벤트를 발생하여 원하는 동작을 하게 하는데 이용
    • 버튼 안의 텍스트, 폰트, 버튼의 전경색, 배경색, 버튼의 상태 변경 가능
    • JButton : 가장 일반적인 버튼
    • JCheckBox : 체크박스 버튼
    • JRadioButton : 라디오 버튼
    • JToggleButton : 2가지 상태를 가지고 토글이 가능한 버튼

    Summary

    • GUI(Graphic User Interface)는 그래픽을 이용하여 사용자 인터페이스를 구성하는 기술이다.
    • 자바에서 GUI를 위한 패키지에는 AWT, 스윙(SWING) 등이 있다. 스윙은 경량 컴포넌트들로 구성된 GUI로서 운영체제가 다르더라도 동일한 모양을 지원한다.
    • AWT는 java.awt 패키지로 제공되고 스윙은 javax.swing 패키지로 제공된다.
    • 컨테이너는 안에 컴포넌트들을 저장할 수 있는 특수한 컴포넌트이다.
    • JFrame은 최상위 컨테이너로서 윈도우 기능을 제공한다. 내부에 있는 컨텐트 페인을 이용하여서 컴포넌트들을 부착할 수 있다.
    • 컨테이너는 하나의 배치 관리자를 가질 수 있다. 배치 관리자는 컴포넌트들의 위치와 크기를 제어한다.
    • FlowLayout은 컨테이너에 추가되는 순서대로 컴포넌트를 부착한다. 위쪽에서 아래쪽으로, 왼쪽에서 오른쪽으로 배치한다. 패널의 기본 배치 관리자이다.
    • GridLayout은 컨테이너의 공간을 동일한 크기의 격자로 나누고 이 격자에 컴포넌트를 배치한다.
    • 스윙 컴포넌트에 이미지를 표시하려면 먼저 ImageIcon 인스턴스를 생성하여야 한다. 이후에 setIcon() 메소드를 사용하여 컴포넌트에 이미지를 지정한다.
    • 텍스트 필드 중에서 JPasswordField를 사용하면 사용자가 입력하는 텍스트가 보이지 않는다.

    Java 목차로 돌아가기